繁体   English   中英

可以与包装函数的参数进行交互的装饰器

[英]Decorator that can interact with the wrapped function's arguments

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

不过,这不是很难编写的装饰器,并且可以完成工作(例如,确保值不为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装饰器在错误的位置,它应该在some_other_decorator中的wrapped函数调用中。

您控制其他装饰者吗? 如果是这样,请通过正确包装调用函数来确保它们全部正常播放:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM