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

如何在Pydantic中超出范围时将参数设为None

实现超出范围自动设为None的Pydantic模型

下面是可运行的Pydantic v2版本代码,完美实现你要的需求:

from typing import Optional, Annotated
from pydantic import BaseModel, Field, field_validator

class FooClass(BaseModel):
    foo_val: Optional[Annotated[float, Field(ge=-90, le=90, validate_default=False)]] = None

    @field_validator('foo_val', mode='before')
    @classmethod
    def check_foo_val(cls, v):
        # 先处理传入None的情况
        if v is None:
            return None
        # 获取字段定义的范围限制
        field_info = cls.model_fields['foo_val'].field_info
        # 超出范围就返回None,否则返回原值
        if not (field_info.ge <= v <= field_info.le):
            return None
        return v

关键细节说明

  • 用model_fields替代旧版的__fields__:这是Pydantic v2的标准写法,旧版属性已经被废弃
  • Field参数validate_default=False:关闭Pydantic自带的范围校验,不然它会在我们的自定义逻辑之前就抛出验证错误
  • 验证器加mode='before':确保在Pydantic做类型转换(比如把字符串转成float)之前,先执行我们的校验逻辑
  • 先判断v是否为None:避免传入非数值类型时出现不必要的报错
  • 范围判断用连续比较:逻辑更简洁,可读性更好

测试示例

# 测试不同输入的结果
print(FooClass(foo_val=100))  # 输出: foo_val=None
print(FooClass(foo_val=-100)) # 输出: foo_val=None
print(FooClass(foo_val=45))   # 输出: foo_val=45.0
print(FooClass(foo_val=None)) # 输出: foo_val=None

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:36:08