如何在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
相关产品推荐
相关产品推荐

