You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 07:45:08