Ruff v0.0.292 发布

Ruff v0.0.292 发布

💡 原文英文,约800词,阅读约需3分钟。
📝

内容提要

Ruff v0.0.292 发布,全面支持 Python 3.12 及 PEP 701 f-string 新语法(引号复用、嵌套、多行表达式、反斜杠),并更新 F541、W605 等规则以检测 f-string 内违规。E501 规则现忽略尾部 pragma 注释。新增 FURB105、FURB177、S505 规则,分别检查空字符串 print、隐式 cwd 和弱加密密钥。

🔎

延伸解读

PEP 701 支持的实际影响

Ruff v0.0.292 全面支持 Python 3.12 的 PEP 701,这意味着 f-string 中引号复用、嵌套、多行表达式和反斜杠等新语法不再被 Ruff 报错。但需注意,CPython 对嵌套深度有限制(如 f-string 嵌套最多 150 层,格式说明符中表达式嵌套最多 2 层),而 Ruff 不强制执行这些限制。因此,使用 Ruff 检查时可能不会发现某些在 CPython 中会引发 SyntaxError 的代码,开发者仍需依赖 Python 解释器进行最终验证。

规则更新与兼容性考量

为配合 PEP 701,Ruff 更新了 F541、W605 等多条规则以检测 f-string 内的违规。其中 flake8-quotes 规则(Q003)仅在目标版本为 3.12 或更高时才会报告和修复嵌套 f-string 的引号问题,而 Q000 和 Q001 目前只检查最外层引号,后续版本会完善。此外,E501 规则现在忽略行尾的 pragma 注释(如 # type: ignore 和 # noqa),避免因添加这些注释而触发额外的行过长错误。

新增规则的价值与使用建议

本次新增三条规则:FURB105 建议用 print() 替代 print(""),使代码更简洁;FURB177 建议用 Path.cwd() 替代 Path().resolve() 来获取当前目录,意图更明确;S505 检查弱加密密钥,要求 DSA/RSA 密钥至少 2048 位、EC 密钥至少 224 位。这些规则分别源自 refurb 和 flake8-bandit,有助于提升代码质量和安全性。开发者可根据项目需求选择性启用。

❓

Q&A

Ruff v0.0.292 对 Python 3.12 的支持具体包括哪些方面?

Ruff v0.0.292 全面支持 Python 3.12,特别是实现了对 PEP 701 的完整支持,即 f-string 的新语法。这包括允许在 f-string 中复用外层引号、任意嵌套 f-string、多行表达式和注释、以及使用反斜杠和 Unicode 字符。

PEP 701 给 f-string 带来了哪些新语法特性?

PEP 701 为 f-string 提供了正式语法,解除了许多旧限制:可以复用外层引号(如 f"text { data["key"] } text")、任意嵌套 f-string(如 f"{f"{f"{1 + 1}"}"}")、支持多行表达式和注释、以及使用反斜杠和 Unicode 字符。

Ruff 更新了哪些规则来检测 f-string 内的违规?

Ruff 更新了多个规则以检测 f-string 表达式内的违规,包括 F541(f-string 缺少占位符)、W605(无效转义序列)、PLE2510、PLE2512、PLE2513、PLE2514、PLE2515、RUF001、RUF003、ISC001 和 ISC002。

E501 规则在 v0.0.292 中有什么变化?

E501(line-too-long)规则现在在计算行长度时会忽略尾部的 pragma 注释(如 # type: ignore 和 # noqa),这类似于 flake8-bugbear 的做法,确保添加这些 pragma 不会引入新的 lint 错误。

Ruff v0.0.292 新增了哪些规则?

新增了三个规则:FURB105(print-empty-string)检查 print 调用中仅包含空字符串的情况;FURB177(implicit-cwd)检查使用 Path().resolve() 获取当前目录的情况;S505(weak-cryptographic-key)检查使用弱加密密钥的情况。

S505 规则检查什么?为什么重要?

S505(weak-cryptographic-key)规则检查使用弱加密密钥的情况。小密钥容易被破解,对于 DSA 和 RSA,密钥长度至少应为 2048 位;对于 EC,密钥长度至少应为 224 位。例如,应避免使用 512 位的密钥,而应使用 4096 位等更大的密钥。

🏷️

标签

➡️

继续阅读