2016-06-29 5 views
5

Aus der Dokumentation relativ zu async for Syntax in Python 3.5, ich habe festgestellt, dass es eingeführt wurde, um über einen erwarteten Iterator zu iterieren.Semantisches Äquivalent von async für

Es ist etwas, was ich in der semantischen Äquivalent nicht bekommen, die der Beschreibung obwohl folgen:

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 

Was ist die Leitung iter = type(iter).__aiter__(iter) tun? Warum ist es notwendig?

+0

Verwandte: [iterable vs Iterator] (https://wiki.python.org/moin/Iterator). – Vincent

Antwort

3

Magische Methoden in Python, z.B. __add__, sind immerlooked up on the class. Zum Beispiel wird len(foo) tatsächlich Anruf Auflösung zu type(foo).__len__(foo). Dies bedeutet, dass es nie eine foo.__len__ verwenden, wenn __len__ auf foo definiert ist. [1]

Da __aiter__ eine magische Methode ist, wird sie daher immer als type(foo).__aiter__(foo) angesehen.


Beispiel für die Suche:

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`