首页
/ Ruff 0.6.x 版本线深度解读:默认行为变更、规则生命周期演进与源码佐证

Ruff 0.6.x 版本线深度解读:默认行为变更、规则生命周期演进与源码佐证

2026-09-05 22:11:58作者:冯爽妲Honey

Ruff 0.6.x 是该工具从 0.5 到 1.0 演进过程中一个重要的过渡版本线:0.6.0 引入了多项默认行为变更(Jupyter Notebook 默认启用 lint 与 format、src 布局自动检测),并对十余条规则完成了弃用、重映射与正式化(stabilize)操作;后续的 0.6.1 至 0.6.9 则以热修复、预览规则扩充和性能优化为主。读完本文,你可以掌握 0.6.x 全部九个版本的变更脉络、升级时需要迁移的配置点(被弃用/重映射规则的替换方式、F401 新增的 allow-unused-imports 设置),以及 ruff analyze 等新增子命令的演进背景,并在仓库源码中定位这些变更的实现证据。

0.6.0:默认行为变更(Breaking Changes)

0.6.0 是 0.6.x 版本线的起点,官方在 changelogs/0.6.x.md 中明确将下列三项列为破坏性变更(Breaking changes),并在文档中提示:还需同时关注下文"Remapped rules"一节,因为规则重映射同样可能导致原本生效的规则被意外禁用。

  1. 默认 lint 和 format Jupyter Notebook(PR #12878)。此前需要对 notebook 显式开启支持,0.6.0 起 ruff checkruff format 默认覆盖 .ipynb 文件。
  2. isort 规则默认检测 src 布局的导入(PR #12848)。当项目采用 src/ 目录布局时,Ruff 不再要求手动配置 src 选项,而是默认推断第一方包的导入位置。
  3. pytest 规则 PT001PT023 的默认行为改变(PR #12838):当装饰器没有参数时,默认省略装饰器括号,即推荐 @pytest.mark.xfail 而非 @pytest.mark.xfail()

这三项变更的共同特点是"收紧默认值":升级 0.6.0 后,若你的 notebook 或 src 布局项目之前依赖宽松默认值,扫描结果可能突然出现新告警,需要按新默认值调整代码或显式在 pyproject.toml / ruff.toml 中覆盖相应选项。

规则生命周期:弃用(Deprecation)与重映射(Remap)

0.6.0 对规则生命周期做了三类关键操作,这是升级该版本线时最需要逐项核对的部分。

弃用的规则

以下规则自 0.6.0 起被标记为弃用(deprecated):

规则名 代码
pytest-missing-fixture-name-underscore PT004
pytest-incorrect-fixture-name-underscore PT005
unpacked-list-comprehension UP027

弃用意味着这些规则仍会工作,但不再推荐启用,后续版本可能移除;依赖其自动修复的 CI 流水线应尽快迁移。

重映射的规则

unnecessary-dict-comprehension-for-iterableRUF025 重映射到 C420。该变更在仓库源码中有直接证据:重映射表 rule_redirects.rs 中登记了这条重定向:

// See: https://github.com/astral-sh/ruff/issues/12110
("RUF025", "C420"),

重映射表由 REDIRECTS 静态映射实现,get_redirect_target 函数负责在解析用户配置的 select/ignore 时将旧代码改写为新代码。由于 RUF025 语义上属于 flake8-comprehensions 家族,归入 C4xx 编号段后,规则命名空间更一致。对用户的实际影响是:在配置中继续写 RUF025 仍能命中新规则(通过重定向兜底),但文档与告警展示的规范代码已是 C420,建议逐步改写配置。

正式化(Stabilization)的规则

0.6.0 将一批原本处于 preview 状态的规则、行为与修复正式化,正式化后这些能力默认生效(无需开启 preview)。按类别整理如下:

正式化的规则:

规则 代码
singledispatch-method PLE1519
singledispatchmethod-function PLE1520
bad-staticmethod-argument PLW0211
if-stmt-min-max PLR1730
invalid-bytes-return-type PLE0308
invalid-hash-return-type PLE0309
invalid-index-return-type PLE0305
invalid-length-return-type PLEE303(原文档如此记载)
self-or-cls-assignment PLW0642
byte-string-usage PYI057
duplicate-literal-member PYI062
redirected-noqa RUF101

正式化的行为(均为 flake8-async 系规则对 asyncio/anyio 上下文管理器的支持):

  • cancel-scope-no-checkpointASYNC100)、async-function-with-timeoutASYNC109)、async-busy-waitASYNC110):支持 asyncioanyio 上下文管理器;
  • async-zero-sleepASYNC115)、long-sleep-not-foreverASYNC116):支持 anyio 上下文管理器。

