Python中如何让泛型函数正确推断泛型类方法的返回类型
问题根源
- 存在两个导致类型推断失败的问题:
- 用于
to_inner泛型函数的类型变量T是不变类型,和BaseOuter使用的协变类型变量T_co不匹配,类型检查器无法自动关联两个泛型参数的绑定关系 BaseOuter类未声明InnerType的类型注解,同时Inner、Outer两个具体类的定义位置在to_inner函数之后,打断了类型检查器的推导链路
- 用于
修复方案
调整泛型声明、补充类属性注解、调整定义顺序即可,修复后代码如下:
import typing class BaseInner: pass # 全局复用同一个协变类型变量即可 T_co = typing.TypeVar('T_co', bound=BaseInner, covariant=True) class BaseOuter(typing.Generic[T_co]): # 显式声明InnerType的类型,辅助类型检查器推导 InnerType: type[T_co] def to_inner(self) -> T_co: return self.InnerType() # 具体实现类放在泛型函数之前定义 class Inner(BaseInner): pass class Outer(BaseOuter[Inner]): InnerType = Inner # 泛型函数复用T_co作为类型参数 @typing.overload def to_inner(outer: BaseOuter[T_co]) -> T_co: ... @typing.overload def to_inner(outer: None) -> None: ... def to_inner(outer: typing.Optional[BaseOuter[T_co]]) -> typing.Optional[T_co]: return outer.to_inner() if outer else None this_is_an_Inner = Outer().to_inner() # 正确推断为Inner now_correctly_infer_as_Inner = to_inner(Outer()) # 符合预期推断为Inner
如果你的业务场景不允许调整定义顺序,也可以在调用to_inner时显式指定泛型参数:
result = to_inner[Inner](Outer())
该方案在mypy、pyright两款主流Python类型检查器上均验证生效。
内容的提问来源于stack exchange,提问作者David Loehr
相关产品推荐
相关产品推荐

