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

如何让Pydantic自动将Union类型转换为指定单一类型?

实现Pydantic字段自动类型转换

当然可以实现,以下是两种简洁的方案,让Pydantic自动帮你完成类型转换:

方案一:使用字段验证器(Field Validator)

通过@field_validator装饰器定义转换逻辑,在模型实例化时自动处理字段:

from pydantic import BaseModel, field_validator
from typing import Union, List

class Demo(BaseModel):
    id: Union[int, str]
    files: Union[str, List[str]]

    @field_validator('id')
    def convert_id_to_str(cls, value):
        # 无论输入是int还是str,统一转为str
        return str(value)

    @field_validator('files')
    def convert_files_to_list(cls, value):
        # 输入是单个字符串时转为单元素列表,列表则直接返回
        if isinstance(value, str):
            return [value]
        return value

方案二:使用Annotated + 后置验证器(Pydantic v2+)

如果想让转换逻辑更复用、代码更整洁,可以用Annotated结合AfterValidator:

from pydantic import BaseModel, AfterValidator
from typing import Union, List, Annotated

# 定义通用转换函数
def to_str(value) -> str:
    return str(value)

def to_str_list(value) -> List[str]:
    if isinstance(value, str):
        return [value]
    return value

class Demo(BaseModel):
    id: Annotated[Union[int, str], AfterValidator(to_str)]
    files: Annotated[Union[str, List[str]], AfterValidator(to_str_list)]

测试验证

实例化模型后,字段会自动转换为目标类型:

# 测试整数id和单个文件字符串
demo1 = Demo(id=123, files="report.pdf")
print(type(demo1.id))  # 输出: <class 'str'>
print(demo1.files)     # 输出: ['report.pdf']

# 测试字符串id和文件列表
demo2 = Demo(id="user_456", files=["img.jpg", "data.csv"])
print(type(demo2.id))  # 输出: <class 'str'>
print(demo2.files)     # 输出: ['img.jpg', 'data.csv']

两种方案都能让你直接访问转换后的字段,完全不需要手动处理类型转换逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:28:06