Ruff v0.12.0 发布

Ruff v0.12.0 发布

💡 原文英文,约1300词,阅读约需5分钟。
📝

内容提要

Ruff v0.12.0 发布,新增检测两类语法错误:版本相关错误(如低版本使用 match 语句)和编译器阶段错误(如重复参数名)。默认语法检查使用最新 Python 3.13,其他规则仍用 3.9。源码包不再包含 rust-toolchain.toml,便于构建。调整多行 f-string 格式化。稳定 22 条规则,弃用 1 条,移除 1 条。

🔎

延伸解读

语法错误检测的版本感知机制

Ruff v0.12.0 新增的版本相关语法错误检测,要求项目正确配置目标 Python 版本。若未配置,Ruff 会尝试从配置文件推断,失败则回退到最旧支持版本(3.9)用于大多数规则,但语法错误检测默认使用最新版本(3.13)。这种分离默认值旨在减少误报,但若项目实际使用较新语法而未配置版本,可能无法触发相应错误提示。对于多版本项目,可使用 per-file-target-version 设置覆盖全局版本。

源码构建的 Rust 工具链变化

源码分发包不再包含 rust-toolchain.toml,这意味着从源码构建时,cargo 不会自动安装兼容的 Rust 工具链。Ruff 支持至少前两个稳定 Rust 版本(当前为 1.85 和 1.86),但用户可能需要手动运行类似 rustup install 1.85 的命令来获取符合 MSRV 的工具链。这一变化主要影响在安全或工具链受限环境中构建的用户,对大多数终端用户无影响。

规则稳定化与行为调整的影响

本次发布稳定了 22 条规则,并调整了多项预览行为。例如,UP007 被拆分为仅检查 typing.Union,而 typing.Optional 由新稳定的 UP045 负责,用户可能需要更新 include、ignore 或 noqa 设置。此外,RUF100 现在检查文件级 noqa 注释,FBT001 扩展到包含 bool 的类型注解。这些变化可能影响现有配置,升级时需留意规则代码的变动。

❓

Q&A

Ruff v0.12.0 新增了哪两类语法错误检测?

Ruff v0.12.0 新增检测两类语法错误:版本相关语法错误(如低版本使用 match 语句或海象运算符)和编译器阶段语法错误(如重复参数名、不可反驳的 match 模式、函数外使用 yield/return 等)。

Ruff v0.12.0 默认使用哪个 Python 版本进行语法检查?

默认使用最新的 Python 3.13 进行语法错误检查,而其他规则仍默认使用最旧的 Python 3.9。

如何为项目中的特定文件覆盖 Python 目标版本?

可以使用 per-file-target-version 设置。例如在 ruff.toml 中添加 [per-file-target-version] "scripts/*.py" = "py312",或在 pyproject.toml 中配置 tool.ruff.per-file-target-version。

为什么 Ruff v0.12.0 的源码包不再包含 rust-toolchain.toml?

因为之前包含该文件会导致源码分发的使用者被迫使用最新稳定版 Rust 构建,即使其工具链兼容 Ruff 的最低支持 Rust 版本(MSRV)。移除后便于在受限环境中从源码构建,但用户可能需要手动安装兼容的 Rust 工具链(如 rustup install 1.85)。

Ruff v0.12.0 如何调整多行 f-string 的格式化?

由于 CPython 语法变化,Ruff 现在将多行 f-string 中的格式说明符后的换行移除,例如将 f"...{ x:d }..." 格式化为 f"...{ x:d}...",以避免在 Python 3.13.4 及以上版本中出现语法错误。

Ruff v0.12.0 稳定了哪些规则?

稳定了 22 条规则,包括 for-loop-writes (FURB122)、check-and-remove-from-set (FURB132)、verbose-decimal-constructor (FURB157)、import-outside-top-level (PLC0415)、nan-comparison (PLW0177)、eq-without-hash (PLW1641)、pytest-parameter-with-default-argument (PT028)、invalid-formatter-suppression-comment (RUF028)、dataclass-enum (RUF049)、non-pep604-annotation-optional (UP045) 等。

Ruff v0.12.0 弃用和移除了哪些规则?

弃用了 pandas-df-variable-name 规则,移除了 suspicious-xmle-tree-usage (S320) 规则。

🏷️

标签

➡️

继续阅读