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

使用Cerberus校验顶层字典列表时的报错问题问询

Cerberus校验顶层字典列表的正确实现方式

错误原因说明

  • 第一个cerberus.validator.DocumentError报错:Cerberus默认期望待校验的输入是字典结构,直接传入列表会触发类型不匹配错误。
  • 第二个cerberus.schema.SchemaError报错:Cerberus的默认Schema结构要求顶层是字段规则映射(字典格式),如果直接将顶层规则写为{"type": "list"},Cerberus会将其识别为「名为type的字段的校验规则」,而规则值要求必须是字典,因此触发报错。

正确校验方案

方案1:调用validate方法时传入顶层列表规则(推荐)

不需要对原始数据做任何包装,在校验时直接将列表规则作为validate方法的第二个参数传入即可,适配Cerberus 1.2及以上版本:

from cerberus import Validator

# 定义列表内部单个字典元素的校验规则
item_schema = {
    "key": {"type": "string", "required": True}
    # 可自行扩展其他字段的校验规则
}

# 定义顶层列表的校验规则
list_schema = {
    "type": "list",
    "schema": {
        "type": "dict",
        "schema": item_schema
    },
    # 可补充列表维度的校验规则,比如最小/最大长度
    "minlength": 1,
    "maxlength": 100
}

v = Validator()
# 直接传入待校验的顶层列表,第二个参数传入列表规则
is_valid = v.validate([{"key": "value"}, {"key": "value2"}], list_schema)

if not is_valid:
    # 打印校验错误信息
    print(v.errors)

方案2:包装为临时字典校验

如果需要兼容旧版本Cerberus,可以将待校验列表包装为一个临时字典的字段值,再定义对应字段的规则:

from cerberus import Validator

item_schema = {
    "key": {"type": "string", "required": True}
}

# 定义包装字段的校验规则
schema = {
    "data": {
        "type": "list",
        "schema": {"type": "dict", "schema": item_schema},
        "minlength": 1
    }
}

v = Validator(schema)
# 把待校验列表包装到data字段中
is_valid = v.validate({"data": [{"key": "value"}, {"key": "value2"}]})

if not is_valid:
    # 错误信息会放在data键下
    print(v.errors["data"])

临时方案说明

你当前使用的遍历逐个校验的方案也可正常使用,适合需要单独统计每个元素错误的场景,性能上和上述通用方案差异不大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:36:02