如何从生成器外部访问python生成器中定义的局部变量?
我有一个例子,我的生成器操作一个本地状态,对于unittests,我想检查这个状态以确保它包含正确的值。
我无法将状态存储到实例变量(例如self.state=blah),因为我可能正在从同一个类实例创建多个生成器,这意味着生成器可能会覆盖彼此的状态。我也不能返回yield表达式中的状态,因为状态名可能会因为单个生成器实例而更改。
我想做这样的事情(尽管这段代码不起作用)

from random import random

class MyIter(object):
    def __iter__(self):
        context = {}
        for i in xrange(10):
            context[random()] = random()
            yield i

obj = MyIter()
i1 = iter(obj)
i2 = iter(obj)
while 1:
    try:
        i1.next()
        i2.next()
        print i1.context
        print i2.context
    except StopIteration:
        break

是否可以通过检查python的执行堆栈来访问本地变量?

最佳答案

很抱歉回答我自己的问题,但是在深入生成器接口之后,我找到了访问生成器局部变量所需的确切路径:

from random import random

class MyIter(object):
    def __iter__(self):
        context = {}
        for i in xrange(10):
            context[random()] = random()
            yield i

obj = MyIter()
i1 = iter(obj)
i2 = iter(obj)
while 1:
    try:
        i1.next()
        i2.next()
        print i1.gi_frame.f_locals['context']
        print i2.gi_frame.f_locals['context']
    except StopIteration:
        break

关于python - 在Python生成器中访问局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4736470/

10-13 08:40