Python - 函数可以看到自己的装饰器

时间:2013-11-20 18:29:33

标签: python decorator python-decorators

我还是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)

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

至少在CPython中这是可行的,但很脏。您可以检查堆栈跟踪,获取其本地,找出该对象的确切内容等等。

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

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