带签名的python包装函数

时间:2019-06-25 12:15:57

标签: python python-decorators

如何从inspect.Signature对象本身而不是函数中创建带有签名的包装装饰器。

请考虑以下内容:

>>> import functools
>>> import inspect
>>>
>>> def foo(a, b: int, c=0, d:float=1.0) -> float:
...     return a + (c * b) ** d
>>> @functools.wraps(foo)
... def bar(*args, **kwargs):
...     return sum(kwargs.values())
>>> print(inspect.signature(foo))
(a, b: int, c=0, d: float = 1.0) -> float
>>> print(inspect.signature(bar))
(a, b: int, c=0, d: float = 1.0) -> float

我想要一个函数wrap_with_signature,其输入为inspect.Signature对象,并返回一个修饰符,如下所示:

foo_signature = inspect.signature(foo)
@wrap_with_signature(foo_signature)  # parametrize with signature instead of function
def bar(*args, **kwargs):
    return sum(kwargs.values())

为什么?因为它可以让我编辑Signature对象以准确获得我想要的签名。

1 个答案:

答案 0 :(得分:-1)

您需要做的就是将签名分配给函数的__signature__属性:

def wrap_with_signature(signature):
    def wrapper(func):
        func.__signature__ = signature
        return func
    return wrapper