【发布时间】:2017-05-09 11:45:02
【问题描述】:
我想要一个函数,is_just_started,其行为如下:
>>> def gen(): yield 0; yield 1
>>> a = gen()
>>> is_just_started(a)
True
>>> next(a)
0
>>> is_just_started(a)
False
>>> next(a)
1
>>> is_just_started(a)
False
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> is_just_started(a)
False
如何实现这个功能?
我查看了.gi_running 属性,但它似乎用于其他用途。
如果我知道需要发送到生成器的第一个值,我可以这样做:
def safe_send(gen, a):
try:
return gen.send(a)
except TypeError as e:
if "just-started" in e.args[0]:
gen.send(None)
return gen.send(a)
else:
raise
但是,这似乎很可恶。
【问题讨论】:
-
是否允许在生成器内部进行修改?可以装饰吗?
-
看起来
gi_running表示解释器当前实际上正在运行代码,所以迭代之间为假