使用Pydantic的JsonFeedOptions时遇TypeError:validate()参数数量错误
解决Pydantic中model_validate报错:TypeError: validate() takes 2 positional arguments but 3 were given
问题场景
这是我的JsonFeedOptions类:
from typing import Optional, Union from pydantic import BaseModel # 假设AddressType、AccountAPI、FeedType为已定义类型 class JsonFeedOptions(BaseModel): address: Optional[AddressType] = None signer: Optional[Union[AccountAPI, str]] = None Type: Optional[FeedType] = None
我用这段代码验证数据:
opts = {"signer": "abcd"} options = JsonFeedOptions.model_validate(opts)
结果触发了错误:
> options = JsonFeedOptions.model_validate(opts) E TypeError: validate() takes 2 positional arguments but 3 were given
原因分析及解决办法
1. Pydantic版本不匹配
model_validate是Pydantic v2新增的方法,如果你的环境安装的是v1版本,调用该方法就会报错。
- 若继续使用v1:将
model_validate替换为v1的parse_obj方法
options = JsonFeedOptions.parse_obj(opts)
- 若升级到v2:先执行升级命令
pip install --upgrade pydantic
升级后即可正常使用model_validate。
2. 自定义validate方法参数错误
如果你的BaseModel或JsonFeedOptions类中自定义了validate方法,参数不符合Pydantic要求也会触发该错误。
比如在Pydantic v2中,自定义模型验证方法需按如下格式编写:
from pydantic import model_validator class JsonFeedOptions(BaseModel): address: Optional[AddressType] = None signer: Optional[Union[AccountAPI, str]] = None Type: Optional[FeedType] = None @model_validator(mode='before') @classmethod def validate(cls, values): # 自定义验证逻辑示例 if 'signer' in values and not isinstance(values['signer'], (AccountAPI, str)): raise ValueError("signer类型错误") return values
如果是v1版本,不要直接重写validate方法,改用@validator(字段级验证)或@root_validator(模型级验证)实现自定义逻辑。
内容的提问来源于stack exchange,提问作者Saikat Karmakar
相关产品推荐
相关产品推荐

