首页 > 解决方案 > 为几种方法重复装饰器。如何干燥

问题描述

在我们的代码库中,我们曾经为任何使用自定义装饰器函数装饰的方法定义一个“动作” 。

“动作”的定义不断增长,因此添加了更多装饰器。如今,我们为任何用 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 设计

标签: pythondecoratordrypython-decorators

解决方案


推荐阅读