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

