如何从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对象以准确获得我想要的签名。
答案 0 :(得分:-1)
您需要做的就是将签名分配给函数的__signature__
属性:
def wrap_with_signature(signature):
def wrapper(func):
func.__signature__ = signature
return func
return wrapper