装饰功能与原版一起,无需重新编写功能

时间:2014-10-20 21:05:00

标签: python metaprogramming decorator python-decorators

如果我有装饰器和函数,但是我想使用装饰函数以及该函数的未修饰版本,我该怎么办?

我没有多次使用装饰器,而且从我能找到的内容来看,似乎你必须写出2个独立的函数来完成这个,或者用函数作为参数来调用装饰器,这可能会让人感到有些困惑。处理多个装饰器。

为了解决这个问题,我正在编写一个函数,然后我使用一种稍微迂回的方式来装饰函数并在事后返回该装饰函数。所以我可以访问该功能的未装饰版本和装饰版本。从我所知道的,实现这一目标的方法可以看一点,但它一直在为我工作到目前为止。我无法想象这是解决这个问题的最好方法。

基本上,我将要装饰的函数与装饰器函数一起传递给检查函数文本的方法,将@decorator语法添加到文本中,然后将装饰函数添加到{暂时{1}}模块我可以__builtins__将文本放入字典中来定义新的装饰函数。这个新的函数对象是从字典中提取出来的,并作为新的装饰函数返回。

我很确定这是不是最好的方法。我不认为它适用于所有情况,但我也不想每次调用修饰函数或重写函数。

1 个答案:

答案 0 :(得分:4)

然后不要将装饰器用作装饰器。请记住,装饰器是语法糖,但你没有 来使用它。

语法:

@decorator_expr
def decorated_func():
    pass

实际执行为:

def decorated_func():
    pass
decorated_func = decorator_expr(decorated_func)

要保留“原始”和装饰版本,只需将装饰器的输出分配给另一个名称:

def foo():
    pass

foo_decorated = decorator_expr(foo)

或者,每次需要装饰版本时,都要使用decorator:

result = decorator_expr(foo)()