Mypy 是 Python 的一个可选静态类型检查器,它利用 Python 的类型提示(Type Hints)来在代码运行前检查类型错误。下面详细介绍 Mypy 的使用方式和功能。
安装 Mypy #
pip install mypy
基本使用 #
检查单个文件 #
mypy your_script.py
检查整个项目 #
mypy your_project_directory/
忽略导入错误 #
mypy --ignore-missing-imports your_script.py
配置 Mypy #
命令行选项 #
# 严格模式(启用所有检查)
mypy --strict your_script.py
# 显示错误代码
mypy --show-error-codes your_script.py
# 将检查结果导出到文件
mypy your_script.py --output-file errors.txt
配置文件 #
在项目根目录创建 mypy.ini
或 .mypy.ini
文件:
[mypy]
python_version = 3.8
warn_return_any = True
warn_unused_configs = True
disallow_untyped_defs = True
[mypy-numpy]
ignore_missing_imports = True
常见错误类型 #
Mypy 会报告多种类型的错误,例如:
error: Argument 1 to "function" has incompatible type "X"; expected "Y"
error: Incompatible types in assignment (expression has type "X", variable has type "Y")
error: Function is missing a return type annotation
实际示例 #
有类型错误的代码 #
# example.py
def greet(name: str) -> str:
return f"Hello, {name}"
# 这里会引发类型错误,因为传递了整数而不是字符串
result = greet(42)
运行 Mypy 检查 #
mypy example.py
输出结果 #
example.py:5: error: Argument 1 to "greet" has incompatible type "int"; expected "str"
Found 1 error in 1 file (checked 1 source file)
处理第三方库 #
对于没有类型提示的第三方库,可以使用以下方法:
忽略特定库的类型检查 #
[mypy-some_library.*]
ignore_missing_imports = True
使用存根文件(Stubs) #
许多流行库有类型存根文件,可以通过 pip
安装:
pip install types-requests # 为 requests 库安装类型存根
与编辑器集成 #
VS Code #
安装 Python 扩展后,Mypy 会自动集成。可以在设置中配置:
{
"python.linting.mypyEnabled": true,
"python.linting.mypyArgs": [
"--ignore-missing-imports",
"--follow-imports=silent",
"--show-column-numbers"
]
}
PyCharm #
PyCharm 内置了对 Mypy 的支持。可以在设置中启用:
- 打开 Settings/Preferences
- 导航到 Languages & Frameworks > Python > Integrated Tools
- 在 “Type checker” 下拉菜单中选择 “mypy”
高级用法 #
条件类型检查 #
from typing import TYPE_CHECKING
if TYPE_CHECKING:
# 这些导入只在类型检查时使用,不会影响运行时
from expensive_module import ExpensiveClass
def process_data(data) -> "ExpensiveClass": # 前向引用
...
忽略特定行的错误 #
def some_function():
# type: () -> None
value = get_untyped_value() # type: ignore
# 或者指定忽略特定错误
value = get_untyped_value() # type: ignore[assignment]
常用 Mypy 选项 #
选项 | 描述 |
---|---|
--disallow-untyped-defs | 不允许没有类型注解的函数定义 |
--disallow-incomplete-defs | 不允许不完整的类型注解 |
--warn-redundant-casts | 警告冗余的类型转换 |
--warn-unused-ignores | 警告未使用的 # type: ignore 注释 |
--strict | 启用所有严格的检查选项 |
集成到开发流程 #
预提交钩子(Pre-commit Hook) #
可以将 Mypy 添加到 Git 预提交钩子中,确保提交的代码通过类型检查:
# 在 .git/hooks/pre-commit 中添加
#!/bin/sh
mypy your_project_directory/
CI/CD 集成 #
在持续集成流程中添加 Mypy 检查:
# GitHub Actions 示例
name: Type Check
on: [push, pull_request]
jobs:
type-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
- name: Install dependencies
run: pip install mypy
- name: Run mypy
run: mypy your_project_directory/
总结 #
Mypy 是一个强大的工具,可以帮助你在代码运行前发现类型相关的错误,提高代码质量和可维护性。通过合理配置和集成到开发流程中,Mypy 可以成为 Python 开发中不可或缺的一部分。