Декораторы подбора типов, которые изменяют аргументы функции

Я создаю декоратор и хочу typehintбыть сохраненным. Однако мне нужно немного изменить возвращаемый тип. Документы Mypy содержат информацию о том, как это сделать, если ваша оформленная сигнатура функции такая же, как и исходная, но я не уверен, как это сделать, если тип возвращаемого значения изменен.

В качестве примера приведу мою исходную функцию:

async def simple_func(a: int) -> int:
    'Simple sleeper function to test calling mechanics'
    return a + 1

Имеет подпись (int) -> Awaitable[int].

Вот как я его использую:

    t_wrap = make_sync(simple_func)
    _ = get_event_loop()
    assert t_wrap(4) == 5

Когда я смотрю на тип t_wrap используя pyright или аналогичный инструмент в моем редакторе, это (*args, **kwargs) -> int, скорее, чем (int) -> int.

Моя функция декоратора выглядит следующим образом:

from functools import wraps
from typing import Callable, TypeVar
R = TypeVar('R')

def make_sync(fn: Callable[..., Awaitable[R]]) -> Callable[..., R]:
    @wraps(fn)
    def sync_version_of_function(*args, **kwargs):
        stuff stuff stuff
        r = fn(*args, **kwargs)
        stuff stuff stuff
    return sync_version_of_function

Что мне не хватает, так это как справиться с ... - Я бы хотел определить TypeVar A чтобы представить список аргументов, но я не могу понять, как к этому подойти.

0 ответов

Другие вопросы по тегам