内容提要
Ruff v0.13.0 发布,该工具用 Rust 编写,速度极快。主要变更包括:新增 lint.future-annotations 设置,可自动添加 from __future__ import annotations;首方导入检测改用完整模块路径;弃用规则须用完整代码选择;移除 macOS 旧配置目录回退。多项规则稳定,移除 PD901 和 UP038。
延伸解读
升级影响:多数项目可无感迁移
Ruff v0.13 的破坏性变更较少,官方表示大多数用户无需修改代码或配置即可升级。但有三类情况需留意:使用已弃用规则、依赖 macOS 旧配置目录、或依赖首方导入检测的宽松行为。若项目配置中通过前缀选择规则(如 --select UP),升级后弃用规则将不再被自动激活,需显式指定完整规则代码。
新设置 lint.future-annotations 的用途
该设置默认关闭,启用后允许 TC001、TC002、TC003、RUF013 和 UP037 等规则在修复时自动添加 from __future__ import annotations。这能让更多导入移入 TYPE_CHECKING 块、取消更多注解的引号,并在 Python 3.10 之前使用 PEP 604 联合类型。注意 UP006、UP007、UP045 尚未使用此功能,仍依赖 FA100 添加 future 导入。
首方导入检测更精确,减少误判
Ruff 现在要求完整模块路径在磁盘上存在,才将其归类为首方导入。例如 import foo.bar.baz 仅当 foo/bar/baz 是目录,或 foo/bar 目录下存在 baz.py 或 baz.pyi 时,才视为首方。这有助于避免本地目录与第三方依赖同名导致的误报,主要影响 I001 等导入排序规则,TC001、TC002、TC003 也依赖此分类。
规则稳定与移除:需关注的调整
本次多个预览规则转为稳定,包括 AIR002、AIR301、AIR302、AIR311、AIR312、ASYNC116、FURB116、PTH211、PYI059、PYI061、RUF043、RUF059、UP050 等。同时,PD901 和 UP038 被移除,前者因过于主观,后者因 PEP 604 联合语法在 isinstance 中并不符合习惯且可能影响性能。此外,B017、COM812、COM819 等规则的行为也有稳定化调整。
Q&A
Ruff v0.13.0 有哪些主要变更?
主要变更包括:新增 lint.future-annotations 设置,可自动添加 from __future__ import annotations;首方导入检测改用完整模块路径;弃用规则须用完整代码选择;移除 macOS 旧配置目录回退。多项规则稳定,移除 PD901 和 UP038。
如何启用 Ruff 自动添加 from __future__ import annotations?
通过新增的 lint.future-annotations 设置启用,该设置默认关闭。启用后,TC001、TC002、TC003、RUF013 和 UP037 等规则可以自动添加 __future__ import。
Ruff v0.13 如何判断首方导入?
Ruff 现在检查模块的完整路径是否存在于磁盘上,例如 import foo.bar.baz 只有在 foo/bar/baz 是目录,或 foo/bar 是包含 baz.py 或 baz.pyi 的目录时才会被标记为首方导入。这提高了准确性,避免误判。
在 Ruff v0.13 中如何选择已弃用的规则?
必须使用完整的规则代码选择,例如要选择所有 UP 规则包括已弃用的 UP038,需使用 --select UP,UP038。不再支持通过组名或前缀激活已弃用规则。
Ruff v0.13 移除了哪些规则?
移除了 pandas-df-variable-name (PD901) 和 non-pep604-isinstance (UP038)。PD901 因过于主观而被移除,UP038 因 PEP 604 联合语法在 isinstance 和 issubclass 中不地道且可能影响性能而被移除。
Ruff v0.13 在 macOS 上配置文件位置有何变化?
移除了对 ~/Library/Application Support/ruff/ruff.toml 的回退支持。现在只使用 XDG 规范,通常为 ~/.config/ruff/ruff.toml。