【问题标题】:Python - Can a function see its own decoratorsPython - 函数可以看到自己的装饰器吗
【发布时间】:2013-12-04 22:08:45
【问题描述】:

我对 Python 还是很陌生。给定一个具有装饰器的函数,该函数是否可以访问它们的主体?

(来自Fabric 脚本)

@task
@roles('qa-env')
def deploy_qa():
    #-----------------------------------------------------------------------
    # Is there a way to get access to the @roles decorator as an array here?
    #-----------------------------------------------------------------------
    deployer.configureEnv('qa-env')
    deployer.installApp1()
    deployer.installApp2(True)

【问题讨论】:

    标签: python decorator python-decorators


    【解决方案1】:

    不,该函数不知道它是从哪里调用的,也不知道是谁持有对它的引用。

    您最多可以访问父调用框架(使用sys._getframe(1)),但这不一定是装饰器。

    一般来说,如果您的函数需要访问调用框架中的值,最好将其传入。例如,让roles 装饰器使用额外的参数调用包装函数。

    【讨论】:

    • 哇!我不知道sys._getFrame(1)。很高兴知道。为你 +1。
    【解决方案2】:

    这是可行的,至少在 CPython 中是可行的,但是很脏。你可以检查堆栈跟踪,获取它的本地,找出这个对象到底是什么,等等。

    但如果你需要这样做,你可能做错了什么,你的解决方案应该改变。

    显式优于隐式 - Python 的基本概念之一。

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2021-07-15
      • 2014-01-26
      • 2020-02-12
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多