首页 > 解决方案 > 如何并行编写 2 个 Python 装饰器

问题描述

我正在阅读此处描述的 Python 装饰器。如果将 decorator_1 放在 func() 上方,则函数 func() 将被修饰,如下所示

@decorator_1
def func():
    return

如果我想并行构建两个装饰器 decorator_1 和 decorator_2,它们都使用带有 @ 语法的 func() 怎么办?我该怎么做?我不能像下面那样将一个堆叠在另一个之上,因为这会使它成为一个复合装饰器。

@decorator_2
@decorator_1
def func():
    return

我知道我可以省去 @ 语法而只写

func1 = decorator_1(func)
func2 = decorator_2(func)

实现我在一个函数 func() 上并行构建两个装饰器的目标,但我想知道是否还有其他方法可以仍然使用 @ 语法来实现我的目标。

标签: pythonpython-decorators

解决方案


装饰器语法

@deco
def f(...):
    ...

简称

def f(...):
    ...
f = deco(f)

@deco2
@deco1
def f(...):
    ...

简称

def f(...):
    ...
f = deco2(deco1(f))

特别是,外部装饰器只接收内部装饰器的输出,而不是最初装饰的函数(或类)。此外,分配的唯一名称是用于原始函数定义的名称。

如果由于某种原因您决定通过装饰器语法来做到这一点,那么您可以合理获得的最接近的是

def multidec(*decorators):
    def inner_dec(f):
        return tuple(dec(f) for dec in decorators)
    return inner_dec

@multidec(deco1, deco2)
def f(...):
    ...

这将导致 finalf是一个 tuple (deco1(original_f), deco2(original_f)),其中original_f是由原始函数定义定义的函数。然后你可以解压元组:

f1, f2 = f

推荐阅读