gpt4 book ai didi

python - 从其中包含 return 语句的生成器中产生

转载 作者:太空狗 更新时间:2023-10-30 02:42:54 25 4
gpt4 key购买 nike

我有一个带有 return value 语句的生成器。如果我在它上面使用 next,我会按预期从中得到 Stopiteration: value。但是,当我使用 yield from 时,value 丢失了。

In [1]: def test():
...: return 1
...: yield 2
...:

In [2]: t = test()

In [3]: t
Out[3]: <generator object test at 0x000000000468F780>

In [4]: next(t)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-4-9494367a8bed> in <module>()
----> 1 next(t)

StopIteration: 1

In [5]: def new():
...: yield from test()
...:

In [6]: n = new()

In [7]: n
Out[7]: <generator object new at 0x00000000050F23B8>

In [8]: next(n)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-8-1c47c7af397e> in <module>()
----> 1 next(n)

StopIteration:

有没有办法在使用 yield from 时保留 value ?这是按预期工作还是可能是错误?

最佳答案

通过接收子生成器在yield from中发送的值声明。

摘自 PEP 380 -- Syntax for Delegating to a Subgenerator:

The value of the yield from expression is the first argument to the StopIteration exception raised by the iterator when it terminates.

所以稍微调整一下,resnew生成器将包含 StopIteration 的值从 test 中提出子生成器:

def new():
res = yield from test()
return res

现在 next(n)执行后,您将获得异常消息中的值:

n = new()

next(n)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-39-1c47c7af397e> in <module>()
----> 1 next(n)

StopIteration: 1

哦,作为附录,您当然可以获得“返回”值,而无需将其封装在 StopIteration 中。使用 yield 对象再次:

def new():
res = yield from test()
yield res

现在打电话 next(new())将返回从 test() 返回的值:

next(new())
Out[20]: 1

关于python - 从其中包含 return <value> 语句的生成器中产生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35102796/

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