相關文章:VS Code 設定使用 Python linter 與 formatter:以 Flake8、yapf 為例

晚上河濱散步的最後十分鐘聽了《捕蛇者說》這集〈Ep 17. Use the Flake8, Luke!〉的前面一部分,發現裡面提到的東西正是我需要的啊!

Pylint to Flake8

最近 VS Code 不斷提醒我要把 Language Server 換成 Pylance,我終於屈服,隨即發現 pylint 的語法提醒變多了,波浪底線與小點點們讓我看得有點心煩。

Linters in Python

Linter,簡言之就是幫你檢查程式中語法正確性的工具,各種語言都有自己的 linter,而 Python 最常見的 linter 不外乎pylintpep8(現在改名為 pycodestyle) 和 flake8,早期 VS Code 會推薦使用pylint,所以我也一直延用至今。

以上 linter 都是 Python 的 package,可獨立執行、使用,這裡提及的主要是整合在 VS Code 中,讓這些選定的 linter 自動幫你檢查程式碼是否有錯誤的功能。

龜毛的 pylint

不過pylint的語法檢查真的有點太細瑣、嚴格,比如:

  • except ValueError as e,這裡的變數e就會被警告沒有符合 Python 命名風格——要有底線分隔。
  • 警告你函式或類別缺乏 docstring,函式沒寫 docstring?好像很常見厚?😂

還有一個典型的情況就是這篇所提及的和 Django 的不合拍:

典型的就是集成了django.db.models.Model的模型層對象在編譯時沒有objects屬性,但是運行時卻有,造成我們在編寫代碼時pylint會報”has no objects attributes”之類的錯誤,雖然不影響程序運行,但是很影響心情啊

沒錯,每次看到.objects屬性底下的警告波浪線真的很心煩,哈哈!

雖然可以使用.pylintrc文件或 IDE 的arguments setting來排除與客製化檢查規則,但就是麻煩,如本集 Podcast 來賓所言,調整起來費時費力,太辛苦了。

VS Code Flake8 settings

換成flake8感覺就好多了,預設出現的提醒都相對實用,不太需要調整。

雖然我後續還是忍不住在 VS Code 的settings.json增加了下列設定 XD:

1
2
3
4
"python.linting.flake8Args": [
"--max-line-length=100",
"--ignore=E402,F841,F401,E302,E305",
]

畢竟長度 80 字元真的太嚴格囉!偶爾會超過一些但又不想換行變冗。

總之,比較推薦flake8

原來早就內建的 isort

2022/05/08更正:
原來不是 VS Code 內建了 isort,而是 Python extension 直接安裝了 isort。更多資訊可參考:試用從 VS Code Python extension 拆分的 Black、isort 套件

除了 linter,常見語法相關工具還有 formatter,自動幫你排版程式碼,讓它們盡可能符合 PEP8 的風格,早期我是用 autopep8 ,後來改用 Google 出的 yapf,目前還不考慮轉戰排版一致性最高的 Black

儘管有這些 formatter,但 import 順序問題依舊是一個痛,因為它們不會幫你自動調整成 PEP8 期待的風格

  • 依序為:
    • 標準函式庫
    • 第三方函式庫
    • 本地模組
  • 三種類的 import 中間要各空一行。

而像我這種排版小偏執,就很難不在意。

但手動一個一個調整,效率不高又可能出錯,結果本集就提到了 isort 這個套件,可以幫你自動排序 import 程式行令其符合上述風格。我無法置信這麼重要的東西我以前竟然都不知道!

於是立刻 google 一下 VS Code 怎麼開啟這個功能,是否也是裝完 isort package 再去設定中打開?結果比想像中更簡單,原來這功能早就直接內建了!按右鍵就可以使用啊我哭😭,太晚才知道。立刻設定了鍵盤快捷鍵:Alt+I

小結

雖然都是小事,不過能增加效率就是好事,happy coding!