python - 如何并行编写 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() 上并行构建两个装饰器的目标,但我想知道是否还有其他方法可以仍然使用 @ 语法来实现我的目标。
解决方案
装饰器语法
@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
推荐阅读
- flutter - 将静态库添加到 iOS
- php - 如何在数据列表的“选项”字段中获取数组值
- azure - 将 Azure 应用程序洞察中的 LOGMESSAGE 事件记录到 NewRelic
- javascript - 使用 JS 在下拉列表中按 2 个自定义分类法过滤 WordPress 帖子
- windows - 当用户在资源管理器中打开文档时,是否可以使用挂钩机制?
- javascript - 如何获取数组中的重复元素
- java - Android:ImageView 的宽度不会从 SeekBar 侦听器更改
- javascript - 有没有办法在运行其他代码之前等待异步函数完成?
- python - 如何在 FastAPI 应用函数 Python 中使用动态表单数据?
- javascript - 递归计数器在 codewars kata 中不起作用