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 开发中不可或缺的一部分。