2009-12-21 4 views
6

Kann ich einem Python-Generator eine Elementvariable/-methode hinzufügen?Fügen Sie einem Python-Generator eine Elementvariable/Methode hinzu?

Ich möchte etwas in den folgenden Zeilen, so dass ich kann "Peek" an Membervariable j:

def foo(): 
    for i in range(10): 
     self.j = 10 - i 
     yield i 

gen = foo() 
for k in gen: 
    print gen.j 
    print k 

Ja, ich weiß, dass ich i und j jedes Mal zurückgeben kann. Aber ich will das nicht tun. Ich möchte einen lokalen Generator sehen.

+0

Es scheint, dass du das Generatormuster wirklich zu weit dehnst. Warum nicht einen Ansatz verwenden, der besser zu Ihrem Anwendungsfall passt, anstatt zu versuchen, Ihr Problem in das enge Generatorkonzept zu integrieren? – nikow

+0

+1 für eine gute Frage, für mich gibt es eine Menge Vorteile beim Zugriff auf Variablen, die sich im Laufe der Iteration durch den Generator ändern können. –

+0

Nach Diskussion, Blogging ich über meine Lösung hier: http://blog.metaoptimize.com/2009/12/22/why-cant-you-pickle-generators-in-python-workaround-pattern-for-saving-training -state/ –

Antwort

9

Sie könnten ein Objekt erstellen und manipulieren die __iter__ Schnittstelle:

class Foo(object): 
    def __init__(self): 
     self.j = None 
    def __iter__(self): 
     for i in range(10): 
      self.j = 10 - i 
      yield i 

my_generator = Foo() 

for k in my_generator: 
    print 'j is',my_generator.j 
    print 'k is',k 

Drucke:

j is 10 
k is 0 
j is 9 
k is 1 
j is 8 
k is 2 
j is 7 
k is 3 
j is 6 
k is 4 
j is 5 
k is 5 
j is 4 
k is 6 
j is 3 
k is 7 
j is 2 
k is 8 
j is 1 
k is 9 
2

Ich denke, es ist hässlich, aber es sollte tun, was Sie wollen. Ich würde eher zurückkehren i und j jedes Mal, wenn :-)

class Foo(object): 
    def foo(self): 
     for i in range(10): 
      self.j = 10 - i 
      yield i 

genKlass = Foo() 
gen = genKlass.foo() 
for k in gen: 
    print genKlass.j 
    print k 
+0

Persönlich würde ich auch lieber i und j zurückgeben, wahrscheinlich in einem Tupel, anstatt Dinge zusammen zu hacken. – Dustin

+0

Ich denke, es gibt weitere Vorteile für das, was Joseph anfordert, in Szenarien, in denen ein Generator manipuliert werden kann, während er gefüllt wird, wie etwa eine Warteschlange von Netzwerkaufgaben. in diesem Fall ist je nach Tupel keine brauchbare Alternative. –

Verwandte Themen