Ruff 0.16.0 扩大默认检查规则

Simon Willison··作者 Simon Willison

关键信息

Astral 表示,Ruff 现在默认启用 413 条规则,远高于之前的 59 条,而且新增的许多检查能捕获语法错误和立即运行时错误等严重问题。文章还展示了使用 `uvx ruff@latest check . --fix --unsafe-fixes` 可以修复作者项目中的大部分问题,但仍有一些结果需要人工处理。

资讯摘要

Simon Willison 说,Astral 在他写这篇文章前几天发布了 Ruff v0.16.0,具体日期是 7 月 23 日。之所以引起他的注意,是因为他的多个 CI 任务突然开始失败,而原因正是他项目里使用了未固定版本的 `ruff` 依赖。Astral 的公告中,Brent Westbrook 表示,Ruff 现在默认启用了 413 条规则,而旧版本只有 59 条。公告还说明,自 v0.1.0 以来 Ruff 的默认规则集一直没有改动,但整体规则数量已经从 708 条增长到 968 条。新启用的规则包含一些较严重的问题,例如语法错误和立即运行时错误,这些过去并不会在默认情况下被检查。

Willison 把新版本应用到 Datasette、sqlite-utils 和 LLM 这三个项目上,结果发现了数百个较小的问题。对他来说,大多数清理工作可以通过 `uvx ruff@latest check . --fix --unsafe-fixes` 完成,而在 sqlite-utils 上,这个命令在 1618 个错误中修复了 1538 个,只剩 80 个。文章随后给出几个剩余问题的例子,包括没有 `tz` 参数的 `datetime.datetime.now()`、过于宽泛的 `except Exception`,以及对 `last_pk` 的无用属性访问。最后他提到,由于 Astral 现在属于 OpenAI,这类输出已经足够详细,可以直接交给编码代理处理,因此他使用 Codex 和 Claude Code 分别升级了自己的项目。

资讯正文

<p><strong><a href="https://astral.sh/blog/ruff-v0.16.0">Ruff v0.16.0</a></strong></p>

Astral 在 7 月 23 日前几天发布了其 Ruff Python 代码检查工具的一个重要新版本。直到今天我才注意到,因为我各种 CI 任务都开始失败了,原因是 Ruff 新增了默认检查,而我那条未固定版本的 <code>"ruff"</code> 开发依赖也随之升级。</p>

<p>以下是 Brent Westbrook 公告文章中的内容:</p>

<blockquote>

<p>Ruff 现在默认启用 413 条规则,高于此前版本中的 59 条。</p>

<p>自从 Ruff 的默认规则集上一次在 <a href="https://github.com/astral-sh/ruff/blob/main/changelogs/0.1.x.md#breaking-changes">v0.1.0</a> 中修改以来,Ruff 的规则数量已经从 708 条增长到 968 条。其中许多规则可以捕获严重问题,包括 <a href="https://docs.astral.sh/ruff/rules/load-before-global-declaration">语法错误</a>和 <a href="https://docs.astral.sh/ruff/rules/yield-in-init/">会立即导致运行时错误的问题</a>,但此前并未默认启用。借助新的规则集,Ruff 无需任何配置就能把这些问题以及更多问题提醒给你。</p>

</blockquote>

<p>下面是一条可用于任意 Python 项目的单行命令,用来试用它:</p>

<pre><code>uvx ruff@latest check .

</code></pre>

<p>我把最新版 Ruff 用在了我最大的三个项目上——<a href="https://datasette.io/">Datasette</a>、<a href="https://sqlite-utils.datasette.io/">sqlite-utils</a> 和 <a href="https://llm.datasette.io/">LLM</a>——结果它找出了<em>数百个</em>违反新默认规则的轻微问题。</p>

<p>这三个项目都拥有非常完善的测试套件,并且在 CI 中针对 Python 3.10 到 Python 3.14 运行,所以像这样的升级其实相当安全。下面这条命令完成了大部分升级:</p>

<pre><code>uvx ruff@latest check . --fix --unsafe-fixes

</code></pre>

<p>针对 <code>sqlite-utils</code>,那条命令报告:</p>

<pre><code>Found 1618 errors (1538 fixed, 80 remaining).

</code></pre>

<p>作为一个说明性的例子,下面是剩余问题中的三个。Ruff 对每个问题的解释都写得很好:</p>

<pre><code>DTZ005 `datetime.datetime.now()` called without a `tz` argument

--&gt; tests/test_duplicate.py:17:10

15 | "datetime_col" TEXT)""")

16 | # Insert one row of mock data:

17 | dt = datetime.datetime.now()

| ^^^^^^^^^^^^^^^^^^^^^^^

18 | data = {

19 | "text_col": "Cleo",

help: Pass a `datetime.timezone` object to the `tz` parameter

BLE001 Do not catch blind exception: `Exception`

--&gt; tests/test_plugins.py:16:12

14 | db.execute("select * from pragma_function_list()")

15 | return True

16 | except Exception:

| ^^^^^^^^^

17 | return False

18 | finally:

B018 Found useless attribute access. Either assign it to a variable or remove it.

--&gt; tests/test_update.py:46:5

44 | def test_update_invalid_pk(fresh_db, pk, update_pk):

45 | table = fresh_db["table"]

46 | table.insert({"id1": 5, "id2": 3, "v": 1}, pk=pk).last_pk

| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

47 | with pytest.raises(NotFoundError):

48 | table.update(update_pk, {"v": 2})

</code></pre>

不出所料,考虑到 Astral 的<a href="https://simonwillison.net/2026/Mar/19/openai-acquiring-astral/">新归宿是 OpenAI</a>,这个输出提供了编码代理修复问题所需的一切。

我让 Codex(GPT-5.6 Sol high)<a href="https://github.com/simonw/llm/pull/1557">升级了 LLM</a>,并让 <a href="https://github.com/simonw/sqlite-utils/pull/814">sqlite-utils</a> 也完成了升级;还让 Claude Code(使用 Opus 5)<a href="https://github.com/simonw/datasette/pull/2857">升级了 Datasette</a>。

标签:<a href="https://simonwillison.net/tags/python">python</a>,<a href="https://simonwillison.net/tags/ruff">ruff</a>,<a href="https://simonwillison.net/tags/astral">astral</a>

来源与参考

  1. 原始链接
  2. Ruff v0.16.0

收录于 2026-07-27