Skip to main content
 首页 » 编程设计

python之可以与包装函数的参数交互的装饰器

2025年05月04日10pengyingh

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

虽然这不是一个很难编写的装饰器,但它完成了工作(例如确保一个值不是 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.

请您参考如下方法:

你能控制其他装饰器吗?如果是这样,确保他们都玩得很好 包装调用函数:

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