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

如何在strict=True模式下用Pydantic实现字典转含枚举的数据类?

问题

现有以下代码可实现将字典转换为包含枚举类型的数据类:

from dataclasses import dataclass
from enum import Enum
from typing import Any, TypeVar

from pydantic import TypeAdapter, parse_obj_as

T = TypeVar('T')

def dict_to_dataclass_2(dict_: dict[Any, Any], dataclass_: type[T]) -> T:
    adapter = TypeAdapter(dataclass_)
    return adapter.validate_python(dict_)


class Color(Enum):
    RED = 'red'
    BLUE = 'blue'

@dataclass
class Fish:
    color: Color

dict_to_dataclass({'color': 'red'}, Fish)

现在希望给validate_python方法传入strict=True参数,同时仍能正常处理枚举类型的转换,该如何实现?

解决方案

直接在validate_python调用时传入strict=True即可,Pydantic默认支持在严格模式下将字符串转换为对应的枚举类型,因为枚举的字符串值属于合法的枚举成员映射。

修改后的完整代码:

from dataclasses import dataclass
from enum import Enum
from typing import Any, TypeVar

from pydantic import TypeAdapter

T = TypeVar('T')

def dict_to_dataclass_2(dict_: dict[Any, Any], dataclass_: type[T]) -> T:
    adapter = TypeAdapter(dataclass_)
    # 传入strict=True参数
    return adapter.validate_python(dict_, strict=True)


class Color(Enum):
    RED = 'red'
    BLUE = 'blue'

@dataclass
class Fish:
    color: Color

# 测试验证
result = dict_to_dataclass_2({'color': 'red'}, Fish)
print(result.color)  # 输出:Color.RED

关键说明

  • Pydantic的strict=True模式主要限制非预期的隐式类型转换(比如字符串转整数、布尔值转数字等),但枚举类型的字符串值与枚举成员的映射属于框架默认支持的合法转换,不会被严格模式拦截。
  • 若枚举基于其他类型(如整数),只要字典中的值与枚举成员的value属性完全匹配,严格模式下同样可以正常转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:12