我尝试定义一个生成器函数mycount(),可以使用生成器函数重置,send(0)如下例所示.一切正常,除非我使用send(0)尚未启动的新生成器对象.在这种情况下,它给出了一个TypeError.是否有任何函数检查生成器是否已启动,或者我是否必须捕获TypeError并mycount(0)在这种情况下创建新的生成器对象?
def mycount(value):
while True:
v = yield value
if v == None:
value = value + 1
else:
value = v
g = mycount(3)
print(next(g)) # prints 3
print(next(g)) # prints 4
print(g.send(0)) # prints 0
print(next(g)) # prints 1
print(next(g)) # prints 2
g2 = mycount(3)
g2.send(0)
# TypeError: can't send non-None value to a just-started generator
Run Code Online (Sandbox Code Playgroud)
小智 8
为避免向None刚刚启动的生成器发送非值,您需要先调用next或send(None)先调用.我同意其他人David Beazley的协程装饰器(在python 3.x中你需要调用__next__()函数而不是next())是一个很好的选择.虽然那个特殊的装饰器很简单,但我也成功地使用了copipes库,这是Beazley演示文稿中许多实用工具的很好实现,包括协程.
关于是否可以检查生成器是否已启动 - 在Python 3中,您可以使用inspect.getgeneratorstate.这在Python 2中不可用,但CPython实现是纯Python,并且不依赖于Python 3的任何新功能,因此您可以以相同的方式检查自己:
if generator.gi_running:
return GEN_RUNNING
if generator.gi_frame is None:
return GEN_CLOSED
if generator.gi_frame.f_lasti == -1:
return GEN_CREATED
return GEN_SUSPENDED
Run Code Online (Sandbox Code Playgroud)
具体来说,g2如果开始inspect.getgeneratorstate(g2) != inspect.GEN_CREATED.
| 归档时间: |
|
| 查看次数: |
1802 次 |
| 最近记录: |