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 代码块。格式化程序的目标是带有 pythonpypython3py3pyipycon 等信息字符串的围栏代码块(fenced code blocks)。

  • pyi:格式化为 stub 文件。
  • pycon:格式化为 REPL 会话。
  • 标准 Python 块:使用常规 Python 文件格式化。

此功能还扩展到了 Quarto notebooks(例如 ````{python})。可以使用代码块内的 fmt: offfmt: on 注释来抑制格式化,或者使用 HTML 注释()来包裹文档区域。整个 Markdown 文件可以通过 extend-exclude` 设置来排除。

通过 ruff: ignore 实现增强的抑制功能

0.16.0 版本引入了一种新的抑制注释格式,可以单独占用一行,这比之前的 ruff: disableruff: enable 范围机制提供了更大的灵活性。

  • ruff: ignore:抑制同一行或后续逻辑行上的诊断信息。这对于跨越多行的函数头特别有用。
  • ruff: file-ignore:针对整个文件抑制特定的诊断信息,其功能类似于 ruff: noqa

这两种注释类型都支持可选的“原因”字符串来解释抑制原因。此外,新的 --add-ignore CLI 标志允许自动添加这些注释。在预览模式下,这些注释支持规则名称(例如 unused-import)而不仅仅是规则代码。

CLI 输出中集成的修复差异 (diffs)

Linter 和格式化器的修复现在直接显示在 checkformat --check 子命令的默认 full 输出格式的 diff 中。此前,这些更改只有在使用 --diff 标志时才可见,而该标志会抑制随附的解释性诊断信息。

format --check 现在还支持 linter 可用的所有输出格式,包括机器可读的 JSON 以及与 GitHub 和 GitLab CI 注释兼容的格式。

关于 JSON 输出的说明:引入了一项破坏性变更,filenamelocationend_locationfix.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):现在当通过 criticalerrorexception 以外的方法记录异常时,将抑制该警告。
  • FA102 (future-required-type-annotation):现在会检查额外的兼容 PEP 585 的 API,包括 collections.abc
  • INT001, INT002, INT003:现在会检查更常见的 gettext 模块使用模式,例如赋值给 builtins._
  • S310 (suspicious-url-open-usage):现在会解析本地字符串字面量绑定以减少误报。
  • S508S509:现在支持较新 PySNMP 版本的推荐 API。
  • UP019 (typing-text-str-alias):现在可以识别 typing_extensions.Text

社区观点

社区对此次发布的反馈呈现出分歧:一部分人看重自动化程度的提高,而另一部分人则认为严格的 linting 是武断的。

一些用户报告称,更新后代码质量得到了立竿见影的提升,并指出扩展后的规则集捕获了之前版本遗漏的问题。其他人则对这类工具的“语法警察”本质表示担忧,认为严格的格式化有时会掩盖作者的意图。

关于更新对运维的影响,一些开发者指出,在未锁定版本的 CI 环境中更新到 v0.16.0 可能会由于新默认规则的涌入而导致任务立即失败。

“如果你仔细听,你可以听到成千上万个刚刚拉取了最新 UV 的 CI 任务同时失败的声音。”

此外,一些用户建议实现 stateVersion(类似于 Nix),以便团队可以按照自己的节奏选择加入新的默认规则集,而不是在工具更新时自动继承它们。

Sources