2

我试图在没有运气的情况下访问包装函数内的装饰器参数。

我所拥有的是:

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()

我真的不明白为什么我不能访问装饰器参数。

4

2 回答 2

3

您可以访问arg1and arg2,但不应分配给这些名称,即使使用“增强”分配运算符也不应,因为这会使它们成为内部函数中的局部变量。您收到的错误消息表明您尝试完全这样做(尽管您没有显示您的代码)。

在 Python 3 中,您可以使用以下方法解决此问题

nonlocal arg1, arg2

某处wrapper()

于 2011-02-10T21:36:04.587 回答
0

这取决于你用arg1和做什么arg2。通常,闭包无需额外工作即可完美运行。但是,如果您在内部函数中重新分配它们,Python 会假定它是一个局部变量,您必须另外告诉它。

在 Python 3 中,声明nonlocal arg1, arg2. 在 Python 2 中,您必须作弊:将两者包装成列表(arg1 = [arg1]在外部函数中)并arg1[0]在内部函数中使用。如果您想了解其工作原理,请搜索有关此主题的 Python 问题或参考文档(我相信在语言参考中的某处,我会搜索)。

你的问题是wrapper传递selfmethod. 没有self。你必须接受它(即使那样,你也会将装饰器限制在方法上——为什么不让它self溜进*args去呢?)。

self我看不到您如何从“未定义全局名称”中读取“分配前引用”...

于 2011-02-10T21:36:36.730 回答