python - 为几种方法重复装饰器。如何干燥
问题描述
在我们的代码库中,我们曾经为任何使用自定义装饰器函数装饰的方法定义一个“动作” 。
“动作”的定义不断增长,因此添加了更多装饰器。如今,我们为任何用 4 个(有时是 5 个)自定义装饰器函数装饰的方法定义一个“动作” (如您所料,顺序是相关的)
@decorator1
@decorator2
@decorator3
@decorator4
def foo(arg):
pass
我们最终得到了几种 (+50) 方法,这些方法在我们的代码库中重复这种设计:
@decorator1
@decorator2
@decorator3
@decorator4
def fn1(arg):
pass
...
@decorator1
@decorator2
@decorator3
@decorator4
@decorator5
def fn50(arg):
pass
我想清理这个重复(当@decorator4
被添加到定义中时,我们需要更新 50 多个地方)
我在这里想到了 2 种可能的解决方案(请注意,两种解决方案都是等效的,只是更改了语法):
1.-“装饰者中的装饰者”解决方案
简要地:
@decorator1@decorator2@decorator3@decorator4@master_decorator(enable_optional_decorator=False) 定义 fn1(arg)
这个装饰器需要接受(至少)一个参数来启用/禁用可选装饰器
2.-“包装类”解决方案
class MasterDecorator:
def __init__(self, raw_method, enable_optional_decorator=False):
pass
def __call__(self)
...
# no decorators here
def fn1(arg):
pass
# when calling fn1
MasterDecorator(fn_1)(args)
哪种解决方案会更好?哪个更pythonist?有没有更好的设计来消除这里的重复?
==编辑==
建议的重复:不问如何创建主装饰器,而是询问哪一个是用于清理此重复的 pythonist 设计