可以与包装函数的参数交互的Decorator

时间:2013-02-07 14:04:18

标签: python decorator

我正在尝试构建一个可以检查包装函数参数的装饰器,需要的上下文是允许在它们命中函数之前更容易验证某些参数,避免在需要检查的每个地方检查锅炉板/验证。

这不是一个很难写的装饰器,这可以完成工作(例如确保一个值不是None):

def check_arg(func):
    def wrapped(value):
        assert value is not None
        func(value)
    return wrapped

上面的例子不是生产代码,它只是一个可行的例子,但是当装饰函数可以使用其他装饰器时,问题就变得明显了。

在这种情况下,上面的装饰器示例将不起作用,因为value现在可以是另一个装饰器。我可以在这里添加另一个嵌套函数,但看起来应该有更好的方法以编程方式处理它,而且,只要装饰器的数量发生变化,它就会中断。

我怎样才能获得包装函数的参数,无论它使用多少装饰器?

编辑:我应该注意到,我不是简单地堆叠装饰器,而是使用一个装饰可重复使用装饰器的装饰器。在上面的示例中,我将在此上下文中重复使用它:

@check_arg
def some_other_decorator(func):
    def wrapped(*args, **kw):
        ... # some interaction here
    return wrapped

在编写此编辑时,我意识到check_arg装饰器位于错误的位置,它应该位于wrapped内的some_other_decorator函数调用中。

1 个答案:

答案 0 :(得分:0)

你是否掌控其他装饰者?如果是这样,请确保所有这些都正常运行 包装调用函数:

  import functools
  def check_arg(func):
      @functools.wraps(func)
      def wrapped(value):
          assert value is not None
          func(value)
      return wrapped