這個工具能做什麼
Python 格式化工具會把 Python 程式碼改寫成廣泛使用的 Black 風格:一致的縮排、運算子前後加空格、使用雙引號、頂層定義之間空兩行,並在適當的位置把過長的行換行。
它的底層執行的是 Ruff 的格式化工具。Ruff 是以 Rust 撰寫的高速 Python linter 與格式化工具,這裡把它編譯成 WebAssembly。Ruff 的輸出幾乎逐行和 Black 一致,所以在這裡格式化過的程式碼,不會再被專案的 pre-commit hook 重新格式化一次。
使用方式
- 貼上 Python 程式碼,或開啟
.py檔案。 - 格式化後的程式碼會隨著輸入即時顯示在右側。
- 如果你的專案使用不同的風格,可以調整選項:
- 縮排:4 個空格是 PEP 8 的規範,也是預設值;也可以選 2 個空格或 Tab。
- 每行寬度:88 是 Black 的預設值,79 是 PEP 8 的上限,100 或 120 適合較寬的螢幕。
- 引號:雙引號、單引號,或保持每個字串原本使用的引號。
- 有尾隨逗號時保持展開:以逗號結尾的集合保持展開。
- 複製或下載結果。
當程式碼無法剖析時,錯誤訊息會指出剖析器停下來的位置,例如第 4 行的 Expected `,`, found `=` ,你可以直接跳到那一行。
範例
範例是一個寫得很隨意的小模組:多個 import 擠在同一行且沒有空格、一個冒號前多了空格的 dataclass、一個用兩個空格縮排的方法,以及一個寫成一行的 if 陳述式。格式化之後,每個區塊都改用四個空格縮排,if 的內容移到獨立的一行,運算子前後加上空格,單引號變成雙引號,類別和函式之間也加上空行。原本以尾隨逗號結尾的清單會展開成每行一個字典。
格式化工具不會做的事
格式化只會改變排版。它不會排序 import、移除未使用的變數,也不會重新命名任何東西;這些是 linter 的工作(ruff check --fix 可以處理)。註解和 docstring 都會保留,而且遇到無法剖析的程式碼時,格式化工具會拒絕修改,而不是用猜的。
小提示
- 使用和專案
pyproject.toml相同的每行寬度,讓結果和 CI 一致。 - 在提問或程式碼審查中貼出程式片段前先格式化,會好讀很多。
- 如果程式碼來自 notebook 或聊天訊息,混用了 Tab 和空格,格式化工具一步就能把它統一。
常見問題
› 輸出結果和 Black 一樣嗎?
Ruff 的格式化工具設計成可以直接取代 Black,在大型實際專案中,超過 99.9% 的程式碼行輸出都和 Black 相同。這裡的預設設定(4 個空格縮排、88 欄、雙引號)就是 Black 的預設值。
› 什麼是「magic trailing comma」(神奇尾隨逗號)?
如果清單、呼叫或定義以尾隨逗號結尾,Black 和 Ruff 會讓它保持展開、每項一行,即使放得進一行也一樣。關閉這個開關後,只要放得下,這類集合就會合併成一行。
› 支援哪些 Python 版本?
剖析器能理解現代 Python 3 語法,包括 match 陳述式、型別參數列表,以及內含巢狀引號的 f-string。像 `print "x"` 這樣的 Python 2 程式碼會被視為語法錯誤。
› 我的程式碼會被上傳嗎?
不會。Ruff WebAssembly 模組只需下載一次,格式化在你的瀏覽器中執行。