雖然鐵人賽已經順利完成,但開發的套件還是會持續更新,剛好又有想分享的就有這篇出來,有興趣的還是可以看看。
Formatter 是在程式開發的時候,幫助我們程式排版的工具,裡面會定義一些寫程式的規則,然後在編輯器上檢查程式碼是否符合規則,然後會在上面有提醒像是 Warning 跟 Error 的 Highlight。也可以使用他們的 autofix
功能自動排版。在 Day 03 - VSCode 程式編輯器 的時候有簡單介紹了一下 Formatter,不過那時候是編輯器的設定,但我後來在開發的過程,想說如果要大家都一樣的話,可能還是要設定一下。
經過調查一下過後,我看滿多人推薦 Ruff 這個 formatter。原因有幾點,第一個是他可以自動幫你結合其他 Formatter 規則,可以自己選定要套用哪些,這個我覺得滿方便的,跟 Eslint 的 Plugin 有點像。再來是他可以直接在 pyproject.toml
設定,不用特別多創建設定檔。快速的使用方法:
# 安裝套件
pip install ruff
# 檢查程式碼是否都有符合規則
ruff check
# 檢查程式碼是否有可以 autofix 的地方
ruff format --check
# 進行程式碼 autofix
ruff format
設定檔的話我是參考 Python 開發:Ruff Linter、Formatter 介紹 + 設定教學 裡提到的 FastAPI 設定,因為老實說我也不知道全部有哪些規則,想說先用個試試看再慢慢調整,簡單會使用 select
選擇要套用的規則,ignore
可以無視特定規則,文章裡也提供與 VSCode 連結的方法,很值得一看。
設定完 ruff
,接下來就會想用自動化的東西,有兩個時候可以執行,一個是跟 pytest
的檢查一樣,在當我們有新的 commit
的時候可以執行 ruff check
去檢查有遺漏的不符合規則的程式碼,就可以讓所有貢獻者的程式碼都使用一樣的規則在寫。一樣寫進 Workflow 裡,就會跟 pytest
一起檢查。我有試過把 check
跟 publish
分開,但他好像要進 main
的時候才會分別跑,還在試,有好的解法歡迎讓我知道!
另外想講另一個工具 pre-commit,這也是自動化的工具,不過跟 Workflow 不一樣,他會在我們執行 git commit
的時候幫我們用 formatter autofix
,等於說在 commit
新的改動前,他又會再幫我們檢查程式碼撰寫規則,找到可以 autofix
的幫我們自動處理,這樣我們就不用每次自己執行 ruff format
之類的指令。會用設定檔 .pre-commit-config.yaml 來管理。
在用 pre-commit
配合 ruff
的時候我有遇到一個問題,就是 Python import
的順序自動修改,不知道為什麼在 autofix
的時候不會執行,我後來是參考 https://github.com/astral-sh/ruff/issues/10882 :
hooks:
- id: ruff
name: lint with ruff
- id: ruff
name: sort imports with ruff
args: [--select, I, --fix]
- id: ruff-format
這樣改有成功解決,原因是規則 I001 跟 F401 有執行衝突的樣子,pyproject.toml 裡的 select
也要改成:
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"F", # pyflakes
"UP", # pyupgrade
]
extend-select = [
"I", # isort
]
這次介紹 Formatter
跟 pre-commit
是因為我覺得在開源的時候,有個能自動化檢查與 fix
的程式碼規則,可以有效幫助我們程式的品質與一致性,可以減少一些不必要的來回溝通。這不只在開源,在當一個工程部門開始變大的時候也有幫助,畢竟大家寫程式的習慣可能不一樣,有個訂好的規則去遵守,管理會更方便。
最後還是要說,這些 Coding Style 的規則訂定,沒有一定的硬性規定,都是要去多試多討論,才會有個最適合的結論出來,大家也可以多玩玩看。
感謝大家耐心地看完這篇文章,之後套件有什麼可以介紹的更新,可能會持續更新,也歡迎大家直接來貢獻。一樣有任何問題與建議也歡迎留言,各位有緣再見,掰掰。