在Decorator python 2中保留签名

时间:2017-02-21 04:56:58

标签: python python-2.7 typeerror python-decorators

我正在编写一个装饰器,它会在函数调用中捕获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。

2 个答案:

答案 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中的最佳解决方案。