Ruff v0.16.0 发布说明 / 新特性
Ruff v0.16.0 发布说明 / 新特性
Ruff v0.16.0 将默认 linting 扩展至 413 条规则
Ruff v0.16.0 将默认启用的规则数量从 59 条增加到了 413 条。这一变化使用户无需手动配置即可捕获严重问题,包括语法错误和即时的运行时错误。扩展后的规则集包含了来自 flake8-bugbear (B)、pyupgrade (UP) 以及 Ruff 自有的 RUF 类别的规则。
希望使用之前默认规则集的用户的可以通过以下配置进行还原:
[lint]
select = ["E4", "E7", "E9", "F"]
Markdown 代码块格式化
Ruff v0.16.0 现在可以格式化嵌入在 Markdown 文件中的 Python 代码块。格式化程序的目标是带有 python、py、python3、py3、pyi 或 pycon 等信息字符串的围栏代码块(fenced code blocks)。
pyi块:格式化为 stub 文件。pycon块:格式化为 REPL 会话。- 标准 Python 块:使用常规 Python 文件格式化。
此功能还扩展到了 Quarto notebooks(例如 ````{python})。可以使用代码块内的 fmt: off和fmt: on 注释来抑制格式化,或者使用 HTML 注释()来包裹文档区域。整个 Markdown 文件可以通过 extend-exclude` 设置来排除。
通过 ruff: ignore 实现增强的抑制功能
0.16.0 版本引入了一种新的抑制注释格式,可以单独占用一行,这比之前的 ruff: disable 和 ruff: enable 范围机制提供了更大的灵活性。
ruff: ignore:抑制同一行或后续逻辑行上的诊断信息。这对于跨越多行的函数头特别有用。ruff: file-ignore:针对整个文件抑制特定的诊断信息,其功能类似于ruff: noqa。
这两种注释类型都支持可选的“原因”字符串来解释抑制原因。此外,新的 --add-ignore CLI 标志允许自动添加这些注释。在预览模式下,这些注释支持规则名称(例如 unused-import)而不仅仅是规则代码。
CLI 输出中集成的修复差异 (diffs)
Linter 和格式化器的修复现在直接显示在 check 和 format --check 子命令的默认 full 输出格式的 diff 中。此前,这些更改只有在使用 --diff 标志时才可见,而该标志会抑制随附的解释性诊断信息。
format --check 现在还支持 linter 可用的所有输出格式,包括机器可读的 JSON 以及与 GitHub 和 GitLab CI 注释兼容的格式。
关于 JSON 输出的说明:引入了一项破坏性变更,filename、location、end_location 和 fix.edits 位置字段现在可能为 null,而不是空字符串或默认坐标(第 1 行,第 1 列)。
稳定的规则与行为
稳定的规则
若干规则已从预览状态转为稳定状态,包括:
AIR303(airflow3-incompatible-function-signature)CPY001(missing-copyright-notice)FURB164(unnecessary-from-float)FURB192(sorted-min-max)ISC004(implicit-string-concatenation-in-collection-literal)LOG004(log-exception-outside-except-handler)PLE0304(invalid-bool-return-type)PLR0917(too-many-positional-arguments)PLR1708(stop-iteration-return)RUF036(none-not-at-end-of-union)RUF063(access-annotations-from-class-dict)RUF068(duplicate-entry-in-dunder-all)
稳定的行为
BLE001(blind-except):现在当通过critical、error和exception以外的方法记录异常时,将抑制该警告。FA102(future-required-type-annotation):现在会检查额外的兼容 PEP 585 的 API,包括collections.abc。INT001,INT002,INT003:现在会检查更常见的gettext模块使用模式,例如赋值给builtins._。S310(suspicious-url-open-usage):现在会解析本地字符串字面量绑定以减少误报。S508和S509:现在支持较新 PySNMP 版本的推荐 API。UP019(typing-text-str-alias):现在可以识别typing_extensions.Text。
社区观点
社区对此次发布的反馈呈现出分歧:一部分人看重自动化程度的提高,而另一部分人则认为严格的 linting 是武断的。
一些用户报告称,更新后代码质量得到了立竿见影的提升,并指出扩展后的规则集捕获了之前版本遗漏的问题。其他人则对这类工具的“语法警察”本质表示担忧,认为严格的格式化有时会掩盖作者的意图。
关于更新对运维的影响,一些开发者指出,在未锁定版本的 CI 环境中更新到 v0.16.0 可能会由于新默认规则的涌入而导致任务立即失败。
“如果你仔细听,你可以听到成千上万个刚刚拉取了最新 UV 的 CI 任务同时失败的声音。”
此外,一些用户建议实现 stateVersion(类似于 Nix),以便团队可以按照自己的节奏选择加入新的默认规则集,而不是在工具更新时自动继承它们。