2009-12-21 50 views
6

我可以將成員變量/方法添加到Python生成器嗎?將成員變量/方法添加到Python生成器?

我想大意如下的東西,讓我可以 「窺視」 的成員變量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 

是的,我知道我可以每次都返回i和j。但我不想這樣做。我想窺視發電機內的一個本地。

+0

這似乎你真的把發電機模式拉得太遠了。爲什麼不使用更適合您的用例的方法,而不是試圖將您的問題納入窄發生器概念? – nikow 2009-12-21 20:18:18

+0

+1對於一個好問題,對於訪問在遍歷生成器的過程中可能發生變化的變量有很多好處。 – 2009-12-21 22:52:33

+0

以下討論,我在這裏博客瞭解我的解決方案:http://blog.metaoptimize.com/2009/12/22/why-cant-you-pickle-generators-in-python-workaround-pattern-for-saving-training -state/ – 2009-12-22 08:58:13

回答

9

你可以創建一個對象,並操縱__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 

打印:

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

我覺得它很醜,但它應該做你想做的。我寧願回到I和J每一次,雖然:-)

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

就我個人而言,我也願意簡單地返回i和j,可能是在一個元組中,而不是一起工作。 – Dustin 2009-12-21 20:22:30

+0

我認爲Joseph在請求的時候有更廣泛的優勢,在發生器被填充的時候可能會被操縱,比如網絡任務隊列。在這種情況下,取決於元組不是一個可行的選擇。 – 2009-12-21 22:50:59