【发布时间】:2014-12-15 23:32:27
【问题描述】:
如果我有一个装饰器和一个函数,但我想将装饰函数与该函数的未装饰版本一起使用,我会怎么做?
我没有太多使用装饰器,从我能找到的情况来看,似乎你必须写出 2 个单独的函数来完成此操作,或者以函数作为参数调用装饰器,这可能会有点令人困惑处理多个装饰器。
为了解决这个问题,我正在编写一个函数,然后我使用一种有点迂回的方式来装饰函数并在事后返回该装饰函数。所以我可以访问该函数的未装饰和装饰版本。据我所知,实现这一点的方法有点被看不起,但它一直对我有用到目前为止。我无法想象这是解决这个问题的最佳方式。
本质上,我将要装饰的函数与装饰器函数一起传递给检查函数文本的方法,将@decorator 语法添加到文本中,然后将装饰器函数添加到__builtins__模块暂时这样我就可以将exec 文本放入字典中来定义新的修饰函数。这个新的函数对象是从字典中提取出来的,并作为新的修饰函数返回。
我很确定这不是最好的解决方法。我不认为它适用于所有情况,但我也不想每次都调用修饰函数或重写函数。
【问题讨论】:
-
为什么不直接在需要的时候使用
function(...),在需要装饰版的时候使用decorator(function)(...)? -
@jonsharpe,我想知道是否还有其他方法可以做到这一点。我可以很容易地这样做,但我想我会问。
-
“应该有一种——最好只有一种——明显的方法” (
import this),就是这样!
标签: python metaprogramming decorator python-decorators