3

我正在创建一个装饰器,我希望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

我缺少的是如何处理...- 我想定义 aTypeVar A来表示参数列表,但我不知道如何处理。

4

0 回答 0