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

Python如何校验函数输入为元素是int/float的二维嵌套列表?

Python 严格校验指定嵌套列表格式的实现方法

针对需要校验的[[s1, e1], [s2, e2], ...]格式(所有端点为int/float类型),以下是两种可直接落地的方案:

方案1:原生Python实现(无第三方依赖)

不需要额外安装包,直接分层实现校验逻辑即可。注意Python中bool是int的子类,若不单独判断会将True/False误识别为合法数值,建议加上布尔值排除逻辑。

def validate_interval_format(input_val):
    # 校验最外层为列表
    if not isinstance(input_val, list):
        raise TypeError(f"输入必须为列表类型,当前类型:{type(input_val)}")
    
    for item_idx, interval in enumerate(input_val):
        # 校验每个区间元素为列表
        if not isinstance(interval, list):
            raise TypeError(f"第{item_idx}个区间必须为列表类型,当前类型:{type(interval)}")
        # 校验每个区间长度固定为2
        if len(interval) != 2:
            raise ValueError(f"第{item_idx}个区间必须包含2个端点值,当前长度:{len(interval)}")
        # 校验端点为int/float,排除布尔值
        for point_idx, point_val in enumerate(interval):
            if isinstance(point_val, bool) or not isinstance(point_val, (int, float)):
                raise TypeError(f"第{item_idx}个区间的第{point_idx}个端点必须为int/float类型,非法值:{point_val},类型:{type(point_val)}")
    return True

在函数入口直接调用即可,需要断言的话直接写:
assert validate_interval_format(your_input_arg), "输入不符合[[s1,e1], [s2,e2]...]格式要求"

方案2:使用Pydantic校验(适合多校验规则场景)

如果项目中存在大量数据格式校验需求,不需要手写重复校验逻辑,可以用Pydantic定义数据模型自动完成严格校验,错误提示更清晰,也支持自定义扩展规则。

from typing import List, Union
from pydantic import RootModel, conlist, ValidationError

# 定义单个区间格式:固定长度2,元素为int/float
class Interval(conlist(Union[int, float], min_length=2, max_length=2)):
    @classmethod
    def __get_pydantic_core_schema__(cls, source_type, handler):
        from pydantic_core import core_schema
        base_schema = handler(source_type)
        # 追加布尔值排除校验
        def exclude_bool_validator(val, handler):
            if any(isinstance(v, bool) for v in val):
                raise TypeError("区间端点不能为布尔类型")
            return handler(val)
        return core_schema.no_info_wrap_validator_function(exclude_bool_validator, base_schema)

# 定义整体输入格式
class IntervalListInput(RootModel[List[Interval]]):
    pass

# 函数入口使用示例
def your_process_func(input_data):
    try:
        valid_data = IntervalListInput.model_validate(input_data).root
    except ValidationError as e:
        raise ValueError(f"输入格式不合法:{e}") from e
    # 后续业务逻辑直接使用校验通过的valid_data即可

注意:如果你的业务场景允许布尔值作为数值传入(不推荐,容易引发隐蔽计算bug),直接删除对应布尔值校验的代码段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:15:42