在python中选择方法与装饰器

时间:2015-01-30 00:24:10

标签: python python-decorators

我有一个类方法,需要在执行" real"之前先进行一些基本的验证。操作

一个明显的实施选择是:

   def _validator(self, args):
       do-validation

   def method_real(self, args):
       self._validator(args)
       do-real-thing

另一个是:

   def validator(fn):
       def _validate(*args, **kwargs):
           do-validation
           return fn(*args, **kwargs)
       return _validate

   @validator
   def method_real(self, args):
       do-real-thing

虽然这里使用了装饰器并且提供了更好的代码可读性和组织,但我想看看是否只为一种方法使用装饰器。这个装饰器不能被类中的其他方法使用,因为它只对该方法进行非常具体的验证。

思想?

1 个答案:

答案 0 :(得分:1)

在我看来,你不需要一个装饰者,这总是一个很好的迹象,表明你并不想要一个。这只是你的基本KISS原则,但除此之外还有更多。对于装饰者来说,你可能没有意识到那里的细微差别,最终会造成弊大于利。至少可以说调试有问题。 Graham Dumpleton has an incredibly informative series of posts了解使用装饰器时可以了解的内容(警告:非常深入)。

如果我是你,我只是简单地描述逻辑,如果它很简单,或者创建一个单独的方法/功能,如果不是。如果您真的只是想让使用此行为的模块变得更清洁",那么使用此验证逻辑创建一个新模块并导入。

另一方面,如果你知道你需要一个装饰者,那么你可能想要一个。