Mypy未检测出List[str]被赋值为Tuple[str, List[str]]如何解决
问题根源
Mypy 默认配置的校验规则非常宽松,没有报错的核心原因有两个:
- 完全没有类型注解的
go函数默认不会被 Mypy 检查:Mypy 会自动将这类函数的返回值视为Any类型,而Any类型在类型系统中兼容所有类型,所以把返回元组的结果赋值给声明为List[str]的x也不会触发拦截。 - 默认配置没有开启严格校验规则,放过了隐式
Any、未检查函数等风险场景。
调整方案
1. 临时测试用命令行参数
运行 Mypy 时增加严格模式参数即可直接捕获错误:
mypy --strict mypy_lists.py
运行后会输出两处明确的错误提示:
go函数缺少返回值类型注解x = list(map(go, z))赋值时类型不匹配,List[Tuple[Any, Any]]类型不能赋值给List[str]类型的变量
2. 项目级永久配置
在项目根目录新增 Mypy 配置文件,开启必要的校验规则,避免后续再出现同类问题:
mypy.ini 配置示例
[mypy] # 开启全量严格校验 strict = true # 如果有历史遗留代码无法适配全量严格,也可以单独开启核心规则 # disallow_untyped_defs = true # warn_return_any = true
pyproject.toml 配置示例
[tool.mypy] strict = true
3. 代码编写习惯补充
不要仅依赖变量的类型注解做校验,所有自定义函数都要补全入参和返回值的类型注解。你示例中的 go 函数补全注解后,即使不开严格模式也会触发错误提示:
from typing import List, Tuple # 补全类型注解后的go函数 def go(boop: str) -> Tuple[str, List[str]]: return f"{boop}!", y
此时运行默认的 mypy mypy_lists.py 就会直接抛出类型不匹配的错误。
如果项目中有大量历史遗留代码无法全量开启严格模式,可以单独为新增的代码文件开启严格校验,在兼容老代码的同时规避这类低级错误。
内容的提问来源于stack exchange,提问作者codenoodle
相关产品推荐
相关产品推荐

