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

如何在Pydantic中为未传值字段设置默认Model实例?

实现Pydantic模型字段默认使用指定Model实例而非None

问题场景

我是Pydantic新手,想要实现:当Pydantic模型字段未传入值时,自动使用指定的默认Model实例而非None。现有代码如下:

from typing import Optional, List
from pydantic import BaseModel

class FieldInfo(BaseModel):
    value: Optional[str] = ""
    confidence: Optional[float] = -1.0

class UserInfo(BaseModel):
    first_name: Optional[FieldInfo]
    last_name: Optional[FieldInfo]

# 传入完整数据时
user_info = {"user":{"first_name":["john",0.98], "last_name":["doe",0.98]}}
user = UserInfo(**{k:{"value":v[0],"confidence":v[1]} for k,v in user_info["user"].items()})
print(user)

输出:

first_name=FieldInfo(value='john', confidence=0.98) last_name=FieldInfo(value='doe', confidence=0.98)

但当last_name未传入时:

user_info = {"user":{"first_name":["john",0.98]}}
user = UserInfo(**{k:{"value":v[0],"confidence":v[1]} for k,v in user_info["user"].items()})
print(user)

输出为:

first_name=FieldInfo(value='john', confidence=0.98) last_name=None

希望未传值时自动使用FieldInfo的默认值,得到如下输出:

first_name=FieldInfo(value='john', confidence=0.98) last_name=FieldInfo(value='', confidence=-1.0)

解决方案

只需给UserInfo中的字段设置默认值为FieldInfo()实例即可,根据需求可以选择两种实现方式:

方案1:不允许字段为None

如果不需要支持手动传入None,可以直接去掉Optional并设置默认实例:

from typing import Optional
from pydantic import BaseModel

class FieldInfo(BaseModel):
    value: Optional[str] = ""
    confidence: Optional[float] = -1.0

class UserInfo(BaseModel):
    # 直接设置默认值为FieldInfo实例
    first_name: FieldInfo = FieldInfo()
    last_name: FieldInfo = FieldInfo()

# 测试完整数据
user_info = {"user":{"first_name":["john",0.98], "last_name":["doe",0.98]}}
user = UserInfo(**{k:{"value":v[0],"confidence":v[1]} for k,v in user_info["user"].items()})
print(user)
# 输出:first_name=FieldInfo(value='john', confidence=0.98) last_name=FieldInfo(value='doe', confidence=0.98)

# 测试缺失last_name的情况
user_info = {"user":{"first_name":["john",0.98]}}
user = UserInfo(**{k:{"value":v[0],"confidence":v[1]} for k,v in user_info["user"].items()})
print(user)
# 输出:first_name=FieldInfo(value='john', confidence=0.98) last_name=FieldInfo(value='', confidence=-1.0)

方案2:允许字段为None(同时保留默认实例)

如果需要支持手动传入None,可以保留Optional并指定默认值:

class UserInfo(BaseModel):
    first_name: Optional[FieldInfo] = FieldInfo()
    last_name: Optional[FieldInfo] = FieldInfo()

# 测试传入None的情况
user = UserInfo(first_name=None)
print(user)
# 输出:first_name=None last_name=FieldInfo(value='', confidence=-1.0)

原理说明

原代码中仅声明了字段类型为Optional[FieldInfo],未设置默认值,Pydantic会将未传入的字段默认设为None。通过给字段显式指定默认值为FieldInfo(),就能在未传入该字段时自动使用FieldInfo的默认实例,满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:10:17