正式化的自动修复superfluous-else-returnRET505)、superfluous-else-raiseRET506)、superfluous-else-continueRET507)、superfluous-else-breakRET508)四条规则的 fix 默认开启。

对升级者来说,正式化的直接后果是:这些能力不再受 preview = true 开关控制,之前为规避 preview 行为而禁用的规则(如 RET505)在升级后会突然重新产生诊断。

0.6.0 的预览特性与规则行为调整

0.6.0 同时带来两个预览特性:

  • flake8-simplifySIM108 在 preview 下进一步简化为二元表达式(PR #12796);
  • pyupgradeUP031 变为"报告违规但不提供自动修复"(PR #11229)。

此外还有两条规则行为变更:

  • flake8-import-conventions 的默认约定加入 xml.etree.ElementTree(PR #12455),即导入该模块时的别名建议会默认生效;
  • flake8-pytest-stylePT006 CSV 输出在逗号后补空格(PR #12853)。

Server(LSP 服务端)方面,0.6.0 会在设置不正确时向用户展示提示消息(PR #12781),为后续 0.6.5 的 LSP 配置继承修复打下基础。

0.6.0 的 bug 修复集中在异步与 RUF 系列规则:ASYNC100 不再对上下文管理器中的 yield 误报(PR #12896);C419 不再检查 async for 推导式(PR #12895);RET503 仅在函数末尾追加 return None(PR #11074);TCH003 不再把 dataclasses.KW_ONLY 当作仅类型导入(PR #12863);N805type(Protocol) 等视为元类基类(PR #12770);DOC201/DOC202 不在抽象方法上强制返回文档(PR #12771);RUF031 跳过含切片表达式的元组并忽略类型标注/类型别名中的无括号元组(PR #12768、#12762);RUF027 忽略传给 logging 与 builtins._() 的模板字符串(PR #12889);Python 3.10 及更早版本下 RUF031 不为含星号展开的元组去除括号(PR #12784)。另外,函数默认参数值改为在函数自身的封闭作用域中求值(PR #12852),这是一项影响名称解析语义的正确性修复。

0.6.1:ruff-pre-commit 行为一致性热修复

0.6.1 的定位在原文档中写明得很清楚:这是一个热修复版本,解决 ruff-pre-commit 与 0.6.0 新默认值的不一致。0.6.0 之后 Ruff 默认 lint 和 format Jupyter notebook,但通过 pre-commit 运行 Ruff 时,由于疏漏,notebook 文件仍被默认排除,导致"直接运行"与"经 pre-commit 运行"行为不一致。该问题在 ruff-pre-commit 仓库侧修复(其 PR #96),0.6.1 随此发布。

0.6.1 同期还包含:

  • 预览特性:fastapi 插件实现 fast-api-unused-path-parameterFAST003,PR #12638);
  • 规则重命名:pylinttoo-many-positional 更名为 too-many-positional-argumentsR0917,PR #12905);
  • Server 修复:"fix-all" code-action 应用于 notebook 单元格时的崩溃(PR #12929);
  • 其他变更:flake8-namingN817 开始尊重 import conventions(PR #12922)。

0.6.2 与 0.6.3:预览规则扩充与误报治理

0.6.2 的预览特性包括:SIM115 扩展到更多标准库 IO 模块(PR #12959);RUF029 避免对带 FastAPI 路由装饰器的函数误报 unused-async(PR #12938);RUF027 忽略 FastAPI 路径中的 fstring-missing-syntax(PR #12939);新增 decimal-from-float-literalRUF032)检查以 float 字面量调用 Decimal(PR #12909)。规则行为变更覆盖:B015 诊断文案更新、PYI053 跳过类型标注、flake8-type-checking 始终将相对导入视为第一方(PR #12994)、ARG001 忽略 stub 函数中的未使用参数、PLW0642 忽略增强赋值。Bug 修复包括 N817 不再标记符合约定的 from 导入(PR #12946),以及 PLW0211 允许带 @staticmethod__new__cls 作首参(PR #12958)。Server 侧开始展示更完整的错误日志上下文(PR #13029)。

0.6.3 的要点:SIM115 进一步支持 dbm.sqlite3(PR #13104);preview 下 .pyi 文件禁用 E741(PR #13119);DOC201 不再对只返回 None 的函数中的显式 return 报错(PR #13064)。行为变更:ASYNC109 在 Python 低于 3.11 时禁用 asyncio 相关检查(PR #13023),使规则与语言版本能力对齐。Bug 修复方面,FAST002 的修复不再产生非法语法(PR #13133)、ISC001 合并隐式字符串拼接前先归一化八进制字面量(PR #13118)、PLW3301 避免对非 min/max 调用提供自动修复(PR #13089)、RUF009datetime.timedatetime.tzinfodatetime.timezone 纳入不可变函数调用集合(PR #13109),以及 RUF100 的注释删除扩展到 noqa 指令后的尾部文本同时保留同行的后续注释(PR #13105)。Playground 的暗色主题首屏渲染问题也在此版本修复(PR #13077)。

0.6.4 至 0.6.6:ruff analyze 子命令的起步

0.6.4 引入的预览规则较多:flake8-builtins 改为按 Python 版本动态生成内建名列表(PR #13172);pydoclint 允许 DOC402/DOC403 中 yield None(PR #13148);新规则 post-init-defaultRUF033,PR #13192)与 useless if-elseRUF034,PR #13218)落地。规则行为上,PYI019 开始尊重 pep8_naming.classmethod-decorators 配置(PR #13162),多条 flake8-pyi 规则学会处理字符串化标注(PR #12951),UP015 识别 aiofiles.open(PR #13173),UP036sys.version_info[0] < 3 之类的比较标记为过时(PR #13175)。CLI 层面,SARIF 输出消息更丰富(PR #13180),ruff format 对"不兼容规则"警告处理了单数情形(PR #13212)。

0.6.5 的 Server 变更值得注意:LSP 服务端支持无扩展名的 Python 文件(PR #13326),并修复了 LSP settings 中指定配置的继承问题(PR #13285)——这与 0.6.0 的"错误设置提示"共同构成该版本线对 LSP 配置体验的连续改进。CLI 方面,SARIF metadata 只包含存在诊断的规则(PR #13268);Playground 新增"Copy as pyproject.toml/ruff.toml"与"Paste from TOML"功能(PR #13328)。

0.6.6 是本版本线中 ruff analyze 能力出现的关键版本:预览特性新增"生成依赖图"的子命令(PR #13402),后续 0.6.7、0.6.8 持续向其追加功能(Python 版本支持、exclude、基础通配导入检测)。在当前仓库中,该子命令的实现位于 analyze_graph.rs,命令入口注册在 commands/mod.rs,对应工作区命令目录 crates/ruff/src/commands/。0.6.6 同时修复了 formatter 行内参数注释的位置问题(PR #13379)与 Server 的 LineIndex::offset 差一错误(PR #13407)。

0.6.7 继续完善 ruff analyze:支持按 Python 版本解析(PR #13426)与 exclude 配置(PR #13425),并修复返回类型标注的括号问题(PR #13381);ruff check --add-noqa 开始尊重 lint.exclude(PR #13427)。性能方面引入两项基于 Salsa 的优化:避免在 Salsa 中跟踪模块解析器文件(PR #13437)并对模块解析器数据库使用 forget(PR #13438)。

0.6.8 至 0.6.9:新规则、新配置项与性能收尾

0.6.8 的预览特性包括:移除 match case 子句中不必要的括号(PR #13510)、对过长的 match..case guard 添加括号(PR #13513)、ruff analyze graph 检测基础通配导入(PR #13486),以及新规则 boolean-chained-comparisonR1716,PR #13435)。规则行为上,SIM910 扩展支持 **kwargs(PR #13503),UP028 修复了循环变量非引用遮蔽绑定导致的漏报(PR #13504)。稳定性修复包括:*args 绑定元组的检测(PR #13512)、broken pipe 优雅退出(PR #13485)与 analyze graph 遇 broken pipe 不再 panic(PR #13484)。性能优化复用模块解析器中的 BTreeSet(PR #13440)、跳过非复合语句的遍历(PR #13441)。

0.6.9(0.6.x 系列最终版本)引入了一个有长期价值的新配置项:为 flake8-pyflakesunused-importF401)增加 allow-unused-imports 设置(PR #13601),允许按模块模式白名单化"故意保留"的导入(如 __init__.py 的再导出场景),减少了对 noqa 的依赖。其余要点:D208 在末行非空时不再误报(PR #13372);PLR5501 自动修复保留注释等琐碎文本(PR #13573);修复支持在 pip 构建环境中发现 ruff 配置(PR #13591);UP043 修正为覆盖 collections.abc.Generatorcollections.abc.AsyncGenerator(PR #13611);FURB118 修复元组切片处理(PR #13518)并将 preview 下的 fix 标记为 unsafe(PR #13613)。文档方面更新了 GitHub Action 指向 astral-sh/ruff-action(PR #13551,此处仅转述文档记载,不附链接)。

升级 0.6.x 的核对清单

综合整个版本线的变更,从 0.5.x 升级到 0.6.x(尤其是 0.6.0)时建议按以下顺序核对:

  1. 默认行为:确认项目中的 .ipynb 是否应纳入 lint/format(0.6.0 起默认纳入);src 布局项目的导入规则是否因自动检测而改变了诊断结果;PT001/PT023 的括号默认值是否符合团队风格。
  2. 配置迁移:将配置中的 PT004PT005UP027 评估替换(已弃用);RUF025 改写为 C420(重映射,旧代码经 rule_redirects.rs 的重定向表仍可解析);检查是否显式禁用了 0.6.0 正式化的规则(PLE1519PLW0211RET505-RET508 等),正式化后这些禁用项可能已无必要。
  3. pre-commit 用户:若依赖 ruff-pre-commit,需确认其版本已包含 notebook 排除逻辑的修复,避免 0.6.0 与 0.6.1 之间的行为不一致。
  4. LSP 用户:0.6.0 起的错误设置提示、0.6.5 的配置继承修复与无扩展名文件支持,使编辑器内体验与 CLI 更趋一致,升级前后可对比诊断差异。
  5. F401 白名单需求:若项目此前大量使用 # noqa: F401 处理再导出导入,0.6.9 起可改用 allow-unused-imports 配置项表达相同意图。

本文内容以仓库内 changelogs/0.6.x.md 为准,版本事实(0.6.0–0.6.9 全部小节)均逐条继承自该文档;涉及规则重映射、命令入口等实现细节的证据来自仓库源码,引用时保留了可核实的文件路径。

登录后查看全文
热门项目推荐
相关项目推荐