关于Mypy中Union与List类型推断的疑问及优化方案咨询
Mypy中Union与List结合时的类型推断问题及解决方法
问题原因
Mypy的静态类型检查是基于类型可能性的静态分析,而非运行时的实际执行逻辑。当参数a被标注为Union[type[A], type[B]]时,Mypy无法在静态阶段确定a到底对应A还是B的类类型——哪怕你在代码中多次调用a()时实际只会生成同一种实例,Mypy仍会默认假设每次调用a()都可能返回Union分支中的任意一种类型,因此生成的列表会被推断为list[Union[A, B]],而非你预期的Union[list[A], list[B]]。
解决方案:使用泛型约束类型
要让Mypy正确识别返回的是同质列表,需要用TypeVar定义泛型,绑定a的具体类型,让类型检查器能跟踪到a对应的实例类型:
from typing import TypeVar, Type class A: pass class B: pass # 定义泛型变量T,限定只能是A或B的实例类型 T = TypeVar('T', A, B) def f(items, a: Type[T]) -> list[T]: return [a() for x in items]
如果需要适配更多同类型的子类,也可以用bound来限定范围:
from typing import TypeVar, Type, Union T = TypeVar('T', bound=Union[A, B]) def f(items, a: Type[T]) -> list[T]: return [a() for x in items]
写法说明
Type[T]表示a是T对应的类类型(比如传入A则T为A,传入B则T为B)- 返回类型
list[T]明确表示返回的是由同一种T类型实例组成的列表,Mypy会根据传入的a自动推断出具体的列表类型(list[A]或list[B]),完全符合你对同质列表的预期。
内容的提问来源于stack exchange,提问作者user18227573
相关产品推荐
相关产品推荐

