2013-07-18 60 views
4

當我把yield放在函數體中時,很明顯。但這不是我想問的。鑑於兩個簡單的功能於一身的交互式解釋:python如何知道何時返回一個生成器?

def myGenerator(): 
    yield 42 

def myFunction(): 
    return 42 

當我執行我都看到:

>>> myGenerator() 
<generator object myGenerator at 0xb7bf511c> 
>>> myFunction() 
42 

但如果檢查myGeneratormyFunction對象,我沒有看到任何真正的不同:

for attr in dir(myFunction): 
    print(attr, getattr(myFunction, attr) 

產生的東西看起來與myGenerator相同。函數對象的隱藏中是否隱藏了一些魔術位,解釋器是否分支以辨別是否將函數調用作爲生成器進行封裝​​?還是它做了更多的裝飾風格,其中yield關鍵字的存在使得像'myGenerator'那樣綁定的對象被封裝在某些生成器魔術中?或者是其他東西...?

+2

答案在這裏:http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained – manji

回答

4

「生成器函數在所有方面都是普通函數對象,但在代碼對象的co_flags成員中設置了新的CO_GENERATOR標誌。」

從PEP http://www.python.org/dev/peps/pep-0255/

>>> generator_fn.__code__.co_flags 
>>> 99 
>>> normal_fn.__code__.co_flags 
>>> 67