是否有Python函数检查生成器是否已启动?

Hol*_*ger 7 python generator

我尝试定义一个生成器函数mycount(),可以使用生成器函数重置,send(0)如下例所示.一切正常,除非我使用send(0)尚未启动的新生成器对象.在这种情况下,它给出了一个TypeError.是否有任何函数检查生成器是否已启动,或者我是否必须捕获TypeErrormycount(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刚刚启动的生成器发送非值,您需要先调用nextsend(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.