2

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

不过,这并不是一个难以编写的装饰器,并且可以完成工作(例如,确保值不是 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装饰器放错了地方,它应该wrappedsome_other_decorator.

4

1 回答 1

0

你能控制其他装饰器吗?如果是这样,请通过正确包装调用函数来确保它们都运行良好:

  import functools
  def check_arg(func):
      @functools.wraps(func)
      def wrapped(value):
          assert value is not None
          func(value)
      return wrapped
于 2013-02-07T14:06:31.767 回答