Ruff 是 Astral 开发的 Python 代码检查和格式化工具,用 Rust 编写,速度比传统 Python 工具快数十倍。2026 年 7 月 23 日发布的 v0.16.0 是该工具自 v0.1.0 以来最大的一次默认规则集变更:开箱即用的规则数从 59 条猛增到 413 条,覆盖 34 个检查类别。

为什么要改默认规则集
Ruff 自 2023 年 10 月 v0.1.0 起,默认只启用 4 个规则前缀:E4、E7、E9、F。这些来自 pycodestyle(Python 代码风格检查)和 pyflakes(Python 逻辑错误检查),覆盖面非常窄。大量实际有用的规则——比如可变默认参数检测、过时的类型注解写法——需要开发者手动通过 select 或 extend-select 配置才能启用。
问题在于,大多数开发者根本不会去翻文档配置这些规则。Astral 团队在博客中指出,自 v0.1.0 以来,Ruff 的总规则数已从 708 条增长到 968 条,其中许多规则检测的是语法错误和即时运行时错误这类严重问题,却从未被默认开启。
v0.16.0 的核心思路:把社区已经广泛认可的高价值规则直接纳入默认集,让用户零配置就能获得更强的代码检查能力。
新默认规则集的 34 个类别
新默认集运行的 413 条规则横跨 34 个类别,以下是在实际代码库中最常触发的几大类:
| 类别 | 来源 | 规则数 | 典型检测内容 |
|---|---|---|---|
B | flake8-bugbear | 29 | 可变默认参数、默认值中的函数调用、循环变量捕获 |
UP | pyupgrade | 42 | Optional[X] 迁移至 X | None,typing.List 替换为 list |
SIM | flake8-simplify | 21 | 嵌套 with 语句、冗余布尔比较 |
C4 | flake8-comprehensions | 17 | 不必要的 list(generator) 包装、冗余集合构造 |
PL | pylint | 67 | 命名规范、错误、重构建议、警告 |
RUF | Ruff 原生 | 36 | 可变类变量默认值、隐式 Optional、模糊类变量注解 |
I | isort | — | import 排序 |
ASYNC | flake8-async | 10 | 异步函数中的阻塞调用、异步循环中缺失检查点 |
FURB | refurb | 17 | 用 sorted() 替代 min()、位运算替代集合操作 |
DTZ | flake8-datetimez | 10 | 无时区的 datetime.now()、utcnow() 使用 |
上述类别中,flake8-bugbear 和 pyupgrade 是 Python 社区使用最广泛的两个插件系列。此前开发者需要额外安装并在配置中手动引用,现在 Ruff 将它们直接内置并默认启用。
需要注意,新默认集并非开启每个类别的全部规则。以 UP 类别为例,默认只启用 42 条,而该前缀下还有更多稳定规则。如果你的配置中有 extend-select = ["UP"](会启用该前缀下所有稳定规则),直接删除会导致部分规则被静默关闭。
实际影响有多大
Simon Willison 在升级后对 sqlite-utils 项目运行 ruff check,发现了 1618 条新违规——全部来自新启用的默认规则。代码本身没有变化,Ruff 此前未曾报告的问题现在被纳入了检查范围。
对于已有项目,升级 v0.16.0 后首次运行 ruff check 通常会出现大量新违规。Astral 建议的做法:
- 先用
ruff check --fix自动修复可修复的违规 - 逐条检查剩余违规,判断是否需要调整代码或添加抑制注释
- 如果需要回退到旧默认集,在
pyproject.toml中配置:toml[tool.ruff.lint] select = ["E4", "E7", "E9", "F"]
v0.16 的其他新特性
Markdown 代码块格式化
Ruff 现在可以格式化 Markdown 文件中嵌入的 Python 代码块,且默认启用。这意味着 .md 文件中用 ```python 标记的代码块会被自动格式化,保持缩进和风格一致。
新的抑制注释语法
此前 Ruff 使用 # noqa: F401 来抑制特定行的检查。v0.16.0 引入了新的 ruff: ignore 格式,支持行尾和上一行两种写法:
import math # ruff: ignore[F401]
# ruff: ignore[F401]
import os在 preview 模式下,还支持附带理由字符串和规则名:
import math # ruff: ignore[F401] math is used in eval内联 diff 输出
ruff check 和 ruff format --check 的输出现在会直接显示修复的 diff,方便在 CI 中快速预览变更内容。
12 条规则稳定化
以下规则从 preview 状态升级为稳定,不再需要开启 preview 模式:
| 规则代码 | 规则名称 |
|---|---|
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 |
JSON 输出的小型破坏性变更
v0.16.0 对 JSON 输出做了一个小破坏性变更:filename、location、end_location、fix.edits[].location、fix.edits[].end_location 字段现在可能返回 null(此前默认为空字符串或 row 1, column 1)。以编程方式解析 Ruff JSON 输出的工具需要处理 null 值。
升级建议
对于尚未使用 Ruff 的 Python 项目,v0.16.0 是一个好的起点——默认规则集的覆盖面大幅提升,零配置即可获得接近完整 flake8 插件生态的检查能力。
对于已在使用 Ruff 的项目,升级前应做以下检查:
- 审计现有
extend-select配置,确认是否有规则在新默认集之外。直接删除extend-select = ["UP"]会关闭默认集未包含的 UP 规则。可以在 Astral 的 Default Rules 页面查看具体差异。 - 准备好处理首次升级后可能出现的大量新违规。建议在单独的 commit 中执行
ruff check --fix,然后逐条处理手动修复项。 - 如果 CI 流水线解析了 Ruff 的 JSON 输出,更新 null 值处理逻辑。
安装或升级:
# 使用 pip
pip install --upgrade ruff
# 使用 uv
uv tool install ruff --upgrade
# 使用 Homebrew
brew upgrade ruffRuff 仓库目前有超过 49000 个 GitHub star,920 位贡献者参与开发。2026 年 3 月 OpenAI 收购 Astral 后,Ruff 的开发节奏未受影响,v0.16.0 是收购完成后发布的首个大版本。Astral 团队已加入 OpenAI 的 Codex 团队,Ruff 及其同系列的 uv 包管理器、ty 类型检查器将逐步整合进 Codex 生态。