我正在尝试构建一个可以检查包装函数参数的装饰器,需要的上下文是允许在它们命中函数之前更容易验证某些参数,避免在需要检查的每个地方检查锅炉板/验证。
这不是一个很难写的装饰器,这可以完成工作(例如确保一个值不是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
函数调用中。
答案 0 :(得分:0)
你是否掌控其他装饰者?如果是这样,请确保所有这些都正常运行 包装调用函数:
import functools
def check_arg(func):
@functools.wraps(func)
def wrapped(value):
assert value is not None
func(value)
return wrapped