gpt4 book ai didi

python - 如何判断发电机是否刚刚启动?

转载 作者:IT老高 更新时间:2023-10-28 20:31:36 25 4
gpt4 key购买 nike

我想要一个函数,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

但是,这似乎很可恶。

最佳答案

这仅适用于 Python 3.2+:

>>> def gen(): yield 0; yield 1
...
>>> a = gen()
>>> import inspect
>>> inspect.getgeneratorstate(a)
'GEN_CREATED'
>>> next(a)
0
>>> inspect.getgeneratorstate(a)
'GEN_SUSPENDED'
>>> next(a)
1
>>> inspect.getgeneratorstate(a)
'GEN_SUSPENDED'
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> inspect.getgeneratorstate(a)
'GEN_CLOSED'

所以,请求的函数是:

import inspect

def is_just_started(gen):
return inspect.getgeneratorstate(gen) == inspect.GEN_CREATED:

出于好奇,我研究了 CPython 以弄清楚它是如何确定这一点的……显然它查看了 generator.gi_frame.f_lasti 这是“字节码中最后一次尝试指令的索引” .如果是-1,那么它还没有开始。

这是一个 py2 版本:

def is_just_started(gen):
return gen.gi_frame is not None and gen.gi_frame.f_lasti == -1

关于python - 如何判断发电机是否刚刚启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41307038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com