Pydantic自定义模型传入字典报__init__参数数量不匹配错误如何解决?
报错根因
Pydantic 2.x版本的BaseModel构造函数默认仅支持关键字参数传入,不接受位置参数。你将jsond作为位置参数直接传入SellSideCustomer的构造方法,就会触发参数数量不匹配的报错,并非你实际传入了2个参数,是Pydantic内部的构造方法没有设计接收位置参数的逻辑,传入位置参数就会触发该提示。
修复方案
有两种常用的修复方式:
- 方式一:将字典拆包为关键字参数传入,将实例化代码修改为:
sch = SellSideCustomer(**jsond)
- 方式二:使用Pydantic内置的
model_validate方法传入字典,这种方式更适合动态传参的场景,性能也更优:
sch = SellSideCustomer.model_validate(jsond)
额外注意:字段类型不匹配问题
解决参数报错后你还会遇到类型验证错误,原因是你的SellSideCustomer中creds字段定义为Dict[str, SellSideCreds],要求是「键为字符串、值为SellSideCreds对象的字典」,但你当前传入的jsond里的creds本身就是单个SellSideCreds结构的字典,和定义不匹配。
如果你的需求是creds存储单个凭证,直接修改字段定义即可:
class SellSideCustomer(_BaseModel): creds: SellSideCreds class Config: orm_mode = True
如果要保留Dict[str, SellSideCreds]的定义,需要调整你的jsond结构:
jsond = {"creds": { "mrhowdy": { # 多一层字符串key "user_name":"mrhowdy", "user_pass":"heythere" } } }
内容的提问来源于stack exchange,提问作者avnav99
相关产品推荐
相关产品推荐

