Ruff 0.9.x 版本全解析2025 格式风格落地、规则稳定化与错误修复纵览【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruffRuff 0.9.x 是 Python 生态中一次「格式风格代际切换 规则体系大扩容」的版本序列它以2025 稳定代码风格为分水岭把一大批在预览preview中打磨多年的格式化行为与 lint 规则正式转正同时为后续版本储备了大量新规则与底层能力。阅读本文你将系统掌握 0.9.00.9.10 各补丁版本的完整变更脉络格式化、规则、LSP 服务器、CLI、配置系统理解这些变更背后的源码实现位置并能在升级时准确评估代码风格与 lint 结果的变化风险。仓库背景说明本仓库为 Ruff 的官方源码仓库当前工作区版本已推进到0.16.5见 crates/ruff/Cargo.tomlchangelogs/0.9.x.md记录的是历史版本线。阅读时可把它当作「0.9 时代行为快照」文中所列的规则大多在后续版本继续演进源码位置以当前工作区为准。一、0.9.x 版本线与最重要的 Breaking Change0.9.x 序列包含 0.9.0 至 0.9.10 共 11 个补丁版本。与一般的「修修补补」不同0.9.0 引入了对整个用户群影响最大的破坏性变更Ruff 现在按照2025 风格指南格式化你的代码因此既有代码的格式化结果可能会发生变化。官方同时承诺本次发布不会移除或重映射任何已稳定的规则stable rules 不回退迁移的注意力应集中在「格式化输出差异」而不是「规则告警丢失」上。其余 0.9.10.9.10 均以 bug fix、规则增强与 preview 新规则为主不涉及新的破坏性变更。二、2025 稳定风格格式化器如何被重构2.1 稳定化的格式化行为清单0.9.0 将以下格式化行为从 preview 提升为稳定默认行为这也是升级后 diff 的主要来源变更点说明影响面f-string 元素中的表达式格式化表达式在 f-string 内部按普通表达式规则排版所有含复杂 f-string 的代码f-string 内部字符串的备选引号内层字符串可选择与外壳不同的引号避免转义字符串字面量繁多的代码f-string 调试表达式保留十六进制大小写不因排版改变{x:#x}类调试表达式的语义调试输出隐式拼接 f-string 逐字面量选择引号风格从「整串统一引号」改为「每个字符串各自选引号」多行字符串常量单行可容纳时自动合并隐式拼接将隐式拼接的多段字符串合并为一个字面量几乎所有长字符串写法移除ISC001不兼容警告隐式拼接风格不再与single-line-implicit-string-concatenation规则互斥开启 ISC001 的项目assert消息优先加括号宁可把消息包进括号也不拆散断言表达式含assert的代码过长的match ... caseguard 自动加括号ifguard 超长时整体包括号使用 match 的代码match case模式排版更一致统一 pattern 的缩进、换行策略使用 match 的代码去掉返回类型注解多余括号- (int)之类不再保留无谓括号类型注解条件带行首注释的推导式让左括号紧跟if关键字所在行推导式复杂条件3.8 及更早版本单上下文管理器with排版更一致按语法版本统一处理低版本兼容项目max-doc-code-line-length dynamic时文档代码块行宽计算修正按真实代码块宽度而不是按注释宽度截断格式化 长文档字符串2.2 源码里的机制preview 风格如何「转正」Ruff 的格式风格演进依赖一套「命名化 preview 开关」机制见 crates/ruff_python_formatter/src/preview.rs。该文件的文档注释解释得很清楚刻意不用笼统的is_preview()而是为每个风格特性命名独立函数例如is_hug_parens_with_braces_and_square_brackets_enabled转正时只需删除对应函数让编译器指出所有需要移除的检查点——正是这套机制让 0.9.0 能一次性、低风险地把十多项行为从 preview 切到 stable。2.3 0.9.x 后续补丁中的格式化修复0.9.1保留隐式拼接字符串中最后一个字符串字面量的行尾注释此前会被吞掉。0.9.2修复含花括号的 f-string 表达式周围花括号间距quote-style preserve下不同引号 f-string 拼接问题。0.9.3修复 f-string 表达式中单元素元组的括号间距含尾逗号表达式的不稳定格式化同一输入反复格式化产生不同结果。0.9.7修复带括号属性值尾部行尾注释的不稳定排版。0.9.10修复 notebook 中语法错误的定位.ipynb单元格内的报错位置。三、规则稳定化从 preview 走向默认0.9.0 将以下规则正式转正不再需要preview true规则码规则名英文所属类别备注A005stdlib-module-shadowingflake8-builtins改名原名builtin-module-shadowing并补充 stdlib 模块检测A006builtin-lambda-argument-shadowingflake8-builtinslambda 参数遮蔽内置名FURB188slice-to-remove-prefix-or-suffixrefurb切片实现去前后缀PLR1716boolean-chained-comparisonpylint链式布尔比较RUF032decimal-from-float-literalruff浮点字面量构造DecimalRUF033post-init-defaultruff__post_init__中重复默认值见 实现RUF034useless-if-elseruff无意义的if/else见 实现行为级稳定化同样值得关注——规则检测范围扩大但结论已定为默认行为PT006pytest-parametrize-names-wrong-type新增检测装饰器之外的pytest.parametrize调用、以及带关键字参数的调用。E402module-import-not-at-top-of-file忽略 import 语句之间的pytest.importorskip调用pytest 常用它在导入阶段做条件跳过。RUF008/RUF009mutable-dataclass-default/function-call-in-dataclass-default-argument新增对attrs库的支持。PYI006bad-version-info-comparison检测范围从 stub 扩展到非 stub 文件。修复级稳定化autofix 输出可信赖PYI041redundant-numeric-union与PYI016duplicate-union-members的安全修复转为默认行为。四、0.9.x 全系列新增 preview 规则盘点Ruff 采用「preview 蓄水、后续转正」的发布节奏。0.9.x 各补丁为后续版本储备了大量新规则0.9.0B903class-as-data-structureflake8-bugbearTC008quoted-type-alias在TYPE_CHECKING中更积极、stub 中豁免PLW1641stub 中豁免eq-without-hashUP007/UP045拆分Union与Optional分别成规则RUF049enum dataclass 双装饰类RUF025重新编号为RUF037。0.9.1W391扩展至 notebook 单元格RUF052忽略被遮蔽的私有函数哑元参数。0.9.2FAST003正确处理Depends参数PT028测试函数参数带默认值、PT029/PT030/PT031pytest.warns诊断AIR302/AIR303扩展TC008避免对|的误报。0.9.3UP046/UP047PEP 695 泛型重写分别用于类与函数FURB122for-loop-writesRUF047needless-elseRUF058starmap-zipW0244redefined-slots-in-subclassSIM103避免双重否定。0.9.4RUF055支持更多re模式RUF058增加遮蔽检测与可变参数豁免RUF057多行参数时修复加括号。0.9.5RUF053混合风格类型变量类UP049PEP 695 私有类型参数改名LOG004/LOG014扩展.exception()、exc_info用于异常处理器之外PYI019系列修复。0.9.6RUF054indented-form-feed缩进中的换页符PLE1310扩展PYI061修复扩展到 Python ≤ 3.9。0.9.7FURB162手动 timezone monkeypatch 检测RUF045dataclass 中的隐式类变量FURB189检测带下标表达式子类。0.9.8解析器开始检测与版本相关的语法错误。0.9.10RUF059unused-unpacked-variable未使用的解包赋值见 实现并批量加入syntax-errors类别规则见下文第七节。源码视角以 RUF049 为例看预览规则的真实实现RUF049enum 与 dataclass 双装饰的实现在 dataclass_enum.rs。其核心逻辑是当类同时带dataclass仅 stdlib 版本触发且继承Enum时报告诊断。规则文档给出了一个颇具警示性的例子from dataclasses import dataclass from enum import Enum dataclass class E(Enum): ...文档注释指出运行期不报错但结果可能出乎意料——E.A E.B可能为True。修复动作是移除dataclass或Enum二者之一。作为旁证当前仓库中该规则的stable_since元数据为0.12.0说明 0.9.x 的 preview 规则正是后续稳定版的「蓄水池」。五、Rule changes 精选更准确的检测与更安全的修复0.9.x 对大量既有规则做了检测范围、消息与修复质量调整下列条目具有普遍代表性RET503新增对返回typing.Never函数的支持flake8-return。A005stub 文件豁免 stdlib 模块遮蔽0.9.6 起严格模块名比较改为可选、并向上游行为对齐。ERA001忽略紧接普通代码块的「元数据块」注释减少误杀被# type: ignore之类分隔的注释。E252避免对类型别名的误报E402后续还豁免了sys.path ...、site.addsitedir(...)。F523删除format最后一个参数时连同整个调用一起删除避免留下语法残骸。FURB171右侧是字符串字面量时把修复标记为unsafe。RUF046删除int()调用会改变语义时为参数加括号保护避免int(1.2)与int x解析差异。F811按源码顺序应用重定义修复、按语句分组防止删错 import。PLR1730if-stmt-min-max修复中参数顺序修正。UP040复用UP046/UP047的替换逻辑保留更多注释。SIM201/SIM202修复统一标记为 unsafeC401修复剥离多余括号。I001isort 修复输出不再残留行尾空白。PLW1507修复标记 unsafePLE1310优化为按类型匹配避免误报。B017改善assert-raises-exception消息。多规则dataclass 相关默认值规则RUF008/RUF009/RUF012在强制执行前先分析延迟注解0.9.6 起RUF009与B008行为对齐不可变类型属性豁免。六、ServerLSP演进可观测性、notebook 与索引策略0.9.x 对ruff server编辑器内的语言服务器做了一系列务实改进日志开关解耦0.9.0移除「必须把trace设为 verbose 才能看到日志」的耦合服务器日志完全由logLevel设置控制默认info。这修复了「报错后引导用户查日志日志却为空」的体验问题。相关实现位于 crates/ruff_server/src/logging.rs。代码动作0.9.0code action 请求时忽略来自其他来源如客户端自带检查器的诊断避免对不属于自己的问题给出修复。Notebook 同步0.9.1/0.9.7修复单元格重排后服务器与客户端 notebook 状态失步notebook 单元格忽略source.organizeImports.ruff与source.fixAll.ruff。索引与配置0.9.2/0.9.6/0.9.8避免同一工作区重复索引根目录排除规则锚定到项目根当configurationPreference为editorOnly时跳过项目索引。配置与诊断0.9.2/0.9.8ruff.configuration错误展示上下文后续版本扩展ruff.configuration支持内联配置并对无效客户端设置给出用户提示。调试信息0.9.7/0.9.8ruff.printDebugInformation支持按文档返回调试信息以字符串形式返回。安全修复可选项0.9.3code action 允许通过unsafe-fixes设置启用不安全修复。生命周期0.9.7修复收到 shutdown 消息后继续处理请求的竞态。七、版本感知语法错误检测0.9.8/0.9.10 的syntax-errors0.9.8 开始让解析器探测与目标 Python 版本相关的语法错误0.9.10 则集中补齐了一批按版本判定「语法是否存在」的规则全部属于syntax-errors预览类别赋值表达式walrus在 Python3.8 之前非法装饰器中的命名表达式在3.9 之前非法带括号的关键字参数名在3.8 之后更早版本中它是非法/不同语义纯位置参数/在3.8 之前非法return/yield中的元组解包在3.8 之前非法except*在3.11 之前非法type语句与类型参数列表在3.12 之前非法类型参数默认值在3.13 之前非法。这些能力与 Ruff 的target-version体系呼应同一份代码面向不同 Python 版本运行时Ruff 能给出不同的语法合法性结论。注意这些是预览特性默认关闭需preview true0.9.9 还修复了「不支持语法」错误的缓存问题并确保仅在编辑器开启 preview 时才显示该类别错误避免打扰默认配置用户。八、CLI 与配置系统改进CLI--config keyvalue错误信息0.9.0当key对应的是表table而传入的却是简单value时给出清晰得多的错误提示。无效 noqa 警告0.9.7即使没有任何诊断也会对无效的# noqa给出警告此前无诊断时静默忽略。配置加载错误0.9.7extend引用配置加载失败时提供更好的错误信息。ruff config补全0.9.4实现 Tab 自动补全。输出序列化0.9.10GitLab 格式输出器将规则码从description字段移到check_name字段便于 CI 按规则聚合。配置系统去掉flatten0.9.2反序列化错误消息质量提升错误现在指向真正出错的字段路径。别名冲突只在真实冲突时报错0.9.5flake8-import-conventions的别名与isort.required-imports绑定名冲突时才报配置错误。新增per-file-target-version0.9.8允许按文件 glob 覆盖目标 Python 版本例如把「开发者脚本」单独视为py310。该选项在 crates/ruff_workspace/src/options.rs 中实现类型为FxHashMapString, PythonVersion适用前提是开启preview特性。[tool.ruff] # 全局目标版本 target-version py311 [tool.ruff.lint] # syntax-errors 等预览规则需要显式开启 preview true # 按文件覆盖目标版本 [tool.ruff] per-file-target-version { developer_scripts/*.py py310 }注per-file-target-version随 0.9.8 引入时处于 preview是否在后续版本默认生效请以当前版本ruff config输出与 docs/configuration.md 为准。文档类收尾0.9.x 也沉淀了不少文档工作为缺失选项补充配置 docstring、修正S611示例、统一 docstring 内 markdown 标题层级、明确D417只检查带参数节的 docstring、补充 MSRV 政策说明、新增SECURITY.md、以及ruff-lsp相关设置的弃用警告与迁移文档。九、升级与排障实践建议格式化差异先行评估升级到 0.9.0 后先在主干跑一次ruff format --check或生成 diff 评审重点观察 f-string 引号选择、隐式拼接字符串合并、assert消息括号化与matchguard 换行——它们是 2025 风格最主要的外显变化。在只读仓库场景下可对副本执行ruff format后用git diff复核必要时在 pyproject 中暂缓开启格式化新行为。规则转正不用改配置被稳定化的规则A005/A006/FURB188/PLR1716/RUF032/RUF033/RUF034等只要在select中升级后立即生效原先为 preview 规则写的启用代码可以清理。预览新规则按需尝鲜B903、UP046/UP047、RUF049、RUF059、syntax-errors等 0.9.x 新面孔均在 preview 中开启preview true即可体验也可通过--preview单独验证。对照源码核对行为本仓库 crates/ruff_linter/src/rules 下每个规则的实现与snapshots测试一一对应例如想确认RUF052哑元变量检测细节可看 used_dummy_variable.rs规则元数据stable_since、所属类别会随版本演进阅读时注意当前工作区版本为0.16.5。追踪发布节奏完整变更历史位于仓库 CHANGELOG.md 与 changelogs 目录下按主版本拆分的文件如 changelogs/0.10.x.md0.9.x 的行为差异可回查本文所依据的 changelogs/0.9.x.md。十、小结Ruff 0.9.x 用「一次大风格切换2025 stable style 连续 10 个补丁打磨」完成了三件事把格式化的不确定性与 preview 时代的中间状态收敛为稳定的默认输出通过 7 条规则转正与一批行为/修复稳定化兑现「stable 规则只增不减」的承诺并以syntax-errors、per-file-target-version、server 日志可观测性等能力为后续版本铺路。对使用者而言0.9 时代的关键词是**「迁移前先看 diff、尝鲜新规则记得开 preview、规则行为以本仓库源码与测试快照为准」**。【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考