【问题标题】:How to write 2 Python decorators in parellel如何并行编写 2 个 Python 装饰器
【发布时间】:2020-08-13 02:37:33
【问题描述】:

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

【问题讨论】:

  • 不是真的,不。
  • 你能给出你想要实现的用例吗......不是在python机制方面,而是在高水平......
  • @ArunKalirajaBaskaran:我在问题的最后一段中做了。我刚刚编辑了我的问题以使其更加清晰。请查看。

标签: python python-decorators


【解决方案1】:

装饰器语法

@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(...):
    ...

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

f1, f2 = f

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2021-01-28
    • 2015-03-24
    • 2011-12-26
    • 2015-03-22
    相关资源
    最近更新 更多