简单非本地绑定的{Name}

时间:2015-12-28 11:02:39

标签: python python-decorators

我试图使用装饰器为函数提供访问特定变量的权限。例如,

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

我将如何实现这一目标?为什么会出现这个错误?

2 个答案:

答案 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来保留装饰函数的名称,文档字符串和其他属性。