[免责声明:可能有更多的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
。
有没有办法做这样的事情?