2016-01-20 57 views
0

如何檢查一些黑匣子發生器是否正在等待該值或正在返回值?我的意思是管理以下發電機:檢查發生器是否正在等待「發送」或產生值

def gen(): 
    a = yield 
    yield a 
    yield a+1 
    yield a+2 

可以是以下:

g = gen() 
g.next() 
print g.send(5) 
print g.next() 
print g.next() 

和不同發生器,例如:

def gen(): 
    a = yield 
    b = yield 
    yield a+b 

它需要也不同,對例如:

g = gen() 
g.next() 
g.send(1) 
print g.send(2) 

所以問題是我如何才能選擇發送生成器中的值並僅在黑盒(第三方)生成器的情況下從中獲取結果?我需要寫下面的代碼:

values = [1, 2, 3] 
results = list() 
g = gen() 
g.next() 
for v in values: 
    # needs this magic 
    if g.__awaits__: # in case of "x = yield" expression 
    results.append(g.send(v)) 
    elif g.__yields__: # in case of "yield x" expression 
    results.append(g.next()) 

回答

0

你不能這樣做,因爲在這兩種「種類」的生成器上允許的操作方面沒有任何區別。你總是可以,只要你有人稱它next一次發送的值到發電機,即使發生器不與發送的值做任何事情:

>>> def gen(): 
...  yield 1 
...  yield 2 
...  yield 3 
>>> x = gen() 
>>> next(x) 
1 
>>> x.send('hello') 
2 
>>> x.send('hello') 
3 

有沒有辦法知道是否發電機「需要「你發送一個值,除了閱讀你正在使用的任何發生器的文檔。