我正在创建装饰器,我希望保留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
来表示参数列表,但我不知道找出解决方法。