Python-упаковочная функция с подписью - PullRequest
0 голосов
/ 25 июня 2019

Как я могу создать декораторы, которые обертывают функцию с подписью из 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 голосов
/ 25 июня 2019

Все, что вам нужно сделать, это присвоить подпись атрибуту __signature__ функции:

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