Ruff 0.6.x 版本线深度解读:默认行为变更、规则生命周期演进与源码佐证
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"一节,因为规则重映射同样可能导致原本生效的规则被意外禁用。
- 默认 lint 和 format Jupyter Notebook(PR #12878)。此前需要对 notebook 显式开启支持,0.6.0 起
ruff check与ruff format默认覆盖.ipynb文件。 isort规则默认检测src布局的导入(PR #12848)。当项目采用src/目录布局时,Ruff 不再要求手动配置src选项,而是默认推断第一方包的导入位置。- pytest 规则
PT001与PT023的默认行为改变(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-iterable 从 RUF025 重映射到 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-checkpoint(ASYNC100)、async-function-with-timeout(ASYNC109)、async-busy-wait(ASYNC110):支持asyncio与anyio上下文管理器;async-zero-sleep(ASYNC115)、long-sleep-not-forever(ASYNC116):支持anyio上下文管理器。
正式化的自动修复:superfluous-else-return(RET505)、superfluous-else-raise(RET506)、superfluous-else-continue(RET507)、superfluous-else-break(RET508)四条规则的 fix 默认开启。
对升级者来说,正式化的直接后果是:这些能力不再受 preview = true 开关控制,之前为规避 preview 行为而禁用的规则(如 RET505)在升级后会突然重新产生诊断。
0.6.0 的预览特性与规则行为调整
0.6.0 同时带来两个预览特性:
flake8-simplify的SIM108在 preview 下进一步简化为二元表达式(PR #12796);pyupgrade的UP031变为"报告违规但不提供自动修复"(PR #11229)。
此外还有两条规则行为变更:
flake8-import-conventions的默认约定加入xml.etree.ElementTree(PR #12455),即导入该模块时的别名建议会默认生效;flake8-pytest-style的PT006CSV 输出在逗号后补空格(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);N805 将 type(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-parameter(FAST003,PR #12638); - 规则重命名:
pylint的too-many-positional更名为too-many-positional-arguments(R0917,PR #12905); - Server 修复:"fix-all" code-action 应用于 notebook 单元格时的崩溃(PR #12929);
- 其他变更:
flake8-naming的N817开始尊重 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-literal(RUF032)检查以 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)、RUF009 将 datetime.time、datetime.tzinfo、datetime.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-default(RUF033,PR #13192)与 useless if-else(RUF034,PR #13218)落地。规则行为上,PYI019 开始尊重 pep8_naming.classmethod-decorators 配置(PR #13162),多条 flake8-pyi 规则学会处理字符串化标注(PR #12951),UP015 识别 aiofiles.open(PR #13173),UP036 将 sys.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-comparison(R1716,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-pyflakes 的 unused-import(F401)增加 allow-unused-imports 设置(PR #13601),允许按模块模式白名单化"故意保留"的导入(如 __init__.py 的再导出场景),减少了对 noqa 的依赖。其余要点:D208 在末行非空时不再误报(PR #13372);PLR5501 自动修复保留注释等琐碎文本(PR #13573);修复支持在 pip 构建环境中发现 ruff 配置(PR #13591);UP043 修正为覆盖 collections.abc.Generator 与 collections.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)时建议按以下顺序核对:
- 默认行为:确认项目中的
.ipynb是否应纳入 lint/format(0.6.0 起默认纳入);src布局项目的导入规则是否因自动检测而改变了诊断结果;PT001/PT023的括号默认值是否符合团队风格。 - 配置迁移:将配置中的
PT004、PT005、UP027评估替换(已弃用);RUF025改写为C420(重映射,旧代码经 rule_redirects.rs 的重定向表仍可解析);检查是否显式禁用了 0.6.0 正式化的规则(PLE1519、PLW0211、RET505-RET508等),正式化后这些禁用项可能已无必要。 - pre-commit 用户:若依赖 ruff-pre-commit,需确认其版本已包含 notebook 排除逻辑的修复,避免 0.6.0 与 0.6.1 之间的行为不一致。
- LSP 用户:0.6.0 起的错误设置提示、0.6.5 的配置继承修复与无扩展名文件支持,使编辑器内体验与 CLI 更趋一致,升级前后可对比诊断差异。
- F401 白名单需求:若项目此前大量使用
# noqa: F401处理再导出导入,0.6.9 起可改用allow-unused-imports配置项表达相同意图。
本文内容以仓库内 changelogs/0.6.x.md 为准,版本事实(0.6.0–0.6.9 全部小节)均逐条继承自该文档;涉及规则重映射、命令入口等实现细节的证据来自仓库源码,引用时保留了可核实的文件路径。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00