2009-12-21 49 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