7 月 23 日,Astral 發布 Python linter「Ruff」的 v0.16.0。對多數專案來說,這一版最直接的變化只需要一句話:升級之後,ruff check 什麼都不設定,預設就會跑 413 條規則——前一版只有 59 條。官方部落格直接把這件事放在標題上:「Ruff now enables 413 rules by default, up from 59」。
預設值是工具的哲學宣言。一次把預設規則拉高七倍,代表 Astral 認為「開箱即用的嚴格」已經成為 Python 專案的新常識。實際升級前,先看懂它改了什麼、為什麼改。
預設規則 59 到 413:發生了什麼
這不是一次心血來潮的加規則,而是 Ruff 長期「規則重新分類」計畫(issue #1774)的收尾。團隊把原本需要 opt-in 的規則逐一重新評估,將足夠穩定、夠高訊號的部分納入預設集。整體規則總數也從 v0.1.0 時的 708 條成長到 968 條。
之所以敢把預設開這麼寬,底氣來自效能:Ruff 用 Rust 寫成,全規則掃描的速度仍然遠快於舊世代工具開少數規則。當檢查的成本趨近於零,「預設全開、個案關閉」就成了合理策略。
十八條規則退出預設集
加規則的同時也在減。18 條意見型(opinionated)的 pycodestyle 與 pyflakes 規則被移出預設,包括 E401(一行多個 import)、E711/E712(與 None、True 比較)、E731(lambda 賦值)、E741(歧義變數名)、F403(星號 import)等。這些規則長期以來是風格爭論的來源,官方提供了設定片段,想恢復舊行為的專案可以自己加回來。
方向很清楚:預設集應該高訊號、低爭議,風格偏好留給使用者自己選。這和許多 linter「預設越來越寬鬆」的路線相反,Ruff 的做法是「錯誤類規則全開、風格類規則讓位」。
Markdown 格式化與新的抑制語法
v0.16 還有兩組實用的新功能。第一,Ruff 現在能格式化 Markdown 檔案裡內嵌的 Python 程式碼區塊,支援 python、pyi、pycon 與 Quarto 的 {python} 區塊——文件裡的範例程式碼終於和程式本體同一套格式化。
第二,抑制診斷的語法變完整了:新增 ruff: ignore(行內或前一行)與 ruff: file-ignore(整檔),加上 v0.15 引入的 ruff: disable/ruff: enable,都接受附帶原因文字,並新增 --add-ignore 標記自動產生。其他值得注意的:check 與 format --check 的輸出會直接顯示修復 diff,format --check 也支援 JSON 與 GitHub/GitLab 註解格式;12 條規則結束預覽轉正。
一個小破壞性變更:JSON 輸出的部分欄位(如 filename、location)現在可能是 null,有解析輸出的工具需要確認。
升級建議
實務上三件事。第一,升級後先在本地跑一次 ruff check 看新診斷的數量,再決定是逐條採用、修碼,還是用官方設定片段還原舊預設——CI 直接升級很可能會炸出一批新的紅字。第二,鎖定版本,讓「預設值改變」變成一次可審核、可回滾的變更,而不是隨相依套件悄悄發生。第三,如果專案文件裡有大量 Python 範例,這一版之後格式化範圍變大了,值得順手把 Markdown 也納入檢查。
參考來源
本文由 AI 協助自上述來源整理,經人工審核後發布。
