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

能否无需创建新BaseModel,用Pydantic反序列化Union类型?

如何直接反序列化带鉴别器的Union类型(无需额外BaseModel)

我想要将数据反序列化为如下定义的Union类型:

from pydantic import BaseModel, Field
from typing import Annotated, Union, Literal

class Foo(BaseModel):
    type: Literal["foo"] = "foo"
    x: int


class Bar(BaseModel):
    type: Literal["bar"] = "bar"
    x: float


Baz = Annotated[Union[Foo, Bar], Field(discriminator="type")]


d = {
  "type": "bar",
  "x": 10.1
}


# Deserialize Baz here

目前我可以通过创建另一个BaseModel来实现反序列化,代码如下:

class Config(BaseModel):
    baz: Baz


model = Config.model_validate({"baz": d})
print(model)  # Outputs: baz=Bar(type='bar', x=10.1)

但我想了解是否可以直接使用Pydantic内置函数,无需创建额外BaseModel来完成该操作?


当然可以,Pydantic v2提供了TypeAdapter工具,能够直接处理这类带鉴别器的Union类型的反序列化,不需要额外定义封装用的BaseModel。

直接实现的代码示例:

from pydantic import TypeAdapter
from pydantic import BaseModel, Field
from typing import Annotated, Union, Literal

class Foo(BaseModel):
    type: Literal["foo"] = "foo"
    x: int


class Bar(BaseModel):
    type: Literal["bar"] = "bar"
    x: float


Baz = Annotated[Union[Foo, Bar], Field(discriminator="type")]


d = {
  "type": "bar",
  "x": 10.1
}

# 直接反序列化Baz类型
adapter = TypeAdapter(Baz)
result = adapter.validate_python(d)
print(result)  # 输出: type='bar' x=10.1

TypeAdapter是Pydantic v2新增的核心工具,专门用于针对单个类型执行验证、序列化和反序列化操作,完全可以替代需要额外封装BaseModel的方案,同时保留鉴别器的自动匹配逻辑。

内容的提问来源于stack exchange,提问作者Tom McLean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:32:09