Pydantic V2自定义类型定义:替代arbitrary_types_allowed的更佳方案?
Pydantic V2中自定义类型的最优解决方案
你遇到的问题是Pydantic V2对类型校验规则更严格,默认不允许未注册的自定义类型。直接开启arbitrary_types_allowed=True虽能解决问题,但会放宽全局类型检查,并非最优选择。这里提供一种更严谨的方案,既能让自定义类型被Pydantic识别,又能完整保留类的自定义文档字符串:
实现自定义类型的Pydantic核心Schema
让你的CustomInt类实现__get_pydantic_core_schema__类方法,告诉Pydantic如何处理这个类型。这种方式无需开启全局宽松模式,同时保留类的文档字符串。
示例代码:
from pydantic import BaseModel from pydantic_core import core_schema class CustomInt(int): """Custom int.""" @classmethod def __get_pydantic_core_schema__(cls, source_type, handler): # 获取原生int的核心校验规则 int_schema = handler(int) # 包装int的校验规则,将验证后的结果转换为CustomInt实例 return core_schema.no_info_wrap_validator( lambda value: cls(value), int_schema, ) class CustomModel(BaseModel): """Custom model.""" custom_int: CustomInt
方案优势
- 符合Pydantic V2设计规范:通过注册自定义类型的Schema,让Pydantic原生支持该类型,而非绕过校验逻辑
- 保留文档字符串:
CustomInt的类文档字符串完全保留,生成API文档或类型提示时会正常显示 - 类型检查严谨:不会像
arbitrary_types_allowed=True那样放宽全局校验,避免潜在的类型错误
验证效果
运行代码后,可正常实例化CustomModel,且custom_int字段会被正确转换为CustomInt类型:
model = CustomModel(custom_int=42) print(type(model.custom_int)) # <class '__main__.CustomInt'> print(model.custom_int.__doc__) # Custom int.
内容的提问来源于stack exchange,提问作者SultanOrazbayev
相关产品推荐
相关产品推荐

