← 文章 / 开源项目
Hacker News 3小时前 · 2026-07-27 01:23:02 · 0 阅读

Ruff v0.16.0 发布:默认规则从59条大幅增至413条

Ruff v0.16.0 现已发布!可通过 PyPI 或您选择的包管理器安装:

uv tool install ruff@latest

提醒:Ruff 是一个用 Rust 编写的极速 Python 代码检查器和格式化工具。它可以替代 Black、Flake8(以及数十个插件)、isort、pydocstyle、pyupgrade 等,同时执行速度比任何单个工具快数十或数百倍。

迁移到 v0.16 #

Ruff v0.16 包含少量破坏性变更,大多数用户无需对代码或配置进行重大更改即可更新。主要例外情况如下所述。

更好的默认规则集 #

Ruff 现在默认启用 413 条规则,而之前版本只有 59 条。

自 Ruff 的默认规则集上次在 v0.1.0 中修改以来,规则总数已从 708 增长到 968。其中许多规则可以捕获严重问题,包括 语法错误即时运行时错误,但之前并未默认启用。借助新的规则集,Ruff 无需任何配置即可提醒您注意这些问题及其他许多问题。即使您已经在使用 selectextend-select,我们也希望这能让您注意到以前未发现的有用规则。

启用的规则列表太长,无法在此列出,但您可以在文档中新的 默认规则 页面上找到它。其中一些亮点包括来自流行的 flake8-bugbear (B) 和 pyupgrade (UP) 检查器的规则,以及来自我们自己的 RUF 类别的规则。

如果您想恢复旧的默认设置,可以使用以下配置轻松 select 旧规则:

[lint]
select = ["E4", "E7", "E9", "F"]

我们认为这项工作与长期目标——规则重新分类——紧密相关,敬请期待该领域的后续进展。

v0.16 新特性 #

Ruff v0.16 还包含若干新稳定化的功能,如下所述。

Markdown 代码块格式化 #

Ruff 现在可以格式化 Markdown 文件中嵌入的 Python 代码块。

在这些文件中,Ruff v0.16 会格式化带有 pythonpypython3py3pyipycon 信息字符串围栏代码块pyi 代码块按照存根文件格式处理,pycon 代码块按 REPL 会话格式处理,其余则按普通 Python 文件格式处理。例如:

# README

Here's an example:

```py
import ruff

ruff_binary = (
    ruff.find_ruff_bin()
)
```

运行 ruff format 时会重新格式化:

Ruff 格式化器输出,显示了一个将被重新格式化的 Markdown 代码块

