运行pydantic.mypy与mypy时报错:__init__缺少required参数'default'怎么办?
问题分析与解决:mypy与pydantic插件兼容性报错
配置信息
mypy.ini 内容
[mypy] python_version = 3.10 plugins = pydantic.mypy [pydantic-mypy] init_forbid_extra = True init_typed = True warn_required_dynamic_aliases = True
requirements.txt 依赖
pydantic==1.10.5 mypy==1.7.1
报错信息
执行mypy --show-traceback时出现以下错误:
Traceback (most recent call last): File "mypy/semanal.py", line 6525, in accept File "mypy/nodes.py", line 1140, in accept File "mypy/semanal.py", line 1608, in visit_class_def File "mypy/semanal.py", line 1693, in analyze_class File "mypy/semanal.py", line 1727, in analyze_class_body_common File "mypy/semanal.py", line 1814, in apply_class_plugin_hooks File "pydantic/mypy.py", line 140, in pydantic.mypy.PydanticPlugin._pydantic_model_class_maker_callback File "pydantic/mypy.py", line 284, in pydantic.mypy.PydanticModelTransformer.transform File "pydantic/mypy.py", line 463, in pydantic.mypy.PydanticModelTransformer.add_construct_method TypeError: __init__() missing required argument 'default' (pos 6)
问题原因
这是版本兼容性问题:mypy 1.7.1对内部API做了调整,构造函数相关方法新增了default必填参数,但pydantic 1.10.5的mypy插件仍沿用旧版API调用逻辑,未适配参数变化,导致调用时参数缺失报错。
解决方法
提供三种可行方案,按需选择:
- 方案1:降级mypy到兼容版本
修改requirements.txt中的mypy版本为mypy==1.6.1,该版本与pydantic 1.10.5的插件完全兼容,无需调整项目代码。 - 方案2:升级pydantic到修复兼容问题的版本
将pydantic升级到pydantic==1.10.12(该版本专门修复了与mypy 1.7+的兼容问题);也可以直接升级到pydantic v2版本,但注意v2存在API变更,需要同步调整项目中的Pydantic代码。 - 方案3:临时禁用pydantic mypy插件(不推荐)
修改mypy.ini中的plugins行,注释掉pydantic插件:
此方法会失去Pydantic模型的类型检查能力,仅作为临时应急方案。# plugins = pydantic.mypy
内容的提问来源于stack exchange,提问作者Slavik21
相关产品推荐
相关产品推荐

