2009-12-21 13 views
6

Posso aggiungere una variabile membro/metodo a un generatore Python?Aggiungi una variabile membro/metodo a un generatore Python?

Voglio qualcosa lungo le seguenti linee, in modo che posso "sbirciatina" alla variabile membro 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 

Sì, lo so che posso tornare i e j ogni volta. Ma non voglio farlo. Voglio dare un'occhiata a un locale all'interno del generatore.

+0

Sembra che stai davvero allungando il modello del generatore troppo lontano. Perché non utilizzare un approccio che si adatta meglio al caso d'uso, invece di cercare di adattare il problema al concetto di generatore stretto? – nikow

+0

+1 per una buona domanda, per me ci sono molti vantaggi nell'accedere a variabili che possono cambiare nel corso del iterare attraverso il generatore. –

+0

In seguito alla discussione, ho scritto la mia soluzione qui: http://blog.metaoptimize.com/2009/12/22/why-cant-you-pickle-generators-in-python-workaround-pattern-for-saving-training -state/ –

risposta

9

è possibile creare un oggetto e manipolare l'interfaccia __iter__:

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 

Stampe:

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

Penso che sia brutto, ma dovrebbe fare quello che vuoi. Preferirei tornare i e j ogni volta, anche se :-)

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

Personalmente anch'io preferirei semplicemente restituire io e j, probabilmente in una tupla, piuttosto che mettere insieme le cose per lavorare. – Dustin

+0

Penso che ci siano maggiori vantaggi su ciò che Joseph sta richiedendo, in scenari in cui un generatore può essere manipolato mentre viene popolato, come una coda di attività di rete. in tal caso, a seconda della tupla non è una valida alternativa. –