Ruff v0.10.0 发布

Ruff v0.10.0 发布

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

内容提要

Ruff v0.10.0 发布,这是一个用 Rust 编写的极快 Python linter 和格式化工具。主要更新:改进 Python 版本检测,使 pyproject.toml 中的 requires-python 更易生效;增强抑制注释解析;TYPE_CHECKING 行为与 mypy 等对齐,移除 if 0/if False 支持,新增任意 TYPE_CHECKING 符号支持;稳定多条规则并弃用部分规则。

🔎

延伸解读

Python 版本检测更符合直觉

Ruff v0.10 改进了配置发现逻辑,使 pyproject.toml 中的 requires-python 更易生效。此前,若 pyproject.toml 没有 [tool.ruff] 段,Ruff 会忽略该文件,转而使用默认 Python 版本(3.9),导致用户指定的版本失效。现在,即使没有 [tool.ruff] 段,Ruff 也会在查找配置时尊重 requires-python,或在父目录中寻找最近的 pyproject.toml。这减少了因版本不匹配产生的误报,但若已使用 target-versi

抑制注释解析更健壮

v0.10 统一并增强了行内 # noqa 和文件级 # ruff: noqa 的解析。文件级注释现在允许前导和尾随注释,例如 # 上下文 # ruff: noqa 或 # ruff: noqa 说明文字。无效语法如 ruff: noqa UP035(缺少冒号)将抑制所有规则,但会被 blanket-noqa (PGH004) 检测。规则列表中的缺失项或分隔符会被接受但发出警告。另一方面,无效规则后缀(如 # noqa: UP035abc)将报错且不抑制任何规则;冒号与规则列表间的空格现在只抑制指定规则,而非全部。

TYPE_CHECKING 行为对齐 mypy

Ruff v0.10 使 TYPE_CHECKING 的处理与 mypy、pyright 等工具一致。移除了对 if 0 和 if False 作为 if TYPE_CHECKING 替代的支持,转而支持任何名为 TYPE_CHECKING 的符号,而不仅限于 typing.TYPE_CHECKING。这允许使用本地定义的 TYPE_CHECKING = False 来避免导入 typing。此变更还增强了 SIM108 等规则,使其能更安全地折叠 if 0 或 if False 块。用户需注意,旧代码中依赖 if

规则稳定与弃用

本次发布稳定了多条预览规则,包括 B911、C420、DTZ901、FAST003、LOG015、PLC1802、PLW1507、PTH208、PTH210、RUF040、RUF041、RUF046、RUF048、RUF051、S704(从 RUF035 重新编码)、SIM905、TC006、TC007、UP044。同时,部分行为稳定:flake8-builtins 选项前缀简化,A005 默认非严格检查,PYI019 改进,PGH004 检测文件级注释,PLW1508 扩展,N804 和 PLW0211 调整。弃

❓

Q&A

Ruff v0.10.0 是什么?

Ruff v0.10.0 是一个用 Rust 编写的极快 Python linter 和格式化工具,可以替代 Black、Flake8、isort、pydocstyle、pyupgrade 等工具,执行速度比任何单个工具快数十到数百倍。

Ruff v0.10.0 如何改进 Python 版本检测?

Ruff v0.10.0 改进了配置发现机制:如果找到没有 target-version 的 ruff.toml,会检查同目录下的 pyproject.toml 并尊重其 requires-python 版本,即使没有 [tool.ruff] 部分;如果没有配置文件,会搜索父目录中最近的 pyproject.toml 并使用其 requires-python 设置。

Ruff v0.10.0 对抑制注释解析做了哪些增强?

Ruff v0.10.0 统一并增强了内联(# noqa)和文件级(# ruff: noqa)抑制注释解析。现在允许文件级注释有前导和尾随注释;无效语法如 ruff: noqa UP035 会抑制所有规则;列表中的缺失项或分隔符会被接受但发出警告;内联注释中无效规则后缀不再抑制规则;冒号和规则列表之间允许空格。

Ruff v0.10.0 中 TYPE_CHECKING 行为有哪些变化?

Ruff v0.10.0 使 TYPE_CHECKING 处理与 mypy 等工具对齐:移除了对 if 0 和 if False 代替 if TYPE_CHECKING 的支持;新增支持任何名为 TYPE_CHECKING 的符号,而不仅仅是 typing.TYPE_CHECKING。

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

Ruff v0.10.0 稳定了多条规则,包括 batched-without-explicit-strict (B911)、unnecessary-dict-comprehension-for-iterable (C420)、datetime-min-max (DTZ901)、fast-api-unused-path-parameter (FAST003)、root-logger-call (LOG015)、len-test (PLC1802)、shallow-copy-environ (PLW1507)、os-listdir (PTH208)、invalid-pathlib-with-suffix (PTH210)、invalid-assert-message-literal-argument (RUF040)、unnecessary-nested-literal (RUF041)、unnecessary-cast-to-int (RUF046)、map-int-version-parsing (RUF048)、if-key-in-dict-del (RUF051)、unsafe-markup-use (S704)、split-static-string (SIM905)、runtime-cast-value (TC006)、unquoted-type-alias (TC007)、non-pep646-unpack (UP044) 等。

Ruff v0.10.0 弃用了哪些规则?

Ruff v0.10.0 弃用了 suspicious-xmle-tree-usage (S320),因为 lxml 包中的相关问题已解决;弃用了 non-pep604-isinstance (UP038),因为在 isinstance 和 issubclass 调用中使用 PEP 604 联合语法不是推荐模式且可能影响性能。

🏷️

标签

➡️

继续阅读