Ruff v0.16.0 技术解读:默认规则从 59 条增至 413 条,Python 代码检查进入新阶段

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

Ruff GitHub 仓库

为什么要改默认规则集

Ruff 自 2023 年 10 月 v0.1.0 起,默认只启用 4 个规则前缀:E4E7E9F。这些来自 pycodestyle(Python 代码风格检查)和 pyflakes(Python 逻辑错误检查),覆盖面非常窄。大量实际有用的规则——比如可变默认参数检测、过时的类型注解写法——需要开发者手动通过 selectextend-select 配置才能启用。

问题在于,大多数开发者根本不会去翻文档配置这些规则。Astral 团队在博客中指出,自 v0.1.0 以来,Ruff 的总规则数已从 708 条增长到 968 条,其中许多规则检测的是语法错误和即时运行时错误这类严重问题,却从未被默认开启。

v0.16.0 的核心思路:把社区已经广泛认可的高价值规则直接纳入默认集,让用户零配置就能获得更强的代码检查能力。

新默认规则集的 34 个类别

新默认集运行的 413 条规则横跨 34 个类别,以下是在实际代码库中最常触发的几大类:

类别来源规则数典型检测内容
Bflake8-bugbear29可变默认参数、默认值中的函数调用、循环变量捕获
UPpyupgrade42Optional[X] 迁移至 X | Nonetyping.List 替换为 list
SIMflake8-simplify21嵌套 with 语句、冗余布尔比较
C4flake8-comprehensions17不必要的 list(generator) 包装、冗余集合构造
PLpylint67命名规范、错误、重构建议、警告
RUFRuff 原生36可变类变量默认值、隐式 Optional、模糊类变量注解
Iisortimport 排序
ASYNCflake8-async10异步函数中的阻塞调用、异步循环中缺失检查点
FURBrefurb17sorted() 替代 min()、位运算替代集合操作
DTZflake8-datetimez10无时区的 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 建议的做法:

  1. 先用 ruff check --fix 自动修复可修复的违规
  2. 逐条检查剩余违规,判断是否需要调整代码或添加抑制注释
  3. 如果需要回退到旧默认集,在 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 格式,支持行尾和上一行两种写法:

python
import math  # ruff: ignore[F401]

# ruff: ignore[F401]
import os

在 preview 模式下,还支持附带理由字符串和规则名:

python
import math  # ruff: ignore[F401] math is used in eval

内联 diff 输出

ruff checkruff format --check 的输出现在会直接显示修复的 diff,方便在 CI 中快速预览变更内容。

12 条规则稳定化

以下规则从 preview 状态升级为稳定,不再需要开启 preview 模式:

规则代码规则名称
AIR303airflow3-incompatible-function-signature
CPY001missing-copyright-notice
FURB164unnecessary-from-float
FURB192sorted-min-max
ISC004implicit-string-concatenation-in-collection-literal
LOG004log-exception-outside-except-handler
PLE0304invalid-bool-return-type
PLR0917too-many-positional-arguments
PLR1708stop-iteration-return
RUF036none-not-at-end-of-union
RUF063access-annotations-from-class-dict
RUF068duplicate-entry-in-dunder-all

JSON 输出的小型破坏性变更

v0.16.0 对 JSON 输出做了一个小破坏性变更:filenamelocationend_locationfix.edits[].locationfix.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 值处理逻辑。

安装或升级:

bash
# 使用 pip
pip install --upgrade ruff

# 使用 uv
uv tool install ruff --upgrade

# 使用 Homebrew
brew upgrade ruff

Ruff 仓库目前有超过 49000 个 GitHub star,920 位贡献者参与开发。2026 年 3 月 OpenAI 收购 Astral 后,Ruff 的开发节奏未受影响,v0.16.0 是收购完成后发布的首个大版本。Astral 团队已加入 OpenAI 的 Codex 团队,Ruff 及其同系列的 uv 包管理器、ty 类型检查器将逐步整合进 Codex 生态。