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

Pydantic 2中如何实现枚举字段的字符串自动转换(保留类型提示)

解决方案

针对你的需求,这里提供一个基于Pydantic 2.x before模式验证器的实现,既能让枚举字段支持字符串或枚举实例输入,又能保留字段的纯枚举类型提示:

from enum import Enum
from pydantic import BaseModel, model_validator

class MyEnum(Enum):
    OPTION1 = "option1"
    OPTION2 = "option2"

class MyModel(BaseModel):
    enum_field: MyEnum
    other_field: str

    @model_validator(mode="before")
    def convert_string_enums(cls, values: dict) -> dict:
        # 遍历模型所有字段,自动处理枚举类型字段
        for field_name, field in cls.model_fields.items():
            field_type = field.annotation
            # 判断当前字段是否为枚举类
            if isinstance(field_type, type) and issubclass(field_type, Enum):
                value = values.get(field_name)
                # 仅当值为字符串时尝试转换
                if isinstance(value, str):
                    try:
                        values[field_name] = field_type(value)
                    except ValueError:
                        # 不拦截无效值错误,交给Pydantic默认验证抛出标准异常
                        pass
        return values

# 测试用例1:传入字符串形式的枚举值
test_case_1 = MyModel(enum_field="option1", other_field="test_str")
assert test_case_1.enum_field == MyEnum.OPTION1
assert isinstance(test_case_1.enum_field, MyEnum)

# 测试用例2:传入枚举实例
test_case_2 = MyModel(enum_field=MyEnum.OPTION2, other_field="test_enum")
assert test_case_2.enum_field == MyEnum.OPTION2
assert isinstance(test_case_2.enum_field, MyEnum)

核心细节说明

  • before模式验证器:该验证器在Pydantic默认字段校验前执行,提前将字符串转换为枚举实例,确保后续校验看到的是符合类型提示的枚举对象,避免类型错误。
  • 自动批量处理:通过遍历模型字段并检测枚举类型,实现所有枚举字段的自动转换,无需为每个枚举字段单独编写逻辑。
  • 保留原有校验逻辑:若传入的字符串不是有效枚举值,不捕获ValueError,让Pydantic抛出标准的枚举值无效异常,保持原有校验行为一致。
  • 类型安全:字段类型提示仍为纯枚举类型,依赖该字段的代码不会出现类型检查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:45:14