使用Pydantic时Mypy报Type[T]/UnionType类型不匹配错误求解
解决Mypy报错:Expected type 'Type[T]', got 'UnionType' instead
错误原因
你的Loader.load_models方法参数model_class标注为Type[T],要求传入单个模型类的类型(比如A或B),但实际传入的ModelAOrB = A | B是联合类型(UnionType),两者类型不匹配,因此Mypy抛出错误。而Pydantic的TypeAdapter本身支持直接处理联合类型,只是类型标注需要调整。
修改方案
调整load_models的参数类型标注,允许同时接收单个模型类类型和联合类型,同时保持返回值的类型推断准确性。
修改后的代码
from typing import Iterator, TypeVar, UnionType from pydantic import BaseModel, TypeAdapter class A(BaseModel): x: int class B(BaseModel): y: int T = TypeVar("T", bound=BaseModel) class Loader: def load_models(self, model_class: type[T] | UnionType) -> Iterator[T]: # 模拟从JSON加载数据的逻辑 my_dict = {"x": 1} yield TypeAdapter(model_class).validate_python(my_dict) my_dict = {"y": 2} yield TypeAdapter(model_class).validate_python(my_dict) ModelAOrB = A | B print(list(Loader().load_models(ModelAOrB)))
关键说明
- 将参数标注从
Type[T]改为type[T] | UnionType,明确告知Mypy该参数既可以接受单个模型类,也可以接受联合类型。 - 返回值
Iterator[T]会被Mypy自动推断为Iterator[A | B],符合实际返回的实例类型。 - 该修改完全兼容原有的运行时逻辑,只是修正了静态类型检查的标注问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

