如果我定义两个函数,它们将另一个函数及其参数作为参数,以及一个简单函数,如下所示
from typing import Callable, TypeVar, ParamSpec
T1 = TypeVar('T1')
P1 = ParamSpec('P1')
T2 = TypeVar('T2')
P2 = ParamSpec('P2')
def wrapper1(
func: Callable[P1, T1],
*args: P1.args,
**kwargs: P1.kwargs
) -> T1:
return func(*args, **kwargs)
def wrapper2(
func: Callable[P2, T2],
*args: P2.args,
**kwargs: P2.kwargs
) -> T2:
return func(*args, **kwargs)
def func() -> int:
return 1
我尝试像这样链接这三个函数
wrapper1(wrapper2, func)
然后 mypy 在此调用链上报告以下错误:
src/test.py:29: error: Argument 1 to "wrapper1" has incompatible type "Callable[[Arg(Callable[P2, T2], 'func'), **P2], T2]"; expected "Callable[[Arg(Callable[P2, T2], 'func'), **P2], T2]" [arg-type]
src/test.py:29: error: Argument 2 to "wrapper1" has incompatible type "Callable[[], int]"; expected "[Callable[P2, T2], **P2.args]" [arg-type]
如果我避免像这样链接函数,那么 mypy 就不会报告错误:
def w2() -> int:
return wrapper2(func)
wrapper1(w2)
有没有办法注释这些函数,以便接受简单的链接,而不必为第二次调用定义函数?
我正在使用 mypy 1.0.1 和 python 3.11.2。
这似乎是一个已知问题:
我现在正在关注这些问题。当这些 mypy 问题以某种方式解决后,我会更新这个问题。
如果 mypy 使用
--new-type-inference
运行,此问题已在版本 1.6.0 中得到解决(请参阅发行说明中的问题 https://github.com/python/mypy/pull/15896 https://mypy -lang.blogspot.com/2023/10/mypy-16-released.html)。在版本 1.7.0 中,不再需要 --new-type-inference
才能使检查成功,因为新的类型推断算法现在是默认值。