2014-09-06 72 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被用作装饰器时,该函数不会看到它自己。