我试图使用装饰器为函数提供访问特定变量的权限。例如,
def make_x_available(fn):
def decorated():
x = 5
return fn()
return decorated
@make_x_available
def print_x():
print(x)
5
这里代表每次调用函数fn
时要评估的任意表达式,并绑定到名称x
。
而不是print_x
向上走,以便按照我的预期找到x的值为5,而是提升NameError: name 'x' is not defined
。
我将如何实现这一目标?为什么会出现这个错误?
答案 0 :(得分:2)
您可以将x
作为参数添加到函数中:
def make_x_available(fn):
def decorated():
x = 5
return fn(x)
return decorated
@make_x_available
def print_x(x):
print(x)
print_x()
<强>输出强>
5
或者,您可以使用关键字参数:
def make_x_available(fn):
def decorated(*args, **kwargs):
kwargs['x'] = 5
return fn(*args, **kwargs)
return decorated
@make_x_available
def print_x(*args, **kwargs):
print(kwargs['x'])
print_x()
<强>输出强>
5
答案 1 :(得分:1)
不确定它可以用于什么,但这可行:
from functools import wraps
def make_x_available(fn):
@wraps(fn)
def decorated(*args, **kwargs):
decorated.x = 5
return fn(*args, **kwargs)
return decorated
@make_x_available
def print_x():
print(print_x.x)
print_x()
打印:
5
注意:当您编写装饰器时,始终使用functools.wraps
来保留装饰函数的名称,文档字符串和其他属性。