【问题标题】:How to read function attributes from decorator in Python如何在 Python 中从装饰器中读取函数属性
【发布时间】:2019-12-26 01:34:05
【问题描述】:

我想从装饰器访问函数的局部变量。例如,在下面的代码中,我有一个名为 globalfunc 的函数,它有一个变量状态,我想在调用函数之前从装饰器“deco”中读取状态值 - 有可能吗?

def deco(func):
    def wrap():
        print(wrap.status)
        func()
        print(wrap.status)
    return wrap

@deco
def globalfunc():
    status="success"


# main
globalfunc()

【问题讨论】:

  • 这是一个局部变量,不是函数属性。

标签: python python-2.7 decorator python-decorators


【解决方案1】:

你有一个局部变量,而不是一个函数属性。您不能从函数外部访问局部变量。

函数属性会这样分配:

def globalfunc():
    globalfunc.status = "success"

globalfunc.status = "notyetcalled"

您的装饰器必须小心地将status 属性的初始值传递给它创建的新function 对象:

def deco(func):
    def wrap():
        print(wrap.status)
        func()
        print(wrap.status)

    try:
        current_status = func.status
    except AttributeError:
        current_status = "some default value"
    wrap.status = current_status
    return wrap

现在你可以写了

@deco
def globalfunc():
    pass

globalfunc()

哪个输出

"some default value"
"success"

【讨论】:

    【解决方案2】:

    chepner 的上述回答说明您可以访问函数属性。 [原始] 问题包含术语 attribute 但代码显示 OP 指的是局部变量。

    很遗憾,这是不可能的。没有这个功能比有一个更好,因为它可能会在处理不同功能和范围的数据时引发一些安全问题。

    可能的解决方案:

    • 重新设计这部分应用程序,
    • 改用属性(但要小心)

    附言。我没有添加评论的声誉,因此这个答案。

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 2011-12-02
      • 2018-01-21
      • 2019-06-21
      • 1970-01-01
      • 2023-02-08
      • 2018-08-16
      • 2015-10-23
      • 2018-07-06
      相关资源
      最近更新 更多