
Ruff 0.2 系列版本演进全解析配置命名空间迁移、规则重映射与 Preview 特性转正【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruffRuff 0.2.x 是该项目早期演进中最具结构性的一批版本0.2.0 完成了配置项向lint命名空间的迁移、5 条规则代码的重映射以及大量 Preview 规则的转正0.2.1 为ruff format引入按行范围格式化--range0.2.2 则带来 f-string 初步格式化、CLI 任意配置覆盖--config keyvalue与词法/解析层的显著提速。读完本文你将掌握从 0.1.x 平滑升级到 0.2.x 所需的完整迁移清单并能通过仓库源码验证每一项变更的实际落点。0.2.0配置架构重构与规则体系大调整0.2.0 是 0.2.x 中变更幅度最大的版本包含破坏性变更、大规模弃用、规则重映射和 Preview 转正四类内容下面逐一展开。破坏性变更NURSERY 选择器下线NURSERY选择器不再可用。在 Preview 未启用的情况下不再允许通过精确规则代码选择selectnursery孵化中规则。这一点可以在当前源码中得到印证。在 规则选择器解析逻辑 中NURSERY仅作为PREVIEW的别名被保留解析且按类别、按名称选择规则均要求开启 Preview 模式} else if matches!(selector, PREVIEW | NURSERY) { // ... Selecting rules by category requires preview mode Selecting rules by name requires preview mode而选择器实际生效时的过滤逻辑rules()方法根据PreviewOptions决定是否纳入 preview 规则并支持explicit-preview-rules要求显式代码选择这与 0.2.0 中“未开启 preview 不得按精确代码选择 nursery 规则”的声明一致。弃用项清单被弃用的规则迁移到其他命名空间或由其他规则取代missing-type-selfANN101missing-type-clsANN102被弃用的命令行选项应改用输出格式控制弃用选项替代方式--show-source--output-format full--no-show-source--output-format concise--output-format text改用full或concise迁移到lint命名空间的配置项旧顶层名称被弃用。这是 0.2.0 最主要的迁移工作原先平铺在顶层的 lint 相关配置全部收敛进[lint]表旧名称仍可解析但会触发弃用提示。完整迁移对照如下左侧为旧名右侧为新名旧配置项新配置项ruff.allowed-confusablesruff.lint.allowed-confusablesruff.dummy-variable-rgxruff.lint.dummy-variable-rgxruff.explicit-preview-rulesruff.lint.explicit-preview-rulesruff.extend-fixableruff.lint.extend-fixableruff.extend-ignoreruff.lint.extend-ignoreruff.extend-per-file-ignoresruff.lint.extend-per-file-ignoresruff.extend-safe-fixesruff.lint.extend-safe-fixesruff.extend-selectruff.lint.extend-selectruff.extend-unfixableruff.lint.extend-unfixableruff.extend-unsafe-fixesruff.lint.extend-unsafe-fixesruff.externalruff.lint.externalruff.fixableruff.lint.fixableruff.flake8-annotationsruff.lint.flake8-annotationsruff.flake8-banditruff.lint.flake8-banditruff.flake8-bugbearruff.lint.flake8-bugbearruff.flake8-builtinsruff.lint.flake8-builtinsruff.flake8-comprehensionsruff.lint.flake8-comprehensionsruff.flake8-copyrightruff.lint.flake8-copyrightruff.flake8-errmsgruff.lint.flake8-errmsgruff.flake8-gettextruff.lint.flake8-gettextruff.flake8-implicit-str-concatruff.lint.flake8-implicit-str-concatruff.flake8-import-conventionsruff.lint.flake8-import-conventionsruff.flake8-pytest-styleruff.lint.flake8-pytest-styleruff.flake8-quotesruff.lint.flake8-quotesruff.flake8-selfruff.lint.flake8-selfruff.flake8-tidy-importsruff.lint.flake8-tidy-importsruff.flake8-type-checkingruff.lint.flake8-type-checkingruff.flake8-unused-argumentsruff.lint.flake8-unused-argumentsruff.ignoreruff.lint.ignoreruff.ignore-init-module-importsruff.lint.ignore-init-module-importsruff.isortruff.lint.isortruff.logger-objectsruff.lint.logger-objectsruff.mccaberuff.lint.mccaberuff.pep8-namingruff.lint.pep8-namingruff.per-file-ignoresruff.lint.per-file-ignoresruff.pycodestyleruff.lint.pycodestyleruff.pydocstyleruff.lint.pydocstyleruff.pyflakesruff.lint.pyflakesruff.pylintruff.lint.pylintruff.pyupgraderuff.lint.pyupgraderuff.selectruff.lint.selectruff.task-tagsruff.lint.task-tagsruff.typing-modulesruff.lint.typing-modulesruff.unfixableruff.lint.unfixable这一设计的动因在 workspace 选项定义 中可见lint小节下的选项优先于被弃用的顶层设置即“Options specified in the lint section take precedence over the deprecated top-level settings”。对用户而言迁移策略就是把pyproject.toml/ruff.toml中上述顶层键整体挪进[lint]表例如# 旧写法弃用 select [E, F, I] ignore [E501] # 新写法 [lint] select [E, F, I] ignore [E501]规则代码重映射5 条规则被重映射到新代码。若你的配置或noqa注释仍使用旧代码规则将实际上被“禁用”旧代码指向新代码而旧代码对应的规则本体不复存在这也是 changelog 特别提示“见 Remapped rules 一节否则可能导致规则被禁用”的原因规则旧代码新代码raise-without-from-inside-exceptTRY200B904suspicious-eval-usagePGH001S307logging-warnPGH002G010static-key-dict-comprehensionRUF011B035runtime-string-unionTCH006TCH010重映射的实现位于 rule_redirects.rs一张静态HashMap把所有历史代码映射到现行代码。其中本版本的 5 条重映射对应表中的条目(RUF011, B035), (TRY200, B904), (PGH001, S307), (PGH002, G010), // TCH 前缀后来整体更名为 TC (TCH006, TC010), (TCH010, TC010),从源码结构看TCH006的重映射目标经过了两步演进0.2.0 时重映射到TCH010之后整个TCH前缀与上游插件统一更名为TC于是现在的重映射表直接将其指向TC010。该文件末尾还内置了overshadowing_redirects测试确保任何现行规则代码都不会被重映射条目意外遮蔽——这是重映射机制的安全网。Preview 规则转正Stabilizations以下规则在 0.2.0 中稳定脱离 Preview 直接生效trio-timeout-without-awaitTRIO100、trio-sync-callTRIO105、trio-async-function-with-timeoutTRIO109、trio-unneeded-sleepTRIO110、trio-zero-sleep-callTRIO115unnecessary-escaped-quoteQ004enumerate-for-loopSIM113、zip-dict-keys-and-valuesSIM911timeout-error-aliasUP041flask-debug-trueS201、tarfile-unsafe-membersS202、ssl-insecure-versionS502、ssl-with-bad-defaultsS503、ssl-with-no-versionS504、weak-cryptographic-keyS505、ssh-no-host-key-verificationS507、django-raw-sqlS611、mako-templatesS702generator-return-from-iter-methodPYI058、runtime-string-unionTCH006numpy2-deprecationNPY201quadratic-list-summationRUF017、assignment-in-assertRUF018、unnecessary-key-checkRUF019、never-unionRUF020direct-logger-instantiationLOG001、invalid-get-logger-argumentLOG002、exception-without-exc-infoLOG007、undocumented-warnLOG009修复Fix转正——以下规则的自动修复不再需要 Previewtriple-single-quotesD300、non-pep604-annotationUP007dict-get-with-none-defaultSIM910、in-dict-keysSIM118、if-with-same-armsSIM114collapsible-else-ifPLR5501、useless-else-on-loopPLW0120unnecessary-literal-unionPYI030unnecessary-spreadPIE800error-instead-of-exceptionTRY400redefined-while-unusedF811、duplicate-valueB033multiple-imports-on-one-lineE401non-pep585-annotationUP006修复安全级别提升unaliased-collections-abc-set-importPYI025的修复从 unsafe 提升为 safe即默认--fix即会应用无需--unsafe-fixes。行为层面的稳定化module-import-not-at-top-of-fileE402允许在 import 语句之间插入sys.path修改reimplemented-container-builtinPIE807把可替换为dict的 lambda 也纳入检测unnecessary-placeholderPIE790扩展到无用的省略号...if-else-block-instead-of-dict-getSIM401扩展到if-else表达式。0.2.0 的 Preview 新特性与 Bug 修复Preview 特性[refurb] 新增metaclass_abcmetaFURB180新增blank_line_after_nested_stub_class格式化预览样式移除 Preview 规则and-or-ternaryPLR1706Bug 修复[flake8-async] 分析异步函数时计入pathlib.Path[flake8-return] 修复RET505的缩进语法错误else 移除autofix时检测多语句行RUF022、RUF023序列末尾绝不追加两个尾逗号RUF023只排序__slots__不再排序__match_args__[flake8-simplify] 修复SIM114autofix 的语法错误[pylint]magic-value-comparisonPLR2004展示原样常量多行字符串内部移除尾随空白被重新标记为 unsafeinvalid-envvar-default支持双臂均为字符串的IfExp[pylint] 将__mro_entries__加入已知 dunder 方法PLW3201文档改进被移除的规则现在保留在文档中被弃用的规则现在在文档中被明确标注。0.2.1引入范围格式化Range Formatting0.2.1 的核心能力是范围格式化可以对源文件中的特定行进行格式化即ruff format --range选项起始行到结束行。这对编辑器集成场景仅格式化当前编辑区域意义重大。Preview 特性[refurb] 新增missing-f-string-syntaxRUF027格式化模块级 docstringFormatterruff format新增--range选项修复 docstring 末尾空行被误删的问题Bug 修复判定基础缩进时跳过空行unnecessary-dunder-call不再针对__get__与__set__省略号移除时尊重泛型Protocol回滚一项 CI 相关变更Apple Silicon runner性能优化本版本是性能工程密集的一版标准 dedent 调整跳过 LibCST 解析移除C408的 CST 修复器引入自有 ignored-names 抽象降低对上游库的依赖移除C400、C401、C410、C418的 CST 修复器使用AhoCorasick加速引号匹配移除C405、C409的 CST 修复器注释检测加入快速路径zero-sleep-call反转检查顺序以提前短路基于导入信息短路 typing 匹配dunder 方法规则直接在方法上运行语义模型中跟踪顶层模块导入小写/大写标识符检查小幅提速移除C403的 LibCST 修复器从这些条目可以推断0.2.x 阶段项目正在系统性地把早期借用 LibCST 的修复逻辑替换为基于自家 AST/CST 的轻量实现从而压缩解析与修复开销。文档修正max-pos-args示例更正为max-positional-args修正weak_cryptographic_key规则中的示例代码修正 changelog 中对已弃用ANN规则的引用修正max-positional-args默认值。0.2.2f-string 格式化、CLI 配置覆盖与词法层提速0.2.2 的官方亮点有三条f-string 格式化的初步支持--preview下、通过扩展的--config参数在 CLI 覆盖任意配置项如--config lint.isort.combine-as-importsfalse、以及词法器lexer、解析器与 lint 规则的显著性能提升。Preview 特性实现最小化 f-string 格式化[pycodestyle] 新增空行规则E301、E302、E303、E304、E305、E306[refurb] 新增readlines_in_forFURB129规则行为变更[ruff] 多行序列的闭合括号必须独立成行RUF022、RUF023[numpy] 补充缺失的弃用违规检测NPY002[flake8-bandit] 检测装饰器中的mark_safe用法[ruff]asyncio-dangling-taskRUF006扩展覆盖new_event_loop[flake8-pyi] 忽略类作用域中“未使用”的私有类型字典Formatterindent-styletabs时 docstring 格式化保留 tab 缩进notebook 禁用顶层 docstring 格式化quote-style的preserve模式转正稳定CLI允许在命令行覆盖任意配置选项。当前 全局参数定义 中--config的文档注释明确说明它既可以是配置文件路径也可以是形如KEY VALUE的 TOML 键值对例如--config lint.line-length 100或--config format.quote-style single且这种逐项覆盖的优先级高于所有配置文件包括同样通过--config指定的文件。这与 0.2.2 “任意配置项 CLI 覆盖”的声明完全对应。Bug 修复show-settings过滤器不再受目录影响重写类型别名时尊重重名typing 分析器尊重元组赋值缓存持久化改用原子写入DebugText使用无括号范围[flake8-simplify] 消除SIM113对async for循环的误报[flake8-trio]timeout-without-await尊重async with[perflint]PERF101捕获更广泛的变异操作[pycodestyle] 修复E30X在带尾随空白的空行上 panic[pydocstyle] 允许parameters作为小节标题D405修复模块级 docstring 的空行规则[pylint]PLR2004接受 0.0 和 1.0 为常见魔数不再对不可哈希类型建议 set 重写[ruff] 方法调用内部字符串字面量消除RUF027漏报与 panic缺失 f-string 检测忽略 builtin性能字符串词法分析改用memchrtab 缩进检测改用memchr以Boxstr替代String缩小ResultTok, LexicalError体积Expr结构体从 80 字节压缩到 64 字节尾逗号规则性能优化解析器移除不必要的字符串克隆升级实操清单从 0.1.x 迁移到 0.2.x结合 changelog 内容迁移检查项可以归纳为四步配置迁移把上表列出的 43 个顶层 lint 选项整体移入[lint]表被弃用的旧名称在过渡期仍可用但应尽早消除警告。规则代码更新全局搜索并替换TRY200→B904、PGH001→S307、PGH002→G010、RUF011→B035、TCH006→TCH010含noqa注释与select/ignore列表删除ANN101、ANN102的选择。选择器清理移除配置中的NURSERY选择器如果原本依赖精确代码选择 nursery 规则改为开启 preview 或显式选择。CLI 选项替换--show-source/--no-show-source/--output-format text分别替换为--output-format full/concise的显式取值。验证方面仓库提供了 0.2.x 完整变更记录 作为权威对照若升级后 lint 结果出现规则“凭空消失”优先检查第 2 步的重映射代码是否遗漏。版本脉络小结0.2.x 三个版本呈现清晰的分工0.2.0 做“减法与归位”弃用旧接口、收敛配置命名空间、规则重映射、Preview 大规模转正0.2.1 做“能力增量”范围格式化兼做性能工程0.2.2 做“编辑器友好化”f-string 格式化起步、--range落地后的 CLI 配置覆盖并持续压榨词法/解析性能。这套节奏——破坏性变更集中发布、弃用期保留兼容别名、Preview 通道先行试验——贯穿了 ruff 后续的演进可对照 changelogs/0.3.x.md 及之后的版本记录理解 0.2.x 是掌握该项目版本策略的关键一环。【免费下载链接】ruffAn extremely fast Python linter and code formatter, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ru/ruff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考