晚上河濱散步的最後十分鐘聽了《捕蛇者說》這集〈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!