Mypy报错相同类型不兼容:ParamSpec与Concatenate使用问题
解决ParamSpec与Concatenate结合使用时的Mypy类型报错问题
你的核心问题在于TestClass未将P1和T1纳入泛型参数列表,导致Mypy无法正确绑定可调用对象的参数与返回值类型,进而在调用test_function时出现类型不匹配错误。以下是具体修复方案:
修复步骤
- 扩展类的泛型参数:将
P1和T1添加到TestClass的Generic声明中,让类实例化时能明确绑定这两个泛型的具体类型。 - 明确类型绑定逻辑:通过泛型参数的绑定,Mypy可准确识别
method的参数结构,确保传递给test_function时类型完全匹配。
修复后的代码
from collections.abc import Callable from typing import Concatenate, Generic, ParamSpec, TypeVar T0 = TypeVar("T0") P1 = ParamSpec("P1") T1 = TypeVar("T1") # 将P1和T1加入类的泛型参数列表 class TestClass(Generic[T0, P1, T1]): def __init__(self, obj: T0, method: Callable[Concatenate[T0, P1], T1]) -> None: self.obj = obj self.method = method P2 = ParamSpec("P2") T2 = TypeVar("T2") def test_function(func: Callable[P2, T2], *args: P2.args, **kwargs: P2.kwargs) -> T2: return func(*args, **kwargs) # 此时Mypy可正确推断P1为空参数列表,T1为int类型 t = TestClass(1, lambda i: i) print(test_function(t.method, t.obj))
错误原因解析
原代码中TestClass仅声明Generic[T0],P1和T1属于未绑定的游离泛型参数,Mypy无法确定method的完整参数签名。调用test_function时,Mypy无法将int类型的t.obj与模糊的P1.args类型匹配,从而抛出错误。扩展泛型参数后,类实例化时会自动将P1绑定为无额外参数的空列表、T1绑定为int,类型匹配问题自然解决。
内容的提问来源于stack exchange,提问作者CaptainCat
相关产品推荐
相关产品推荐

