改变函数参数的装饰类型修饰符

时间:2020-05-24 21:08:54

标签: python python-3.x type-hinting mypy pyright

我正在创建装饰器,我希望保留typehint。但是,我需要稍微改变返回类型。 Mypy docs包含有关如果修饰后的函数签名与原始签名相同的信息,但是我不确定在更改返回类型后如何执行此操作。

作为示例,这是我的原始功能:

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

当我在编辑器中使用pyright或类似工具查看t_wrap的类型时,它是(*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 个答案:

没有答案