Simon Willison 2026/7/26 · 2026-07-26 12:59:13 · 17 阅读
Ruff v0.16.0 发布:默认规则从59条增至413条,无需配置即可发现严重问题
Ruff v0.16.0。Astral 几天前(7月23日)发布了其 Ruff Python 代码检查工具的重要新版本。我今天才发现,因为我未锁定版本的 "ruff" 开发依赖触发了新的默认检查规则,导致我多个 CI 作业全部失败。
摘自 Brent Westbrook 的发布公告:
Ruff 现在默认启用 413 条规则,而之前版本只有 59 条。
自上次修改默认规则集(v0.1.0)以来,Ruff 的规则总数从 708 增长到 968。其中许多规则能捕获严重问题,包括语法错误和立即运行时错误,但之前默认并未启用。借助新的规则集,Ruff 无需任何配置即可将这些及更多问题暴露给你。
以下是针对任何 Python 项目运行新版本的简单命令:
uvx ruff@latest check .
我在我的三个主要项目——Datasette、sqlite-utils 和 LLM——上运行了最新版 Ruff,结果发现了 数百 个违反新默认规则的微小问题。
这三个项目都有非常全面的测试套件,在 CI 中针对 Python 3.10 到 Python 3.14 运行,因此这样的升级相当安全。以下命令完成了大部分修复工作:
uvx ruff@latest check . --fix --unsafe-fixes
对 sqlite-utils 运行该命令后,输出如下:
Found 1618 errors (1538 fixed, 80 remaining).
作为示例,以下是三个未修复的问题。Ruff 对每个问题都给出了清晰的解释:
DTZ005 `datetime.datetime.now()` 调用时未提供 `tz` 参数
--> tests/test_duplicate.py:17:10
|
15 | "datetime_col" TEXT)""")
16 | # 插入一行模拟数据:
17 | dt = datetime.datetime.now()
| ^^^^^^^^^^^^^^^^^^^^^^^
18 | data = {
19 | "text_col": "Cleo",
|
帮助:向 `tz` 参数传入一个 `datetime.timezone` 对象
BLE001 不要盲目捕获异常:`Exception`
--> 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 检测到无用的属性访问。请将其赋值给变量,或直接移除。
--> 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})
|
考虑到 Astral 已加入 OpenAI,这样的输出为编码代理提供了修复问题所需的一切信息,这并不意外。
我用 Codex (GPT-5.6 Sol high) 升级了 LLM 和 sqlite-utils,用 Claude Code (with Opus 5) 升级了 Datasette。
原始来源: Simon Willison