如何用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实现该场景的类型校验?
解决方案
问题出在两处:
- 字典类型注解错误:Python(及Pydantic)中
dict的泛型注解必须明确键和值的类型,格式为dict[KeyType, ValueType]。你写的dict[list[str]]缺少键类型,应改为dict[str, list[str]](假设键为字符串类型)。 - 错误重写
__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
相关产品推荐
相关产品推荐

