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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:46:08