Python 格式化工具
什麼是 Python 格式化?
Python 格式化工具會用一致的縮排、換行和結構整理 Python 程式碼。Python 的縮排本身就是語法的一部分,因此複製混亂或風格混雜的程式碼不只是難看,還可能改變行為或直接報錯。這個工具適合處理腳本、Notebook 片段、產生程式碼、學習範例、程式碼審查和小型重構,讓函式、類別、import、列表、字典和巢狀表達式更容易閱讀。格式化不會修復邏輯錯誤、型別問題、缺少依賴、執行環境問題或 API 誤用。在真實專案中,輸出應與 Black、Ruff、isort 或團隊規範保持一致。
使用說明
使用方式
- 在左側輸入框貼上或輸入 Python 程式碼
- 選擇縮排大小(2 格、4 格或 Tab)
- 點選「格式化」美化程式碼,或點選「壓縮」精簡程式碼
- 在右側檢視結果(含語法高亮)
- 點選「複製」將結果複製到剪貼簿
選項說明
Python 提示
- Python 對縮排非常敏感,複製結果回專案前請先檢查格式化後的控制區塊。
- 格式化不會執行型別檢查、匯入檢查或測試,請使用您的 Python 工具鏈來驗證行為與相依性。
使用場景
技術原理
Python 是少數使用縮排而非大括號來定義程式碼區塊的主流語言之一。相同縮排的連續語句屬於同一個區塊;多一個或少一個空格,語義就會改變。這種設計讓程式碼的視覺結構與其邏輯一致,但要求格式化工具精確識別邏輯層級。 格式化工具首先使用 tokenize 模組或自訂詞法分析器掃描程式碼,將每行的前導空白視為縮排資訊。括號(圓括號、方括號、花括號)內的語句可以跨越多行,此時縮排由括號深度而非前導空白決定。字串字面值(三引號、單引號)內部的空白不能觸碰,否則會改變字串的值。 PEP 8 是 Python 的官方風格指南,規定了 4 空格縮排、79 字元最大行寬、運算符周圍的空格、import 分組和命名慣例。Black 是無設定格式化工具流派的代表:它強制使用雙引號字串、尾隨逗號和 88 字元行寬,規則嚴格且不可設定。yapf 更接近 Google 風格,且可配置。
- 縮排語法:Python 使用前導空白判定程式碼區塊;相同縮排代表同一區塊,縮排變更切換作用域
- PEP 8 規則:4 空格縮排、行寬 79 字元、運算符周圍加空格、類別名稱用 CapWords、函式名稱用 snake_case
- 括號換行:括號(圓括號、方括號、花括號)內的語句可以換行,縮排由括號深度而非前導空白決定
- 字串邊界:三引號字串和文件字串內部的空白不能修改,否則會破壞字面值內容
- Black 風格:零設定、不可自訂、強制雙引號、尾隨逗號、每行 88 字元、整個專案風格一致
- 型別註解:PEP 484 引入;格式化工具保留 `->` 回傳型別和參數 `: type` 註解周圍的正確間距
範例
格式化函式定義
輸入: def add(a,b):
return a+b
def subtract(a,b):
return a-b
輸出:
def add(a, b):
return a + b
def subtract(a, b):
return a - b格式化串列推導式
輸入: result=[x*x for x in range(10) if x%2==0]
result2={k:v for k,v in items if v>0}
輸出:
result = [x * x for x in range(10) if x % 2 == 0]
result2 = {k: v for k, v in items if v > 0}格式化類別定義
輸入: class User:
def __init__(self,name,email):
self.name=name
self.email=email
def __repr__(self):
return f"User({self.name})"
輸出:
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def __repr__(self):
return f"User({self.name})"常見問題
它使用哪一種 Python 風格?
多數版本預設遵循 PEP 8,通常透過 Black 套用:88 欄行寬、雙引號字串、無結尾分號。Black 是有立場的格式化工具——它砍掉大部分設定旋鈕,以保證整個專案風格一致。如果需要彈性,可以改用 autopep8 或 yapf。
縮排對格式化工具重要嗎?
重要——Python 的縮排定義了區塊結構。格式化工具會尊重既有的區塊邊界;若輸入混用 Tab 與空白或縮排層級錯誤,在開始格式化前就會解析失敗。
會幫我整理 import 順序嗎?
Black、autopep8 與 yapf 只處理空白。若要排序與分組 import,請使用 isort(或 ruff --fix)。有些頁面會把兩者結合使用;請查看設定以確認實際套用了哪些。
支援型別註解(type hints)嗎?
現代版本的解析器都支援。函式簽章、變數與類別屬性上的型別註解(PEP 526、484、612)都能正確格式化。極新的語法(例如 3.12+ 的 PEP 695 泛型語法)需要較新的解析器,舊版本可能會卡住。
我的程式碼會被上傳嗎?
不會。格式化是在你的瀏覽器中以 JavaScript 實作的 Python AST 執行。貼上的程式碼不會被傳送到任何地方。
結果會與我 CI 上跑的 black 一致嗎?
接近但不一定完全相同。不同版本的 Black 會有些微差異(Black 會定期更新規則)。若要 CI 一致,請在本機與 CI 上使用同一個 Black 版本;本頁適合當作快速的視覺檢查。
為什麼長行會被斷成多行?
PEP 8 與 Black 都以每行不超過 88 字元為目標。較長的運算式、引數很多的函式呼叫,以及鏈式方法呼叫,都會被拆到多行以提升可讀性。如果你的團隊使用 100 或 120,請調整行寬選項。