我正在尝试构建一个可以检查包装函数的参数的装饰器,需要的上下文是允许在某些参数到达函数之前更容易地验证它们,避免在我需要检查/验证的每个地方进行检查的样板。
不过,这并不是一个难以编写的装饰器,并且可以完成工作(例如,确保值不是 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
.