2009-12-21 14 views
6

¿Puedo agregar una variable/método miembro a un generador de Python?¿Agregar una variable/método miembro a un generador de Python?

quiero algo a lo largo de las siguientes líneas, de manera que pueda "vistazo" a la variable miembro 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í, sé que I y J puedo volver cada vez. Pero no quiero hacer eso. Quiero echar un vistazo a un local dentro del generador.

+0

parece que realmente estás estirando el patrón del generador demasiado lejos. ¿Por qué no utilizar un enfoque que se adapte mejor a su caso de uso en lugar de tratar de adaptar su problema al concepto de generador estrecho? – nikow

+0

+1 para una buena pregunta, para mí hay muchas ventajas de acceder a las variables que pueden cambiar durante el curso de la iteración a través del generador. –

+0

Después de la discusión, escribí sobre mi solución aquí: http://blog.metaoptimize.com/2009/12/22/why-cant-you-pickle-generators-in-python-workaround-pattern-for-saving-training -state/ –

Respuesta

9

Se puede crear un objeto y manipular la interfaz __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 

Lienzo:

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

Creo que es feo, pero debería hacer lo que quiera. Prefiero la vuelta I y J cada vez, aunque :-)

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, yo también preferiría simplemente devolver i yj, probablemente en una tupla, en lugar de hackear cosas para trabajar. – Dustin

+0

Creo que hay mayores ventajas para lo que Joseph está solicitando, en escenarios donde un generador puede ser manipulado mientras se está llenando, como una cola de tareas de red. en ese caso, dependiendo de la tupla no es una alternativa viable. –

Cuestiones relacionadas