2016-01-30 42 views
2

我有一個發電機,其中有return value聲明。 如果我使用它,我會按預期從它那裏得到Stopiteration:value。 但是,當我使用yield fromvalue丟失。從發電機產生的收益<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? 這是按預期工作,或者它可能是一個錯誤?

回答

2

通過接收yield from聲明中子生成器發送的值。

PEP 380 -- Syntax for Delegating to a Subgenerator:

隔空報價yield from表達式的值是第一個參數到終止時的迭代器提出的StopIteration異常。

所以用小的調整,resnew發電機將包含來自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