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

设置extra=ignore的Pydantic模型为何从对象实例化后仍含额外属性?

问题解答

核心原因

出现这种情况的关键在于from_attributes=True的配置逻辑,以及Pydantic处理子类模型实例的特殊行为:

  1. from_attributes=True的属性提取逻辑
    当模型设置from_attributes=True时,model_validate会直接从输入对象的属性中读取值,而非先将对象转换为字典再验证。对于TestExtended的实例m,它的属性包含父类Test的a和自身新增的b,model_validate会直接读取这些属性。

  2. 子类转父类时的属性保留机制
    由于TestExtended是Test的子类,Pydantic处理这种子类实例向父类实例转换时,会默认保留原实例的所有属性,即使父类设置了extra='ignore'。这是因为Pydantic认为子类实例已经满足父类的字段要求,不会触发extra规则去过滤不属于父类的属性。

验证与解决

如果要让extra='ignore'生效,需要显式将子类实例转换为字典后再验证:

m_1 = Test.model_validate(m.model_dump())
print(m_1)  # 输出:a=2

此时model_dump()会把m转换为包含所有字段的字典,Test模型的extra='ignore'规则会正常过滤掉不属于自身的b字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:34:59