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

如何让Pydantic模型传入无效字符串时默认使用StrEnum的X值

解决方法

可以通过自定义验证逻辑实现这个需求,下面提供两种常用方案:

方案一:使用Pydantic的BeforeValidator

在字段上添加前置验证器,判断输入是否为有效的Status枚举值,无效则替换为Status.X:

from pydantic import BaseModel, BeforeValidator
from enum import StrEnum, auto

class Status(StrEnum):
    X = auto()
    Y = auto()

def validate_status(value):
    try:
        return Status(value)
    except ValueError:
        return Status.X

class Foo(BaseModel):
    field_a: Status = BeforeValidator(validate_status)

测试示例:

# 正常输入
foo1 = Foo(field_a="X")
print(foo1.field_a)  # 输出: Status.X

# 无效输入自动替换为X
foo2 = Foo(field_a="srgsefaa")
print(foo2.field_a)  # 输出: Status.X

方案二:在枚举类中扩展验证逻辑

直接在Status枚举类中重写验证逻辑,让它支持自动回退到默认值,这样Foo模型无需额外修改:

from pydantic import BaseModel, GetCoreSchemaHandler
from enum import StrEnum, auto
from pydantic_core import core_schema

class Status(StrEnum):
    X = auto()
    Y = auto()

    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, value, handler: GetCoreSchemaHandler):
        try:
            return cls(value)
        except ValueError:
            return cls.X

class Foo(BaseModel):
    field_a: Status

这种方式下,传入无效字符串时会自动将field_a设为Status.X,不会触发验证错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:48:14