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

求助:Pydantic Generic BaseModel验证Python实例失败但字典验证成功

Pydantic泛型模型实例传入验证失败问题

在Python 3.11.8、Pydantic 2.7.1环境下,出现以下异常:定义泛型BaseModel后,使用原始字典进行验证可成功,但直接传入Python实例(或包含实例的字典)验证却失败。

泛型模型定义代码

from typing import Generic, TypeVar

from pydantic import BaseModel

U = TypeVar("U")


class M1(BaseModel, Generic[U]):
    a: list[U]
    b: list[U]


class M2(BaseModel):
    a: str
    m1: M1[int]

不同验证场景表现

1. 原始字典验证(成功)

m2 = M2.model_validate(
    {
        "a": "s",
        "m1": {
            "a": [1],
            "b": [2]
        }
    }
)

2. 直接传入Python实例(失败)

m2 = M2(
    a="s",
    m1=M1(
        a=[1],
        b=[2]
    )
)  # 验证失败

3. 传入包含实例的字典(失败)

m2 = M2.model_validate(
    dict(
        a="s",
        m1=M1(
            a=[1],
            b=[2]
        )
    )
)

问题原因与解决方法

原因

创建M1实例时未显式指定泛型参数int,此时得到的是未绑定泛型参数的M1实例,而M2的m1字段要求的是M1[int]类型的实例,类型不匹配导致验证失败。

解决方法

方法一:显式指定泛型参数

创建M1实例时明确指定泛型参数,确保实例类型与M2字段的类型注解一致:

m2 = M2(
    a="s",
    m1=M1[int](
        a=[1],
        b=[2]
    )
)

方法二:将实例转为字典验证

调用model_validate时,先把M1实例转成字典格式:

m2 = M2.model_validate(
    dict(
        a="s",
        m1=M1(a=[1], b=[2]).model_dump()
    )
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:44:58