【问题标题】:access decorator arguments inside the decorators wrapper function访问装饰器包装函数内的装饰器参数
【发布时间】:2011-06-25 04:16:01
【问题描述】:

我试图在包装函数中访问我的装饰器参数,但没有成功。

我拥有的是:

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

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

【问题讨论】:

    标签: python arguments decorator optional-arguments


    【解决方案1】:

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

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

    您的问题是wrapperself 传递给method。没有self。你必须接受它(即使那样,你也会将装饰器限制在方法上——为什么不让self 滑入*args?)。

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

    【讨论】:

    • 我没有重新分配那些参数,我使用 python2x,但我无法访问那些。它告诉我他们没有被分配。
    • @delnan:还有更多代码要展示。 arg1 或 arg2 在包装函数内部不可访问。我不需要重新分配那些,只知道那些是真还是假或者arg2的值是什么
    • @aschmid00: wrapper的代码是什么?我怀疑这只是三个 cmets 和一个 return,因为这不会导致错误。
    • @delnan:尝试在函数上使用该装饰器并打印参数。我什至不能打印那些。因为包装函数不知道这些参数。
    • @aschmid00:有一个错误,但这与你给我们的错误信息的模糊复述无关。请参阅更新的答案。 (编辑:现在我看到你自己更新了代码......没有self 的版本对我来说完美无缺,如果你仍然有问题,发布代码)。
    【解决方案2】:

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

    在 Python 3 中,您可以使用

    解决此问题
    nonlocal arg1, arg2
    

    wrapper() 的某个地方。

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2011-09-22
      • 2020-06-20
      • 1970-01-01
      • 2023-04-03
      • 2014-07-21
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多