4

我有一个带有return value语句的生成器。如果我在它上面使用下一个,我会得到 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:

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

4

1 回答 1

5

通过接收yield from语句中子生成器发送的值。

引用PEP 380 -- 委托给子生成器的语法:

表达式的值是迭代器终止时引发yield from的异常的第一个参数。StopIteration

因此,稍加调整,res生成new器中将包含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
于 2016-01-30T14:25:10.353 回答