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

如何用Pydantic实现字典值为字符串列表的类型校验?

问题

期望类的输入格式为:

{'key_name1' : ['str1','str2'],
 'key_name2' : ['str1','str2']}

尝试以下Pydantic代码时触发 IndexError: tuple index out of range 错误:

from pydantic import BaseModel

class blabla(BaseModel):
    val : dict[list[str]]
    def __init__(self,val):
        self.val = val

如何用Pydantic实现该场景的类型校验?

解决方案

问题出在两处:

  1. 字典类型注解错误:Python(及Pydantic)中dict的泛型注解必须明确键和值的类型,格式为dict[KeyType, ValueType]。你写的dict[list[str]]缺少键类型,应改为dict[str, list[str]](假设键为字符串类型)。
  2. 错误重写__init__方法:继承BaseModel的类无需手动重写__init__——Pydantic会自动处理实例化与校验逻辑。若必须重写,必须调用父类的__init__,否则会破坏Pydantic的校验机制。

推荐两种正确实现方式:

方式一:不重写__init__(首选)

直接定义字段与正确类型注解,Pydantic自动完成校验:

from pydantic import BaseModel

class Blabla(BaseModel):
    val: dict[str, list[str]]

# 测试示例
valid_data = {'key_name1': ['str1', 'str2'], 'key_name2': ['str1', 'str2']}
obj = Blabla(val=valid_data)
# 也可直接通过关键字参数传入
obj = Blabla(**valid_data)

方式二:重写__init__(需自定义逻辑时)

若需添加初始化自定义逻辑,务必调用父类构造方法:

from pydantic import BaseModel

class Blabla(BaseModel):
    val: dict[str, list[str]]

    def __init__(self, **kwargs):
        # 在此添加你的自定义初始化逻辑
        super().__init__(**kwargs)
        # 后续自定义代码

# 使用方式不变
valid_data = {'key_name1': ['str1', 'str2'], 'key_name2': ['str1', 'str2']}
obj = Blabla(val=valid_data)

使用上述代码后,若传入不符合格式的数据(比如值不是字符串列表、键非字符串),Pydantic会抛出明确的验证错误,实现预期的类型校验效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:36:02