Ruff v0.16.0 發佈說明 / 新功能
Ruff v0.16.0 發佈說明 / 新功能
Ruff v0.16.0 將預設 linting 擴展至 413 條規則
Ruff v0.16.0 將預設啟用的規則數量從 59 條增加到 413 條。這項變更讓使用者無需手動配置,即可捕捉嚴重的問題,包括語法錯誤和即時的執行階段錯誤。擴展後的規則集包含了來自 flake8-bugbear (B)、pyupgrade (UP) 以及 Ruff 自身的 RUF 類別的規則。
偏好先前預設規則集的使用者可以使用以下配置進行還原:
[lint]
select = ["E4", "E7", "E9", "F"]
Markdown 程式碼區塊格式化
Ruff v0.16.0 現在可以格式化嵌入在 Markdown 檔案中的 Python 程式碼區塊。格式化程式針對具有 python、py、python3、py3、pyi 或 pycon 等資訊字串的圍欄式程式碼區塊(fenced code blocks)。
pyi區塊:格式化為 stub 檔案。pycon區塊:格式化為 REPL 會話。- 標準 Python 區塊:使用一般的 Python 檔案格式化方式進行格式化。
此功能也延伸至 Quarto notebooks(例如 ````{python})。可以使用程式碼區塊內的 fmt: off和fmt: on 註釋來抑制格式化,或使用 HTML 註釋()來包裹文件區域。整個 Markdown 檔案可以透過 extend-exclude` 設定來排除。
使用 ruff: ignore 增強抑制功能
0.16.0 版本引入了一種新的抑制註釋格式,可以單獨使用於一行,比之前的 ruff: disable 和 ruff: enable 範圍機制更具靈活性。
ruff: ignore:抑制同一行或下一行邏輯行上的診斷結果。這對於跨越多行的函式標頭特別有用。ruff: file-ignore:針對整個檔案抑制特定的診斷結果,其功能與ruff: noqa類似。
這兩種註釋類型都支援選填的「原因」字串來解釋抑制原因。此外,新的 --add-ignore CLI 旗標允許自動新增這些註釋。在預覽模式下,這些註釋支援規則名稱(例如 unused-import)而不僅僅是規則代碼。
CLI 輸出中整合修復差異 (diffs)
Linter 和格式化修復現在直接顯示在 check 和 format --check 子命令的預設 full 輸出格式中的 diff 中。先前,這些變更只有在使用 --diff 旗標時才可見,而該旗標會隱藏隨附的解釋性診斷。
format --check 現在也支援 Linter 可用的所有輸出格式,包括機器可讀的 JSON 以及與 GitHub 和 GitLab CI 註釋相容的格式。
關於 JSON 輸出的說明:引入了一項破壞性變更,filename、location、end_location 和 fix.edits 的位置欄位現在可能為 null,而不是空字串或預設座標(第 1 行,第 1 欄)。
穩定的規則與行為
穩定的規則
若干規則已從預覽狀態轉為穩定狀態,包括:
AIR303(airflow3-incompatible-function-signature)CPY001(missing-copyright-notice)FURB164(unnecessary-from-float)FURB192(sorted-min-max)ISC004(implicit-string-concatenation-in-collection-literal)LOG004(log-exception-outside-except-handler)PLE0304(invalid-bool-return-type)PLR0917(too-many-positional-arguments)PLR1708(stop-iteration-return)RUF036(none-not-at-end-of-union)RUF063(access-annotations-from-class-dict)RUF068(duplicate-entry-in-dunder-all)
穩定的行為
- **
BLE001(blind-except)****:現在當透過critical、error和exception以外的方法記錄異常時,會進行抑制。 - **
FA102(future-required-type-annotation)****:現在會檢查額外的 PEP 585 相容 API,包括collections.abc。 INT001,INT002,INT003:現在會檢查更常見的gettext模組使用模式,例如對builtins._的賦值。- **
S310(suspicious-url-open-usage)****:現在會解析本地字串字面值綁定以減少誤報。 S508和S509:現在支援較新 PySNMP 版本的建議 API。- **
UP019(typing-text-str-alias)****:現在能識別typing_extensions.Text。
社群觀點
社群對此版本的回饋呈現兩極化:一方看重自動化程度的提升,另一方則認為嚴格的 linting 有些武斷。
部分使用者回報更新後程式碼品質立即提升,並指出擴展後的規則集捕捉到了先前版本遺漏的問題。其他人則對這類工具的「語法警察 (grammar nazi)」特性表示擔憂,認為嚴格的格式化有時會模糊作者的意圖。
關於更新對運作的影響,部分開發者指出,在未固定版本的 CI 環境中更新到 v0.16.0,可能會因為新預設規則的湧入而導致立即失敗。
「如果你聽得夠仔細,你可以聽到成千上萬個剛拉取最新 UV 的 CI 作業同時失敗的聲音。」
此外,部分使用者建議實作 stateVersion(類似 Nix),讓團隊可以按照自己的步調選擇加入新的預設規則集,而不是在工具更新時自動繼承它們。