Ruff v0.16.0:默认检查规则增至413条
默认规则大幅扩展
Astral 于7月23日发布 Python 代码检查工具 Ruff v0.16.0。此次更新的一项重要变化是:默认启用的规则从59条增加到413条。
自 v0.1.0 上次调整默认规则集以来,Ruff 的规则总数已从708条增长到968条。其中一些规则能够发现语法错误、会立即触发的运行时错误等严重问题,但此前并未默认开启。新版本让项目无需额外配置,就能获得更广泛的检查。
这也会影响现有工作流:如果开发依赖只声明了 ruff,却没有固定版本,CI 在安装新版本后,可能因新增的默认检查而失败。
如何检查现有项目
在 Python 项目目录中,可以运行:
uvx ruff@latest check .
在 Datasette、sqlite-utils 和 LLM 三个项目的升级实践中,新规则发现了数百处此前未被默认检查覆盖的小问题。这三个项目都有较完善的测试套件,并在 CI 中覆盖 Python 3.10 至3.14,为批量修改后的验证提供了条件。
以下命令完成了其中大部分修复:
uvx ruff@latest check . --fix --unsafe-fixes
注意:该命令包含 --unsafe-fixes,并非只应用安全修复;使用时应结合代码审查和测试验证。
在 sqlite-utils 中,这次执行的结果为:
Found 1618 errors (1538 fixed, 80 remaining).
即发现1618项问题,自动修复1538项,剩余80项。
三类仍需处理的问题
1. 时间对象未指定时区
规则 DTZ005 会提示以下调用缺少 tz 参数:
dt = datetime.datetime.now()
检查信息会建议向 tz 参数传入时区对象。
2. 过于宽泛的异常捕获
规则 BLE001 会标记直接捕获 Exception 的写法:
try:
db.execute("select * from pragma_function_list()")
return True
except Exception:
return False
这类提示需要开发者结合具体逻辑,检查异常处理范围是否合适。
3. 无实际用途的属性访问
规则 B018 会标记读取属性后既不赋值、也不使用结果的表达式,例如:
table.insert({"id1": 5, "id2": 3, "v": 1}, pk=pk).last_pk
Ruff 的提示是将读取结果赋给变量,或移除无用的属性访问。
诊断信息也能辅助编码代理
这些诊断不仅包含规则编号,还给出文件位置、相关代码和修复提示,能够为编码代理处理问题提供上下文。在上述升级实践中,Codex 被用于处理 LLM 和 sqlite-utils,Claude Code 被用于处理 Datasette。
对现有项目而言,这次升级值得关注的不只是新增规则本身,还包括默认检查范围变化对 CI 的影响,以及批量修复后的验证工作。