我正在编写一个装饰器,它会在函数调用中捕获TypeError中不正确数量的参数,并将打印自定义消息。代码在这里:
import inspect
def inspect_signature(f):
def decorate(*args, **kwargs):
try:
f(*args, **kwargs)
except TypeError as e:
print('Failed to call "{}" with signature {}. Provided args={} and kwargs={}.'.format(
f.__name__, inspect.getargspec(f).args, args, kwargs))
return f
return decorate
@inspect_signature
def func(foo, bar):
pass
func('a')
func('a', 'b')
我得到以下输出:
Failed to call "func" with signature ['foo', 'bar']. Provided args=('a',) and kwargs={}.
Called successfully with foo=a, bar=b
ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)
功能签名为空。请给我一个解决方案,我该如何保留它?
PS:我使用的是python2,无法切换到python3。
答案 0 :(得分:0)
你错过了这里。 func(* foo,** bar)
在您的情况下,func('a')
无效,因为您为其提供了固定的arg。
您需要将可变数量的参数传递给函数
@inspect_signature
def func(*foo, **bar):
pass
答案 1 :(得分:0)
您可以参考Preserving signatures of decorated functions。
总之,您可以在Python2和Python3中使用 decorator
模块。使用Python3.4 +时,可以使用inspect.wraps
来保留修饰函数的签名。
如果您不想使用decorator
模块,可以使用eval
制作装饰器。一般来说,eval
不受欢迎,因此,decorator
模块可能是Python2中的最佳解决方案。