如何让Pydantic针对错误的泛型类型触发验证错误
如何让Pydantic针对错误的泛型类型触发验证错误
嘿,我懂你遇到的问题了——你写了个泛型的Pydantic模型,明明传了不符合指定类型的参数,却没触发预期的验证错误,这确实挺让人困惑的。其实问题出在Pydantic对泛型的默认处理逻辑上,咱们调整一下模型定义或者配置就能解决。
先说说两种常见的Pydantic版本的解决办法:
如果你用的是Pydantic v1版本
在v1里,泛型模型不能直接继承BaseModel+Generic,得专门用GenericModel作为基类,这样Pydantic才能正确识别泛型的类型约束。修改后的代码如下:
from pydantic import GenericModel from typing import TypeVar, Generic T = TypeVar('T') class GenericItem(GenericModel, Generic[T]): item: T # 测试示例 string_item = GenericItem[str](item="example") int_item = GenericItem[int](item=42) # 现在这个会触发预期的验证错误 try: invalid_item = GenericItem[int](item="invalid") except Exception as e: print(f"Validation error: {e}")
如果你用的是Pydantic v2版本
v2支持直接继承BaseModel+Generic,但默认是宽松模式,会尝试自动转换类型(比如把字符串"42"转成int)。如果想要严格禁止类型转换,只接受完全匹配的类型,只需要给模型加上strict=True的配置就行:
from pydantic import BaseModel, ConfigDict from typing import TypeVar, Generic T = TypeVar('T') class GenericItem(BaseModel, Generic[T]): model_config = ConfigDict(strict=True) # 启用严格校验模式 item: T # 测试示例 string_item = GenericItem[str](item="example") int_item = GenericItem[int](item=42) # 这个会触发验证错误,因为"invalid"无法转成int,且严格模式不允许类型转换 try: invalid_item = GenericItem[int](item="invalid") except Exception as e: print(f"Validation error: {e}")
这样修改之后,你再测试传入错误类型的场景,就能看到预期的验证错误提示啦。
备注:内容来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