该功能同样可用来格式化 Quarto 笔记本,因为 Ruff 仍能识别花括号包裹的语言标识(如 ```{python})。注意,如果 Quarto 文件使用 .qmd 扩展名,可能需要配置 extension 映射。

如需抑制格式化,有以下几种方式。若希望抑制注释出现在代码块内部,可在代码块内使用常规的 fmt: offfmt: on 注释,或使用类似的 HTML 注释来禁用文档整个区域的格式化:

# README

<!-- fmt: off -->

```py
x =      "this will be suppressed"
```

<!-- fmt: on -->

若要完全禁用 Markdown 格式化,可使用常规的 extend-exclude 设置,通过通配符 *.md 排除所有 Markdown 文件。

详情请参阅完整文档

ruff: ignore 注释新增抑制功能 #

Ruff 现在有了自己的抑制注释格式,可以单独成行使用。

在 v0.15 中,Ruff 代码检查器通过配对使用的 ruff: disableruff: enable 注释实现了范围抑制机制,类似于上文提到的 fmt: offfmt: on 配对:

# ruff: disable[N803]
def foo(
    legacyArg1,
    legacyArg2,
    legacyArg3,
    legacyArg4,
): ...
# ruff: enable[N803]

Ruff v0.16 在此基础上新增了两种 ruff 抑制注释。ruff: ignore 可用于抑制同一行(类似 noqa)或下一逻辑行的诊断:

import math  # ruff: ignore[F401]

# ruff: ignore[N803]
def foo(
    legacyArg1,
    legacyArg2,
    legacyArg3,
    legacyArg4,
): ...

在这个例子中,逻辑行横跨了整个函数头(从 def 到冒号),因此 ruff: ignore 抑制了所有相同的 N803 诊断,效果与上文的 disable/enable 配对一样。

ruff: file-ignore 注释可用于抑制整个文件的诊断,与 ruff: noqa 注释类似:

# ruff: file-ignore[F401] 允许在此文件中使用未导入的模块

import foo
import bar
import baz

这个例子也展示了,每种注释都可以附带一个“原因”来说明添加注释的理由,此处为 允许在此文件中使用未导入的模块

通过新增的 --add-ignore CLI 标志可以自动添加 ruff: ignore 注释。在预览模式下,所有这些 ruff 抑制注释都支持使用规则名称而非代码:

❯ echo 'import math' > try.py
❯ uvx ruff@latest check --preview --add-ignore try.py
已添加 1 条忽略注释。
❯ cat try.py
import math  # ruff: ignore[unused-import]

所有注释的完整规范请参阅文档

修复现在显示在 checkformat --check 输出中 #

现在,Ruff 在呈现诊断信息时,会显示 linter 和 formatter 修复的 diff。

此前,checkformat 子命令虽支持 --diff 标志来显示应用 check --fixformat 修复后引入的差异,但该输出独立于常规输出,且会隐藏解释性诊断。v0.16 中,可用修复已集成到默认的 full 输出格式中,展示在 help 子诊断下方:

Ruff check output showing the diff for an unused-import fix

format --check 同理。对于以下输入:

# example.py

if True:
    pass
elif     False:
    pass

格式化器输出:

Ruff formatter output showing the diff for an unformatted file

format --check 现在也支持 linter 支持的所有输出格式。例如,你可以用它获取机器可读的 JSON 输出,或生成 GitHub 和 GitLab 期望的格式,用于在 CI 中显示注释。支持格式的完整列表请参见 CLI 帮助或文档

关于输出格式的最后一个注意点是,v0.16 对 JSON 输出有一项小的破坏性变更。filenamelocationend_locationfix.edits[].locationfix.edits[].end_location 字段现在可能为 null,而不是分别默认为空字符串和行 1、列 1。这只会影响极少数现有的 Ruff 诊断,但更好地反映了内部诊断表示,并且在未来的规则中可能会更常见。

规则稳定化 #

以下规则已稳定,不再处于预览状态:

其他行为稳定化 #

本次发布还稳定了一些此前仅在预览模式下可用的行为:

  • blind-except (BLE001) 现在仅在异常通过 logging 模块中除 criticalerrorexception 之外的方法记录时才会被抑制。
  • future-required-type-annotationFA102)现在会检查更多符合 PEP 585 的 API,例如来自 collections.abc 的那些。
  • f-string-in-get-text-func-callINT001)、format-in-get-text-func-callINT002)和 printf-in-get-text-func-callINT003)现在会检查更多常见的 gettext 模块用法,例如将其赋值给 builtins._
  • suspicious-url-open-usageS310)现在会解析本地字符串字面量绑定,以避免更多误报。
  • snmp-insecure-versionS508)和 snmp-weak-cryptographyS509)现在支持 PySNMP 新版本中推荐的 API。
  • typing-text-str-aliasUP019)现在除了 typing.Text 外,也能识别 typing_extensions.Text
  • 感谢!#

    感谢所有就 Ruff 预览模式中这些变更提供反馈的朋友,以及我们的贡献者。能与你们一起构建 Ruff,是我们的荣幸!

    完整变更日志请查看 GitHub

    进一步了解 Astral——Ruff 背后的公司。

    感谢 Zanie Blue、David Peter、Micha Reiser 和 Alex Waygood 对本文的贡献。

    Background patternBackground pattern

    提升你的 Python 工具链

    开始使用浏览文档Background patternBackground pattern隐私政策

    © 2026 Astral Software Inc.

    评论 (0)