我还是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)
答案 0 :(得分:4)
不,该函数不知道从哪里调用它或谁持有对它的引用。
最多可以访问父调用框架(sys._getframe(1)
),但这不一定是装饰器。
通常,如果您的函数需要访问调用框架中的值,则最好将其传入。例如,让roles
装饰器使用额外的参数调用包装函数。
答案 1 :(得分:2)
至少在CPython中这是可行的,但很脏。您可以检查堆栈跟踪,获取其本地,找出该对象的确切内容等等。
但是如果你需要这样做,你可能做错了,你的解决方案应该改变。
显式优于隐式 - 基本的python概念之一。