如何将多个SuperHero类实例存入Python字典避免覆盖?
解决FastAPI+Pydantic中SuperHero实例存入字典被覆盖的问题
你遇到的问题本质是字典键冲突:当你直接用ROSTER.update(SHx.dict())时,每个实例的dict()方法返回的字典结构完全一致(比如都包含name、power等键),每次update都会用新值覆盖ROSTER里的同名键,最终只剩最后一个实例的内容。
下面是两种直接有效的解决方式,不需要转列表再转回字典:
方案1:用唯一标识作为字典键批量构建
给每个SuperHero实例分配一个唯一的顶层键(比如英雄名称、自定义ID),用字典推导式一次性构建ROSTER:
from pydantic import BaseModel class SuperHero(BaseModel): name: str power: str team: str # 创建实例 SH1 = SuperHero(name="Iron Man", power="Repulsor Beams", team="Avengers") SH2 = SuperHero(name="Captain America", power="Super Strength", team="Avengers") SH3 = SuperHero(name="Wonder Woman", power="Lasso of Truth", team="Justice League") SH4 = SuperHero(name="Batman", power="Genius Intellect", team="Justice League") # 用英雄名称作为唯一键,直接构建完整字典 ROSTER = {hero.name: hero.dict() for hero in [SH1, SH2, SH3, SH4]}
这样每个实例都对应独立的键,不会出现覆盖问题。
方案2:带唯一键的update调用
如果需要保留逐个update的方式,每次update时传入一个包含唯一顶层键的字典,而不是直接传入实例的dict()结果:
ROSTER = {} # 每次update的是{唯一键: 实例字典}的结构 ROSTER.update({SH1.name: SH1.dict()}) ROSTER.update({SH2.name: SH2.dict()}) ROSTER.update({SH3.name: SH3.dict()}) ROSTER.update({SH4.name: SH4.dict()})
为什么ChainMap和合并没生效?
- ChainMap是逻辑合并多个字典,并没有真正合并成一个物理字典,且如果原字典有重复键,ChainMap会优先取第一个出现的值,不符合你要保留所有实例的需求。
{**ROSTER, **SHx.dict()}这种合并方式,本质和update一样,因为SHx.dict()的键和ROSTER里的键重复,会直接覆盖原有值,所以无法保留所有实例。
内容的提问来源于stack exchange,提问作者K8 Noob
相关产品推荐
相关产品推荐

