内容提要
Ruff v0.16.0 发布:默认规则从 59 条增至 413 条,新增 Markdown 代码块格式化、ruff: ignore 注释、检查输出显示修复差异,并稳定多项规则。
延伸解读
默认规则大幅增加,迁移前需评估影响
Ruff v0.16.0 将默认启用的规则从 59 条增加到 413 条,这是自 v0.1.0 以来默认规则集的首次重大调整。新增规则包括 flake8-bugbear、pyupgrade 和 RUF 类别,能捕获语法错误和运行时错误等严重问题。但同时也移除了 18 条较为武断的 pycodestyle 和 pyflakes 规则。升级后,现有项目可能会报告大量新问题,建议在 CI 中先行测试,或通过配置 select = ["E4", "E7", "E9", "F"] 恢复旧默认集。
Markdown 代码块格式化:实用但需注意抑制方式
v0.16.0 新增对 Markdown 文件中 Python 代码块的格式化支持,可识别 python、py、python3、py3、pyi、pycon 等 info string,并分别按普通 Python、存根文件或 REPL 会话处理。该功能也适用于 Quarto 笔记本(如 ```{python})。若需抑制格式化,可在代码块内使用 fmt: off/on 注释,或用 HTML 注释控制整个区域,也可通过 extend-exclude 排除所有 Markdown 文件。使用 .qmd 扩展名时可能需要配置
ruff: ignore 注释提供更细粒度抑制
Ruff 新增 ruff: ignore 和 ruff: file-ignore 注释,前者可抑制同一行或下一逻辑行的诊断,后者抑制整个文件的诊断,且均可附加原因说明。ruff: ignore 可通过 --add-ignore CLI 标志自动添加,预览模式下还支持使用规则名而非代码。这些注释补充了 v0.15 引入的 ruff: disable/enable 范围抑制机制,为开发者提供了更灵活的抑制方式,但需注意合理使用以避免掩盖真实问题。
检查输出显示修复差异,JSON 格式有破坏性变更
v0.16.0 在 check 和 format --check 的默认输出中直接显示修复差异,无需再使用 --diff 标志,且 format --check 现在支持与 linter 相同的所有输出格式,包括 JSON 和 CI 注解格式。但 JSON 输出有破坏性变更:filename、location、end_location 及 fix.edits 中的位置字段现在可能为 null,而非默认的空字符串或第 1 行第 1 列。依赖这些字段的工具需要适配。
Q&A
Ruff v0.16.0 默认启用的规则数量有什么变化?
Ruff v0.16.0 将默认启用的规则从之前的 59 条增加到 413 条。
如何恢复 Ruff v0.16.0 之前的默认规则集?
可以在配置文件中设置 [lint] select = ["E4", "E7", "E9", "F"] 来恢复旧的默认规则集。
Ruff v0.16.0 新增了哪些抑制注释?
新增了 ruff: ignore 和 ruff: file-ignore 注释。ruff: ignore 可以抑制同一行或下一逻辑行的诊断,ruff: file-ignore 可以抑制整个文件的诊断。
Ruff v0.16.0 如何格式化 Markdown 中的 Python 代码块?
Ruff 可以格式化 Markdown 文件中带有 python、py、python3、py3、pyi 或 pycon 信息字符串的围栏代码块。pyi 块按存根文件格式化,pycon 块按 REPL 会话格式化,其他按普通 Python 文件格式化。
Ruff v0.16.0 的 check 和 format --check 输出有什么改进?
现在会在默认完整输出格式中显示修复的差异(diff),而不再需要单独使用 --diff 标志。format --check 也支持与 linter 相同的所有输出格式。
Ruff v0.16.0 稳定了哪些规则?
稳定了包括 airflow3-incompatible-function-signature (AIR303)、missing-copyright-notice (CPY001)、unnecessary-from-float (FURB164)、sorted-min-max (FURB192)、implicit-string-concatenation-in-collection-literal (ISC004)、log-exception-outside-except-handler (LOG004)、invalid-bool-return-type (PLE0304)、too-many-positional-arguments (PLR0917)、stop-iteration-return (PLR1708)、none-not-at-end-of-union (RUF036)、access-annotations-from-class-dict (RUF063)、duplicate-entry-in-dunder-all (RUF068) 等规则。