访问装饰器包装函数内的装饰器参数

我试图在包装函数中访问我的装饰器参数,没有运气。 我拥有的是:
def my_decorator(arg1=False, arg2=None):

    def decorator(method):
        @functools.wraps(method)
        def wrapper(method, *args, **kwargs):
            # do something based on arg1 and arg2
            # accessing one of the two named arguments
            # ends up in a 'referenced before assignment'

            arg1 = arg1 # error
            arg2 = arg2 # error

            newarg1 = arg1 # working
            newarg2 = arg2 # working

            return method(*args, **kwargs)
        return wrapper
    return decorator
我会像普通装饰一样使用它
@my_decorator(arg1=True, arg2='a sting or whatever else')
the_function()
我真的不明白为什么我无法访问装饰器参数。     
已邀请:
你可以访问
arg1
arg2
,但你不应该分配这些名称,甚至不能使用“扩充”赋值运算符,因为这会使它们成为内部函数中的局部变量。您收到的错误消息表明您尝试这样做(尽管您没有显示您的代码)。 在Python 3中,您可以使用解决此问题
nonlocal arg1, arg2
wrapper()
的某个地方。     
这取决于你用
arg1
arg2
做什么。通常,闭合工作完美无需额外工作。但是,如果在内部函数中重新分配它们,Python会假定它是一个局部变量,否则你必须告诉它。 在Python 3中,声明
nonlocal arg1, arg2
。在Python 2中,你必须作弊:将两个包装成列表(外部函数中的
arg1 = [arg1]
)并在内部函数中使用
arg1[0]
。如果你想解释为什么这样做,要么搜索关于这个主题的Python问题,要么参考文档(我相信语言参考中的某个地方,我会搜索)。 你的问题是
wrapper
通过
self
method
。没有
self
。你必须接受它(即便如此,你还要将装饰器限制在方法中 - 为什么不让
self
滑入
*args
?)。 我没看到你如何阅读“全局名称
self
未定义”中的“在转让前引用”...     

要回复问题请先登录注册