Semántico equivalente de async para

De los documentos relativos a async for syntax en Python 3.5, deduje que se introdujo para iterar sobre un iterador esperable.

Hay algo que no obtengo en el equivalente semántico que sigue la descripción:

 iter = (ITER) iter = type(iter).__aiter__(iter) running = True while running: try: TARGET = await type(iter).__anext__(iter) except StopAsyncIteration: running = False else: BLOCK else: BLOCK2 

¿Qué está haciendo la línea iter = type(iter).__aiter__(iter) ? ¿Por qué es necesario?

Los métodos mágicos en python, por ejemplo, __add__ , siempre se __add__ en la clase . Por ejemplo, len(foo) llamará realmente resolver a type(foo).__len__(foo) . Esto significa que nunca usará foo.__len__ si __len__ está definido en foo . [1]

Dado que __aiter__ es un método mágico, por lo tanto, siempre se busca como type(foo).__aiter__(foo) .


Ejemplo para búsqueda:

 class Thingy(object): def __len__(self): return 10 lengthy_thingy = Thingy() lengthy_thingy.__len__ = lambda self: 20 print(len(lengthy_thingy)) # gives `10` print(lengthy_thingy.__len__(lengthy_thingy)) # gives `20` instead print(type(lengthy_thingy).__len__(lengthy_thingy)) # gives `10` as for using `len`