与原始函数一起修饰的函数,而无需重写该函数

Duc*_*her 1 python metaprogramming decorator python-decorators

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

我没有太多使用装饰器,从我所能找到的来看,似乎你必须编写两个单独的函数来完成此任务,或者使用函数作为参数调用装饰器,这在处理多个函数时可能会有些混乱装饰者。

为了解决这个问题,我编写了一个函数,然后使用一种有点迂回的方式来装饰该函数并在事后返回该装饰函数。所以我可以访问该函数的未修饰版本和修饰版本。据我所知,实现这一目标的方法有点被人看不起,但到目前为止它对我来说一直有效。我无法想象这是解决这个问题的最佳方法。

本质上,我将想要装饰的函数与装饰器函数一起传递给检查函数文本的方法,将语法添加到@decorator文本中,然后将装饰器函数__builtins__临时添加到模块中,以便我可以将exec文本转换为字典来定义新的修饰函数。这个新的函数对象是从字典中提取出来的,并作为新的修饰函数返回。

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

Mar*_*ers 5

那么就不要将装饰器用作装饰器。请记住,装饰器是语法糖,但您不必使用它。

语法:

@decorator_expr
def decorated_func():
    pass
Run Code Online (Sandbox Code Playgroud)

实际上执行为:

def decorated_func():
    pass
decorated_func = decorator_expr(decorated_func)
Run Code Online (Sandbox Code Playgroud)

要保留“原始”版本和装饰版本,只需将装饰器的输出分配给不同的名称即可:

def foo():
    pass

foo_decorated = decorator_expr(foo)
Run Code Online (Sandbox Code Playgroud)

或者,每次需要装饰版本时都使用可调用的装饰器:

result = decorator_expr(foo)()
Run Code Online (Sandbox Code Playgroud)