2014-09-06 74 views
0

此代碼段是與龍捲風3.2行,但將引發在龍捲風異常4. (該代碼是一個複雜的代碼所提取的和簡化版本。) 爲什麼這個Python代碼與Tornado 4打破?

from tornado import gen 
from tornado.ioloop import IOLoop 


@gen.engine 
def foo(): 

    @gen.Task 
    def bar(callback=None): 
     print bar 
     callback(None) 

    yield bar 
    ioloop.stop() 

ioloop = IOLoop.current() 
ioloop.add_callback(foo) 
ioloop.start() 
(與Python 2.7.6測試)

在龍捲風4,失敗與此異常:

... 
    File "/local/lib/python2.7/site-packages/tornado/gen.py", line 160, in wrapper 
    result = func(*args, **kwargs) 
    File "temp.py", line 9, in bar 
    print bar 
NameError: free variable 'bar' referenced before assignment in enclosing scope 

我認爲閉包變量的管理是翻譯的任務。爲什麼龍捲風會影響到這一點?

+1

如果我們將'bar'移動到全局範圍,則會引發此異常:'NameError:全局名稱'bar'未定義 – 2014-09-06 07:53:20

回答

0

gen.Task不是裝飾者;它應該與yield gen.Task(bar)一起使用。

您看到的行爲變化是在Tornado 4.0中Task()立即調用它的參數,而在較早的版本中,只有在產生任務時才調用該函數。裝飾器在名稱被綁定之前被應用,所以當Task被用作裝飾器時,該函數不會看到它自己。