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

Pydantic如何限制字典值类型一致性?求非自定义dict子类方案

Pydantic字典字段值类型验证的替代方案

针对你遇到的Dict[str, SelfDefinedClass]无法自动验证值类型的问题,除了自定义dict子类,还有以下几种推荐实现方式:

1. 使用字段验证器(Pydantic 2.x)

通过@field_validator装饰器手动校验字典中的每个值,还能自动尝试将原始数据解析为目标模型:

from typing import Dict
from pydantic import BaseModel, field_validator
from pydantic_core import ValidationError

class SelfDefinedClass(BaseModel):
    name: str

class TableModel(BaseModel):
    table: Dict[str, SelfDefinedClass]

    @field_validator('table')
    def check_dict_values(cls, value):
        for key, val in value.items():
            if not isinstance(val, SelfDefinedClass):
                try:
                    value[key] = SelfDefinedClass.model_validate(val)
                except ValidationError:
                    raise ValueError(f"键 {key} 对应的值 {val} 不符合SelfDefinedClass的格式要求")
        return value

2. 使用Annotated结合前置验证器(Pydantic 2.x)

将验证逻辑封装为独立函数,通过BeforeValidator注入,更利于逻辑复用:

from typing import Dict, Annotated
from pydantic import BaseModel, BeforeValidator
from pydantic_core import ValidationError

class SelfDefinedClass(BaseModel):
    name: str

def validate_table_values(raw_dict: Dict[str, any]) -> Dict[str, SelfDefinedClass]:
    validated_dict = {}
    for k, v in raw_dict.items():
        try:
            validated_dict[k] = SelfDefinedClass.model_validate(v)
        except ValidationError:
            raise ValueError(f"键 {k} 的值 {v} 无法解析为SelfDefinedClass")
    return validated_dict

class TableModel(BaseModel):
    table: Annotated[Dict[str, any], BeforeValidator(validate_table_values)]

3. 直接使用模型解析(适用于外部数据注入场景)

如果字典数据来自外部输入(比如JSON),可以在实例化时主动解析每个值:

# 假设raw_data是外部传入的字典
raw_data = {"table": {"item1": {"name": "test"}, "item2": {"name": "demo"}}}
validated_table = {k: SelfDefinedClass(**v) for k, v in raw_data["table"].items()}
model = TableModel(table=validated_table)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:45:04