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

如何让Pydantic StrictFloat对float("nan")抛出验证错误?

解决Pydantic StrictFloat允许NaN的验证问题

Pydantic的StrictFloat默认会将float("nan")视为合法的float类型,因此不会触发验证错误。要实现拦截NaN的需求,最简方案是添加自定义验证逻辑,以下分版本给出具体实现:

方法一:字段验证器(Pydantic v2,最简改动)

直接给模型添加field_validator,检查列表中的每个元素是否为NaN:

from typing import List, Union
from pydantic import BaseModel, StrictFloat, StrictInt, field_validator
import math

class StrictNumbers(BaseModel):
    values: List[Union[StrictFloat, StrictInt]]

    @field_validator('values', mode='after', each_item=True)
    def reject_nan(cls, item):
        if isinstance(item, float) and math.isnan(item):
            raise ValueError("不允许使用NaN值")
        return item

# 此时会抛出验证错误
my_model = StrictNumbers(values=[1, 2.0, float("nan")])

方法二:自定义无NaN严格浮点类型(复用场景)

如果多个字段需要拦截NaN,可以自定义继承自StrictFloat的类型,内置NaN检查逻辑:

from typing import List, Union
from pydantic import BaseModel, StrictFloat, StrictInt, GetCoreSchemaHandler
from pydantic_core import core_schema
import math

class NonNanStrictFloat(StrictFloat):
    @classmethod
    def __get_pydantic_core_schema__(cls, source_type, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema:
        base_schema = handler(source_type)
        return core_schema.no_info_before_validator_function(
            lambda x: x if not math.isnan(x) else ValueError("NaN值不被允许"),
            base_schema
        )

class StrictNumbers(BaseModel):
    values: List[Union[NonNanStrictFloat, StrictInt]]

# 触发验证错误
my_model = StrictNumbers(values=[1, 2.0, float("nan")])

Pydantic v1 兼容方案

若使用Pydantic v1,改用validator装饰器实现:

from typing import List, Union
from pydantic import BaseModel, StrictFloat, StrictInt, validator
import math

class StrictNumbers(BaseModel):
    values: List[Union[StrictFloat, StrictInt]]

    @validator('values', each_item=True)
    def reject_nan(cls, item):
        if isinstance(item, float) and math.isnan(item):
            raise ValueError("不允许使用NaN值")
        return item

# 触发验证错误
my_model = StrictNumbers(values=[1, 2.0, float("nan")])

最简选择

仅针对当前模型的单个字段验证时,直接添加field_validator(v2)或validator(v1)是代码改动最小的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:05:17