如何检查是否使用了发电机?

时间:2017-03-10 10:06:33

标签: python generator yield

是否可以知道是否使用了发电机?即。

def code_reader(code):
   for c in code:
        yield c

code_rdr = code_reader(my_code)

a = code_rdr.next()

foo(code_rdr)

foo来电后,我想知道.next()是否code_rdr是否foo被调用了next()。 当然,我可以通过一些带有main-domain.xxx -> https://www.main-domain.xxx sub.main-domain.xxx -> https://sub.main-domain.xxx 调用计数器的类来包装它。 有没有简单的方法呢?

2 个答案:

答案 0 :(得分:9)

Python 3.2+有inspect.getgeneratorstate()。所以你可以简单地使用inspect.getgeneratorstate(gen) == 'GEN_CREATED'

>>> import inspect
>>> gen = (i for i in range(3))
>>> inspect.getgeneratorstate(gen)
'GEN_CREATED'
>>> next(gen)
0
>>> inspect.getgeneratorstate(gen)
'GEN_SUSPENDED'

答案 1 :(得分:0)

我使用附加可能答案的想法,下面重新定义code_reader功能:

def code_reader(code):
length = len(code)
i = 0
while i < length:
    val = (yield i)
    if val != 'position':
        yield code[i]
        i += 1

使用.send(&#39; position&#39;)我会知道要生成的下一个项目的位置,即

a = code_reader("foobar")

print a.next()
print a.send('position')
print a.next()
print a.send('position')
print a.send('position')
print a.next()
print a.send('position')

输出:

0
0
f
1
1
o
2