如何在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
相关产品推荐
相关产品推荐

