這個工具會對你貼上的內容執行 Black - 多數 Python 專案早已認同的格式化工具 - 依你選擇的行寬與引號處理方式進行格式化。如果檔案無法解析,它會說明是哪一行;如果檔案已經格式化過,它也會照實告知,而不是假裝做了什麼。
格式化 Python 程式碼並不需要執行它。程式碼會被解析成語法樹,再完全在記憶體中依據這棵樹重新寫出 - 它從不會被寫入檔案,從不會被匯入,也從不會被執行。一個會執行你貼上內容的格式化工具,其實就是帶著文字輸入框的遠端命令列。
Black 是一種保持 AST 不變的轉換:輸出的程式碼與輸入的程式碼是同一個程式。正是這個特性,才讓一個格式化工具值得信任,也正因如此,這個工具的任何環節都沒有語言模型參與其中。被要求整理程式碼的模型,偶爾會在整理過程中順手改寫某一行,而對可正常運作的程式碼進行無聲的改動,正是格式化工具絕不能犯的失誤。
這和 CI 問的是同一個問題:這個檔案會改變嗎?檢查模式會原樣傳回你的原始程式碼,並回報 Black 本來是否會重新格式化它,以及會改動多少行。這是快速弄清楚某個流水線為什麼在一個你無法在本地重現的檔案上失敗的辦法。
最後一項後面的逗號會讓 Black 把呼叫或集合保持為每行一項:result = compute(alpha, beta,) 會變成四行,alpha, 和 beta, 各佔一行。勾選忽略魔法結尾逗號後,同樣的輸入只要放得下行寬就會變成 result = compute(alpha, beta)。要保護手動對齊的程式碼區塊(例如矩陣),在它上方一行寫 # fmt: off,下方寫 # fmt: on,Black 會原樣保留兩者之間的內容;行尾的 # fmt: skip 只保護這一行。這些是 Black 本身的註解,所以在你專案的 CI 執行 Black 時同樣有效。
程式碼會被送到伺服器,在記憶體中格式化後於同一個回應中傳回。沒有任何內容會被寫入磁碟、快取或記錄日誌,使用記錄只保留計數 - 大小、選項、改動了多少行 - 從不保留程式碼本身。
不會。Black 改變的是排版,而不是行為,但它做的不只是挪動空格。它會刪除多餘的括號(x = (1) 變成 x = 1),把數字的前綴和指數改成小寫(0XABCDEF 變成 0xABCDEF,1E5 變成 1e5),把呼叫拆成多行時補上結尾逗號,壓縮連續的空行,並去掉 docstring 內部的空格(""" Doc. """ 變成 """Doc.""")。最後這一項會改變 __doc__ 的文字,只有當你的程式碼讀取自己的 docstring 時才有影響。
因為它在你選擇的行寬下已經是格式化過的了。工具會直接說「已經格式化過」,而不是悄悄傳回一份原樣副本。
不會。排序 import 是 isort 的工作,不是 Black 的,兩者分歧足夠常見,如果在這裡這麼做會讓你感到意外。
任何格式化工具都做不到 - 一個無法解析的檔案沒有可供重寫的結構。你會得到行號、欄號以及周圍的程式碼,方便你修正後再試一次。
Black 與 PEP 8 相容,只有一處廣為人知的偏差:它的預設行寬是 88 而不是 79。如果你需要更嚴格的數值,請在行寬選擇器中選 79。
每次最多 400,000 個字元。格式化超過 10 秒會被中止,只有非常大或高度重複的檔案才會碰到,每個 IP 位址每 10 分鐘可格式化 30 次。
本頁執行的是 Black,寬螢幕時頁面頂端列會顯示其版本。Black 從 pyproject.toml 的 [tool.black] 區段讀取專案設定,鍵名與長命令列選項相同:你選的"行長度"對應 line-length = 88,勾選了"保留我的引號"就寫 skip-string-normalization = true,"忽略魔法結尾逗號"對應 skip-magic-trailing-comma = true,在"目標"中固定的版本對應 target-version = ["py311"]。編輯器外掛和 pre-commit 掛鉤讀取的也是這個檔案。用 black . 格式化,在 CI 中執行 black --check --diff . :它不會修改任何檔案,若有檔案會被重新格式化則以結束代碼 1 結束。請固定與本頁相同的 Black 版本,因為每個日曆年的第一個版本可能會改變穩定風格。
幾乎總是相同,但並非逐位元組一致。Ruff 的格式化工具被設計為 Black 的直接替代品,Ruff 文件指出,在 Django、Zulip 等已用 Black 格式化的大型專案上,超過 99.9% 的行結果完全相同。對從未經過 Black 處理的程式碼,差異會更多,尤其是行尾註解,其文件列出了刻意的差異。它的預設行長同樣是 88,在 [tool.ruff] 中以 line-length 設定;[tool.ruff.format] 中的 quote-style = "preserve" 對應"保留我的引號",skip-magic-trailing-comma = true 對應"忽略魔法結尾逗號"。如果你的 CI 執行 ruff format --check,請用 Ruff 而不是本頁來檢查檔案。