Python 现代开发学习笔记

(十六)格式、静态检查与类型检查

1. 把不同检查对应到不同问题

pytest 会运行代码并比较结果;Ruff 的 lint 检查未使用的导入、未定义的名称和指定的代码规则;formatter 调整排版;mypy 根据注解检查参数与返回类型。这几种检查可以互相补充:> 与 >= 都能通过类型检查,仍要由达标计数测试区分。

# 在同一环境中分别运行检查;前两条只报告问题,不修改文件。
uv run python -m ruff check src tests
uv run python -m ruff format --check src tests
# 需要统一排版时实际执行格式化,再重新检查与运行测试。
uv run python -m ruff format src tests
uv run python -m mypy
uv run python -m pytest

前面 pyproject.toml 中的 Ruff select 明确选择导入、名称、部分语法与导入排序规则;line-length=100 设置排版宽度。ruff check --fix 会修改能自动修正的问题,执行后用 Git diff 查看改动。Ruff 配置、格式化

2. 让注解参与检查

先看一份类型错误示例:

# 项目文件:type_demo/before.py
# 错误示例:注解要求整数,调用者却传入文本;mypy 在运行前指出不匹配。
def add_minutes(left: int, right: int) -> int:
    return left + right


print(add_minutes("20", 35))
# 在项目环境中检查单独的错误示例;路径按配套目录从 quality_project 出发。
uv run python -m mypy ../type_demo/before.py

报告指出第一个实参是 str、需要 int。直接运行这段程序,还会在文本加整数处抛 TypeError。修正可以在输入转换层先写 int(text),也可以改变函数本身要接收的数据;先明确职责,再修正注解与实现。

项目配置的 mypy files 先选 config.py 和 stats.py,strict=true 检查这两个有完整注解的模块。继续给格式转换和服务接口补注解时,可以把对应模块加入列表。Any 会让一部分检查失去具体类型,不能把“没有报告”理解成所有运行路径都正确。mypy 入门

静态工具发现文本实参,运行测试发现比较错误,格式化处理排版的分工

笔记正文与全部题解 · Ctrl / ⌘ K