2009-12-21 10 views
6

Czy mogę dodać zmienną składową/metodę do generatora Pythona?Dodaj zmienną składową/metodę do generatora Pythona?

chcę coś wzdłuż następujących linii, tak że mogę "peek" w zmiennej członkiem 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 

Tak, wiem, że mogę wrócić I i J każdym razem. Ale nie chcę tego robić. Chcę zajrzeć do lokalnego w generatorze.

+0

Wydaje że naprawdę rozciągasz wzór generatora zbyt daleko. Dlaczego nie zastosować podejścia, które lepiej pasuje do twojego przypadku użycia, zamiast próbować dopasować swój problem do wąskiej koncepcji generatora? – nikow

+0

+1 za dobre pytanie, dla mnie istnieje wiele zalet dostępu do zmiennych, które mogą ulec zmianie w trakcie iteracji przez generator. –

+0

Po dyskusji, blogowałem o moim rozwiązaniu tutaj: http://blog.metaoptimize.com/2009/12/22/why-cant-you-pickle-generators-in-python-workaround-pattern-for-saving-training -state/ –

Odpowiedz

9

Można utworzyć obiekt i manipulować interfejs __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 

Drukuje:

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

Myślę, że to brzydkie, ale powinno robić to, co chcesz. Wolałbym wrócić I i J za każdym razem, choć :-)

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

Osobiście też wolałbym po prostu zwracać i i j, prawdopodobnie w krotce, zamiast zhakować rzeczy do pracy. – Dustin

+0

Sądzę, że jest to szersze zalety tego, o co prosił Joseph, w scenariuszach, w których generator może być manipulowany podczas zapełniania, np. Kolejka zadań sieciowych. w takim przypadku zależność od krotki nie jest realną alternatywą. –