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 无需任何配置即可提醒您注意这些问题及其他许多问题。即使您已经在使用 select 或 extend-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 会格式化带有 python、py、python3、py3、pyi 或 pycon 信息字符串的围栏代码块。pyi 代码块按照存根文件格式处理,pycon 代码块按 REPL 会话格式处理,其余则按普通 Python 文件格式处理。例如:
# README
Here's an example:
```py
import ruff
ruff_binary = (
ruff.find_ruff_bin()
)
```
运行 ruff format 时会重新格式化:
该功能同样可用来格式化 Quarto 笔记本,因为 Ruff 仍能识别花括号包裹的语言标识(如 ```{python})。注意,如果 Quarto 文件使用 .qmd 扩展名,可能需要配置 extension 映射。
如需抑制格式化,有以下几种方式。若希望抑制注释出现在代码块内部,可在代码块内使用常规的 fmt: off 和 fmt: 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: disable 和 ruff: enable 注释实现了范围抑制机制,类似于上文提到的 fmt: off 和 fmt: 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]
所有注释的完整规范请参阅文档。
修复现在显示在 check 和 format --check 输出中 #
现在,Ruff 在呈现诊断信息时,会显示 linter 和 formatter 修复的 diff。
此前,check 和 format 子命令虽支持 --diff 标志来显示应用 check --fix 或 format 修复后引入的差异,但该输出独立于常规输出,且会隐藏解释性诊断。v0.16 中,可用修复已集成到默认的 full 输出格式中,展示在 help 子诊断下方:
format --check 同理。对于以下输入:
# example.py
if True:
pass
elif False:
pass
格式化器输出:
format --check 现在也支持 linter 支持的所有输出格式。例如,你可以用它获取机器可读的 JSON 输出,或生成 GitHub 和 GitLab 期望的格式,用于在 CI 中显示注释。支持格式的完整列表请参见 CLI 帮助或文档。
关于输出格式的最后一个注意点是,v0.16 对 JSON 输出有一项小的破坏性变更。filename、location、end_location、fix.edits[].location 和 fix.edits[].end_location 字段现在可能为 null,而不是分别默认为空字符串和行 1、列 1。这只会影响极少数现有的 Ruff 诊断,但更好地反映了内部诊断表示,并且在未来的规则中可能会更常见。
规则稳定化 #
以下规则已稳定,不再处于预览状态:
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)
其他行为稳定化 #
本次发布还稳定了一些此前仅在预览模式下可用的行为:
blind-except(BLE001) 现在仅在异常通过logging模块中除critical、error和exception之外的方法记录时才会被抑制。
future-required-type-annotation(FA102)现在会检查更多符合 PEP 585 的 API,例如来自 collections.abc 的那些。f-string-in-get-text-func-call(INT001)、format-in-get-text-func-call(INT002)和 printf-in-get-text-func-call(INT003)现在会检查更多常见的 gettext 模块用法,例如将其赋值给 builtins._。suspicious-url-open-usage(S310)现在会解析本地字符串字面量绑定,以避免更多误报。snmp-insecure-version(S508)和 snmp-weak-cryptography(S509)现在支持 PySNMP 新版本中推荐的 API。typing-text-str-alias(UP019)现在除了 typing.Text 外,也能识别 typing_extensions.Text。感谢!#
感谢所有就 Ruff 预览模式中这些变更提供反馈的朋友,以及我们的贡献者。能与你们一起构建 Ruff,是我们的荣幸!
完整变更日志请查看 GitHub。
进一步了解 Astral——Ruff 背后的公司。
感谢 Zanie Blue、David Peter、Micha Reiser 和 Alex Waygood 对本文的贡献。


提升你的 Python 工具链
开始使用浏览文档
隐私政策© 2026 Astral Software Inc.