Flake8 與 isort in VS Code
晚上河濱散步的最後十分鐘聽了《捕蛇者說》這集〈Ep 17. Use the Flake8, Luke!〉的前面一部分,發現裡面提到的東西正是我需要的啊!
相關文章:
Pylint to Flake8
最近 VS Code 不斷提醒我要把 Language Server 換成 Pylance,我終於屈服,隨即發現 pylint 的語法提醒變多了,波浪底線與小點點們讓我看得有點心煩。
Linters in Python
Linter,簡言之就是幫你檢查程式中語法正確性的工具,各種語言都有自己的 linter,而 Python 最常見的 linter 不外乎pylint
、pep8
(現在改名為 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 | "python.linting.flake8Args": [ |
畢竟長度 80 字元真的太嚴格囉!偶爾會超過一些但又不想換行變冗。
總之,比較推薦flake8
!
原來早就內建的 isort
2022/05/08
更正:
原來不是 VS Code 內建了 isort,而是 Python extension 直接安裝了 isort。更多資訊可參考:試用從 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!
相關文章