2017-12-20 1 views
2

Also mache ich einen Generator aus einer Liste, möchte aber als nächstes darauf zurückgreifen, der nur das nächste Element in der Liste zurückgeben soll, aber es gibt das gleiche Objekt zurück, dh das ganze Stück Code wird erneut ausgeführt, anstatt nur den Yield-Teil zurückzugeben. Das folgende Beispiel zeigt das erwartete Verhalten, wenn Sie durch die Liste Looping, aber dann die nächsten Renditen 1 zweimal, während ich den zweiten Aufruf des nächsten möchte zurückkehren 2.Fragen zum "yield from" und "next" Verhalten

class demo: 
    @property 
    def mygen(self): 
     a = [1,2,3,4,5] 
     b = [6,7,8,9,10] 
     yield from a 
     yield from b 

if __name__=='__main__': 
    demo1 = demo() 
    print([_ for _ in demo1.mygen]) 
    demo2 = demo() 
    print(next(demo2.mygen)) 
    print(next(demo2.mygen)) 

Es gibt einen Grund, warum ich eine Liste am Drehen in ein Generator, wie es die Antwort von einem API-Aufruf ist und möchte das nächste Element in der Liste dynamisch zurückgeben und den API-Aufruf ausführen, wenn es an das Ende der Liste kommt.

Antwort

7

Jeder Aufruf der Eigenschaft erstellt einen neuen Generator. Sie sollten den von der Eigenschaft zurückgegebenen Generator in einer Variablen speichern. Dann können Sie next mehrmals anrufen. Ändern

print(next(demo2.mygen)) 
print(next(demo2.mygen)) # calls next on a fresh generator 

zu

gen = demo2.mygen 
print(next(gen)) 
print(next(gen)) # calls next on the SAME generator 

Wie andere haben darauf hingewiesen, sollte dieses Verhalten haben Sie überdenken und dass das eine Eigenschaft in erster Linie.

Sehen
demo2.mygen() 

macht es viel mehr auf der Hand, dass es einige dynamische Sachen vor sich geht, während

demo2.mygen 

den Eindruck einer eher statischen Attribut gibt jedes Mal das gleiche Objekt zu erzeugen. Sie können etwas mehr Ausarbeitung auf diesem here finden.

+0

Deshalb sollte es keine Eigenschaft sein, denn wenn es eine Funktion ist, lässt es dich denken, was es macht. – warvariuc

+1

@warvariuc Absolut, editiert meine Antwort, um dies zu zeigen. – schwobaseggl