Python linter、formatter 整合 VS Code 的文章,已經寫過好幾篇,但還是不厭其煩地繼續寫,原因很簡單——它們實在太基本也太重要,卻往往未受到足夠的重視。

永遠不要小看這些排版上的細節程式寫作習慣的影響。

如同我在〈VS Code:Python isort 擴充套件介紹與簡易設定教學〉文末所言:

對於重視程式寫作規範,意在貫徹 Clean Code 精神的開發者而言,它不是一種選擇,而是一種必然。

以及〈VS Code 設定 Python linter 與 formatter:以 Flake8、yapf 為例〉中說的:

Linter 和 formatter 雖然無法保證你寫出 Clean Code,但至少能協助你盡可能符合 PEP 8 風格,並省下處理排版細節上的心力,讓你更專注在程式的核心部分。

儘管「善用 linter、formatter」和「寫出 Clean Code」之間,還相隔著不知多少努力與反省,但後者必定是建立在前者之上——我對此深信不疑。

所以我不曾去質疑這些工具的必要性,因為它們就像陽光、空氣、水一般,不可或缺,只要我還寫程式的一天,就只會立足於它們之上。

廢話不多說,我們進入正題。


本文重點

有鑑於微軟已經從 VS Code Python extension 中拆分了幾個重要的 Python linter、formatter 功能,所以在settings.json中的設定會有一些變化,本文就來介紹,這些新套件在設定上的重點。

其實——也沒什麼重點啦!複製貼上即可。🐸

目前已「獨立」出的 Python 相關擴充套件有:

isort 我們上一篇講過了,這次把剩下的兩項補完,功德圓滿。


Flake8 設定

舊有的 Flake8,是前述 Python 擴充套件的一部分,需要你額外安裝 Flake8 package 在專案的 Python 虛擬環境中。其settings.json設定如下:

1
2
3
4
5
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": [
"--max-line-length=100",
"--ignore=E131,E302",
],

使用 Flake8 擴充套件後,新的設定改為:

1
2
3
4
"flake8.args": [
"--max-line-length=100",
"--ignore=E131,E302",
],

內容相同,只是 token 名稱不同而已。

和以前最大的區別是:Flake8 package 已安裝於擴充套件中,不必再額外安裝到專案虛擬環境,且可以跨專案共用!這也是採用新方案的最大優點

注意,新舊兩者是可以並存的!因為它們指向的flake8路徑各不相同。但我還是建議,安裝擴充套件以後,原來的設定就可以移除了,以免混淆。

Black Formatter 設定

舊有的設定:

1
2
3
4
5
"python.formatting.provider": "black",
"python.formatting.blackArgs": [
"--line-length=100",
"--skip-string-normalization"
],

安裝 Black Formatter 擴充套件後的設定:

1
2
3
4
5
6
7
8
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
// "editor.defaultFormatter": "ms-python.python",
},
"black-formatter.args": [
"--line-length=100",
"--skip-string-normalization"
],

這裡的一大重點,就是要把 Python 預設的格式化器,從 Python 擴充套件提供,改為直接使用 Black 擴充套件。

專案與使用者設定衝突

最後補充一個常見的情境,以我自己為例:

個人開發我使用 Black,但工作上都是使用 yapf,怎麼辦?

此時要善用 VS Code 的專案設定檔

該設定檔預設並不存在,最簡單的方式就是先在專案的根目錄中建立.vsccde資料夾(記得要加入.gitignore),並在其中新增一個settings.json檔。

專案的設定,就會優先於使用者的全域設定。以上述情境為例,我的專案設定如下:

1
2
3
4
"python.formatting.provider": "yapf",
"[python]": {
 "editor.defaultFormatter": "ms-python.python",
},

yapf 的參數部分,因為不會發生衝突,依舊寫在使用者設定中即可:

1
2
3
4
"python.formatting.yapfArgs": [
"-p",
"--style={column_limit=100}",
],

如此一來,在有上述設定的工作專案中,VS Code 會優先使用 yapf 作為 formatter,並套用對應的參數。而沒有額外設定時,則一律使用 Black。