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

Pydantic中ConfigDict(use_enum_values=True)默认值无效,如何设默认值并禁改?

Pydantic枚举默认值与字段权限问题解决

问题1:设置枚举字段默认值,使model_dump输出枚举值

当配置ConfigDict(use_enum_values=True)时,直接使用枚举实例作为默认值会导致实例化后字段保留枚举对象,而用户传入枚举实例时会被自动转换为对应值。要让默认值在序列化时输出枚举值,只需将默认值设为枚举的值而非枚举实例,同时保持字段类型注解为枚举类型:

from enum import Enum
from pydantic import BaseModel, ConfigDict

class X(Enum):
    x = "X"
    y = "Y"
    z = "Z"

class A(BaseModel):
    model_config = ConfigDict(use_enum_values=True, frozen=True)
    # 使用枚举值作为默认值,类型注解仍为枚举类型
    x: X = X.x.value

# 测试结果
>>> A()
A(x='X')
>>> A().model_dump()
{'x': 'X'}

Pydantic会自动将字符串值验证并转换为对应的枚举实例,use_enum_values=True会在序列化时将其转回枚举值,满足序列化需求。

问题2:禁止用户设置字段,由模型自行初始化

要禁止用户在实例化时指定该字段,同时让模型自动初始化默认值,可使用Field(init=False)参数,该字段将不会出现在模型的构造函数参数中,用户无法传入值覆盖:

from enum import Enum
from pydantic import BaseModel, ConfigDict, Field

class X(Enum):
    x = "X"
    y = "Y"
    z = "Z"

class A(BaseModel):
    model_config = ConfigDict(use_enum_values=True, frozen=True)
    # init=False 禁止用户传入该字段,同时设置固定默认值
    x: X = Field(default=X.x.value, init=False)

# 测试结果
>>> A()
A(x='X')
>>> A(x=X.y)  # 触发错误:TypeError: A.__init__() got an unexpected keyword argument 'x'
>>> A().model_dump()
{'x': 'X'}

若需动态初始化该字段,可结合model_post_init方法实现自定义逻辑:

class A(BaseModel):
    model_config = ConfigDict(use_enum_values=True, frozen=True)
    x: X = Field(init=False)

    def model_post_init(self, __context) -> None:
        # 自定义初始化逻辑,例如根据其他字段动态赋值
        self.x = X.x.value

这样既保证用户无法修改该字段,又能灵活控制字段的初始化值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:49