如何并行编写 2 Python 个装饰器

How to write 2 Python decorators in parellel

我正在阅读 Python 装饰器,如 here 所述。如果将 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() 上并行构造两个装饰器的目标,但我想知道是否还有其他方法仍然可以使用 @ 语法来实现我的目标。

装饰器语法

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

的缩写
def f(...):
    ...
f = deco(f)

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

的缩写
def f(...):
    ...
f = deco2(deco1(f))

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

如果出于某种原因您决定通过装饰器语法来执行此操作,那么您可以合理获得的最接近的是

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

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

这将导致最终的 f 成为元组 (deco1(original_f), deco2(original_f)),其中 original_f 是由原始函数定义定义的函数。然后你可以解压元组:

f1, f2 = f