【问题标题】:yield from a generator that has return <value> statement in it从具有 return <value> 语句的生成器中产生
【发布时间】:2016-05-08 06:24:27
【问题描述】:

我有一个带有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:

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

【问题讨论】:

    标签: python python-3.x generator yield-from


    【解决方案1】:

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

    引用PEP 380 -- Syntax for Delegating to a Subgenerator:

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

    因此,只需稍加调整,new 生成器中的res 将包含从test 子生成器产生的StopIteration 的值:

    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
    

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

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

    现在调用next(new()) 将返回从test() 返回的值:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2014-10-15
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多