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 程式碼區塊。格式化程式針對具有 pythonpypython3py3pyipycon 等資訊字串的圍欄式程式碼區塊(fenced code blocks)。

  • pyi 區塊:格式化為 stub 檔案。
  • pycon 區塊:格式化為 REPL 會話。
  • 標準 Python 區塊:使用一般的 Python 檔案格式化方式進行格式化。

此功能也延伸至 Quarto notebooks(例如 ````{python})。可以使用程式碼區塊內的 fmt: offfmt: on 註釋來抑制格式化,或使用 HTML 註釋()來包裹文件區域。整個 Markdown 檔案可以透過 extend-exclude` 設定來排除。

使用 ruff: ignore 增強抑制功能

0.16.0 版本引入了一種新的抑制註釋格式,可以單獨使用於一行,比之前的 ruff: disableruff: enable 範圍機制更具靈活性。

  • ruff: ignore:抑制同一行或下一行邏輯行上的診斷結果。這對於跨越多行的函式標頭特別有用。
  • ruff: file-ignore:針對整個檔案抑制特定的診斷結果,其功能與 ruff: noqa 類似。

這兩種註釋類型都支援選填的「原因」字串來解釋抑制原因。此外,新的 --add-ignore CLI 旗標允許自動新增這些註釋。在預覽模式下,這些註釋支援規則名稱(例如 unused-import)而不僅僅是規則代碼。

CLI 輸出中整合修復差異 (diffs)

Linter 和格式化修復現在直接顯示在 checkformat --check 子命令的預設 full 輸出格式中的 diff 中。先前,這些變更只有在使用 --diff 旗標時才可見,而該旗標會隱藏隨附的解釋性診斷。

format --check 現在也支援 Linter 可用的所有輸出格式,包括機器可讀的 JSON 以及與 GitHub 和 GitLab CI 註釋相容的格式。

關於 JSON 輸出的說明:引入了一項破壞性變更,filenamelocationend_locationfix.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)****:現在當透過 criticalerrorexception 以外的方法記錄異常時,會進行抑制。
  • **FA102 (future-required-type-annotation)****:現在會檢查額外的 PEP 585 相容 API,包括 collections.abc
  • INT001, INT002, INT003:現在會檢查更常見的 gettext 模組使用模式,例如對 builtins._ 的賦值。
  • **S310 (suspicious-url-open-usage)****:現在會解析本地字串字面值綁定以減少誤報。
  • S508S509:現在支援較新 PySNMP 版本的建議 API。
  • **UP019 (typing-text-str-alias)****:現在能識別 typing_extensions.Text

社群觀點

社群對此版本的回饋呈現兩極化:一方看重自動化程度的提升,另一方則認為嚴格的 linting 有些武斷。

部分使用者回報更新後程式碼品質立即提升,並指出擴展後的規則集捕捉到了先前版本遺漏的問題。其他人則對這類工具的「語法警察 (grammar nazi)」特性表示擔憂,認為嚴格的格式化有時會模糊作者的意圖。

關於更新對運作的影響,部分開發者指出,在未固定版本的 CI 環境中更新到 v0.16.0,可能會因為新預設規則的湧入而導致立即失敗。

「如果你聽得夠仔細,你可以聽到成千上萬個剛拉取最新 UV 的 CI 作業同時失敗的聲音。」

此外,部分使用者建議實作 stateVersion(類似 Nix),讓團隊可以按照自己的步調選擇加入新的預設規則集,而不是在工具更新時自動繼承它們。

Sources