如何使用Mypy实现PEP-585规范强制检查,禁止使用typing模块泛型类型?
实现Mypy对旧泛型写法的报错检查
没问题,你可以通过Mypy的内置配置选项轻松实现这个需求,具体步骤如下:
1. 确保Mypy版本符合要求
PEP 585(也就是list[str]这类内置泛型写法)的支持从Mypy 0.800版本开始,先检查你的Mypy版本:
mypy --version
如果版本低于0.800,执行升级命令:
pip install --upgrade mypy
2. 配置Mypy禁用旧泛型别名
Mypy提供了disallow_legacy_generic_aliases选项,启用它后,使用typing.List这类旧泛型写法时会直接触发报错。
你可以通过两种常见的配置文件来设置:
方式1:使用mypy.ini
在项目根目录创建或修改mypy.ini,添加以下内容:
[mypy] disallow_legacy_generic_aliases = True
方式2:使用pyproject.toml
如果你的项目用pyproject.toml管理配置,添加:
[tool.mypy] disallow_legacy_generic_aliases = true
3. 验证效果
现在当你写出这样的代码时:
from typing import List def process_items(items: List[str]) -> None: for item in items: print(item)
运行Mypy检查会得到类似这样的报错:
error: Using legacy generic alias "List" instead of builtin "list" [disallow_legacy_generic_aliases]
而改用PEP 585的写法后,Mypy不会报错:
def process_items(items: list[str]) -> None: for item in items: print(item)
兼容旧Python版本的小技巧
如果你的项目需要兼容Python 3.8及更早版本,可以在文件顶部添加from __future__ import annotations,这样list[str]的写法在旧Python版本中也能正常运行(不会触发语法错误),同时Mypy依然可以正确检查类型:
from __future__ import annotations def process_items(items: list[str]) -> None: for item in items: print(item)
内容的提问来源于stack exchange,提问作者UtterlyConfused
相关产品推荐
相关产品推荐

