python 带签名的包装函数

python wrapping function with signature

如何从 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 对象和 returns 一个装饰器,这样:

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 对象以获得我想要的签名。

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

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