在現代軟體開發中,工具不僅能提高開發效率,還能改善程式碼品質,讓專案的管理與維護變得更加輕鬆。
本文將介紹幾個重要的 Python 開發工具,討論它們在專案中的應用,讓讀者快速了解它們的定位與價值。
如果你看過我的部落格,應該會發現,我花了不少篇幅在大力推廣這些現代開發工具,為它們撰寫了一篇又一篇的詳細文章教學。
因此,我們不會深入這些工具的操作細節,而是著眼於概念,以及它們如何解決開發中的痛點。我會附上相關教學文章的連結,讓有興趣的讀者可以進一步學習。
值得一提的是,這些 Python 的現代開發實踐,都是我看了開發者 Wei Lee(李唯)的「Python Table Manners」系列後,才一一學習並落實的。個人強力推薦此系列!
本專案使用 Python 3.12.5、Django 4.2 LTS 及 Django Ninja 1.3.0,這部分只要知道即可。
我們現在進入各個工具的介紹。
pyenv(對,它的 p 是小寫,同 pytest)是一個管理多個 Python 版本的強大工具,它允許你在不同專案中使用不同版本的 Python,而不會產生衝突。
這也是為什麼,專案中有一個.python-version
檔——它向 pyenv 聲明了專案所使用的 Python 版本。
pyenv 在處理多個使用不同 Python 版本的專案時特別有幫助,尤其是當某些專案需要使用舊版 Python 時。
透過 pyenv,你可以輕鬆安裝和切換 Python 版本,確保每個專案都能在正確的環境中運行。
詳細的 pyenv 教學,可以參考我之前寫的:
Poetry 是目前相當受歡迎的 Python 套件管理工具,而套件管理——尤其是套件之間的「相依性」問題,一直是 Python 開發上的一大痛點。
Poetry 主要解決的是,套件之間對其相依套件的不同版本範圍的衝突問題。
這些細節,一言難盡,可參考我的文章〈Python 套件管理器——Poetry 完全入門指南〉,尤其是其中「名詞解釋」部分。
此外,Poetry 因為涉及了虛擬環境管理,怎麼樣和 pyenv 一起使用,讓虛擬環境能選擇正確的 Python 版本,也是個常見問題,可參考〈Poetry + pyenv 教學:常用指令與注意事項〉一文的介紹。
時代在變,以往我都是 Flake8 + isort + Black——現在我都用 Ruff。
Ruff 是一款超高速的 Python linter 和 formatter,使用 Rust 寫成,用於快速檢查並修正程式碼中的排版格式問題。
Ruff 能夠幫助開發者維持統一的程式碼風格(主要是符合 PEP8)。由於其高效能,Ruff 特別適合用於大型專案。
除此之外,Ruff 還能夠整合眾多 Flake8 外掛,成為一個 All-in-One 方案。對我而言,這是它在速度之外的另一大賣點。
更多 Ruff 的介紹,可以參考我的文章:
俗話說的好:「沒有 CI,至少也要有 pre-commit」——這是我自己說的。
pre-commit(沒錯,它的 p 也是小寫)是由 Python 所寫成的 Git Hooks 管理工具,適用於各類程式語言專案。讓使用者根據自己的需求,建立相關的 Git Hooks。
以常見的「pre-commit hook」為例,它會在你執行git commit
之際,自動運行各種檢查和格式化工具——也就是你設定的 hooks,確保提交的程式碼符合規範。
這不僅能維護程式碼品質,還能減少 code review 中的瑣碎問題,讓審核者專注於邏輯和架構的審查。
在我們的範例專案中,pre-commit 被設定為運行 Ruff 和一些基本的格式確認,以確保程式碼風格的一致性。
相關文章:Python 開發:pre-commit 設定 Git Hooks 教學
你的 Python 專案有 type hints 嗎?
如系列第一篇所言,Django Ninja 是你學習 type hints 一個很好的開始。
想為專案加入 type hints,靜態型別檢查器(static type checker)是不可或缺的。而其中最常見的選擇,就是 Mypy。
Mypy 是一個強大的工具,它不僅能檢查型別錯誤,還能在程式運行前,就捕捉到許多潛在問題。在我看來,它實際上的影響超越了型別範疇。
Mypy 是大型專案和團隊合作必備的工具。然而,我想強調的是,即便對於小型專案,Mypy 也能帶來明顯的好處。
Type hints 的成本與效益,可以用下列這張圖來說明(重繪自《強健的 Python》):
長期而言,使用 type hints 和 Mypy 能帶來持續性的效益——其實這適用於本篇介紹的所有工具😎。雖然初期需要投入一些時間來學習和適應,但這是值得的。
Mypy 與 Python type hints 的更多介紹,歡迎參考我的「Mypy 三部曲」系列:
pyenv 幫助我們靈活管理 Python 版本,Poetry 解決了套件的管理問題,Ruff、pre-commit 和 Mypy 等工具確保程式碼的乾淨與一致性,這些工具相輔相成,共同建構了一個高效率的開發環境。
善用它們,是我們作為現代開發者的必備素養,也是團隊合作的重要基石。學習需要一些時間成本,但習慣以後,相信這些工具會成為你開發過程中不可或缺的助力。
本文同步發表於我的部落格——Code and Me
使用 pyenv 和 poetry env use 有什差別?
poetry env use 也可以選擇指定的 python 環境,那這樣為何還要同時使用兩者呢?
因為poetry env use
所指定的 Python 環境,都是從「系統的某個地方(路徑)」複製過來的,所以還是需要 pyenv 把特定版本的 Python 裝到「某個地方」
聽起來像是一個安裝各種版本python的套件,這是針對每個專案裝一個python解釋器在該專案或該專案的虛擬環境?
若有多個 python 版本我是自己安裝在本機的環境變數能找到的地方讓 poetry 能找到即可
pyenv 安裝的所有 Python 版本都統一放在它自己的目錄底下,只有虛擬環境聲明使用時,才會複製一份過去
而在專案下使用 pyenv local 指令,也只是建立一個 symbolic link 而已(指向 pyenv 目錄底下的特定 Python 執行檔路徑)