【发布时间】:2013-07-25 14:12:31
【问题描述】:
[免责声明:可能有更多的pythonic方式来做我想做的事,但我想知道python的作用域在这里是如何工作的]
我正在尝试找到一种方法来制作一个装饰器,该装饰器可以将名称注入另一个函数的范围(这样名称不会泄漏到装饰器的范围之外)。例如,如果我有一个函数说要打印一个名为 var 的变量,该变量尚未定义,我想在调用它的装饰器中定义它。这是一个打破的例子:
c = 'Message'
def decorator_factory(value):
def msg_decorator(f):
def inner_dec(*args, **kwargs):
var = value
res = f(*args, **kwargs)
return res
return inner_dec
return msg_decorator
@decorator_factory(c)
def msg_printer():
print var
msg_printer()
我希望它打印“Message”,但它给出了:
NameError: global name 'var' is not defined
回溯甚至指向var 的定义位置:
<ipython-input-25-34b84bee70dc> in inner_dec(*args, **kwargs)
8 def inner_dec(*args, **kwargs):
9 var = value
---> 10 res = f(*args, **kwargs)
11 return res
12 return inner_dec
所以我不明白为什么找不到var。
有没有办法做这样的事情?
【问题讨论】:
标签: python scope closures decorator python-decorators