2024 iThome 鐵人賽2024 iThome 鐵人賽

這是 Django Ninja 系列教學的第 5 篇。

在現代軟體開發中,工具不僅能提高開發效率,還能改善程式碼品質,讓專案的管理與維護變得更加輕鬆。

本文將介紹幾個重要的 Python 開發工具,討論它們在專案中的應用,讓讀者快速了解它們的定位與價值

如果你看過我的部落格,應該會發現,我花了不少篇幅在大力推廣這些現代開發工具,為它們撰寫了一篇又一篇的詳細文章教學。

因此,我們不會深入這些工具的操作細節,而是著眼於概念,以及它們如何解決開發中的痛點。我會附上相關教學文章的連結,讓有興趣的讀者可以進一步學習。

值得一提的是,這些 Python 的現代開發實踐,都是我看了開發者 Wei Lee(李唯)的「Python Table Manners」系列後,才一一學習並落實的。個人強力推薦此系列!


本專案使用 Python 3.12.5、Django 4.2 LTS 及 Django Ninja 1.3.0,這部分只要知道即可。

我們現在進入各個工具的介紹。

pyenv:Python 版本管理

pyenv(對,它的 p 是小寫,同 pytest)是一個管理多個 Python 版本的強大工具,它允許你在不同專案中使用不同版本的 Python,而不會產生衝突。

這也是為什麼,專案中有一個.python-version檔——它向 pyenv 聲明了專案所使用的 Python 版本。

pyenv 在處理多個使用不同 Python 版本的專案時特別有幫助,尤其是當某些專案需要使用舊版 Python 時。

透過 pyenv,你可以輕鬆安裝和切換 Python 版本,確保每個專案都能在正確的環境中運行。

詳細的 pyenv 教學,可以參考我之前寫的:


Poetry:虛擬環境與套件管理

Poetry 是目前相當受歡迎的 Python 套件管理工具,而套件管理——尤其是套件之間的「相依性」問題,一直是 Python 開發上的一大痛點。

Poetry 主要解決的是,套件之間對其相依套件的不同版本範圍的衝突問題

這些細節,一言難盡,可參考我的文章〈Python 套件管理器——Poetry 完全入門指南〉,尤其是其中「名詞解釋」部分。

此外,Poetry 因為涉及了虛擬環境管理,怎麼樣和 pyenv 一起使用,讓虛擬環境能選擇正確的 Python 版本,也是個常見問題,可參考〈Poetry + pyenv 教學:常用指令與注意事項〉一文的介紹。


Ruff:Linter 與 Formatter

時代在變,以往我都是 Flake8 + isort + Black——現在我都用 Ruff。

Ruff 是一款超高速的 Python linter 和 formatter,使用 Rust 寫成,用於快速檢查並修正程式碼中的排版格式問題。

快,就是快快,就是快

Ruff 能夠幫助開發者維持統一的程式碼風格(主要是符合 PEP8)。由於其高效能,Ruff 特別適合用於大型專案。

除此之外,Ruff 還能夠整合眾多 Flake8 外掛,成為一個 All-in-One 方案對我而言,這是它在速度之外的另一大賣點。

更多 Ruff 的介紹,可以參考我的文章:


pre-commit:Git Hooks 管理工具

俗話說的好:「沒有 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 教學


Mypy:靜態型別檢查

你的 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 三部曲」系列:

  1. 《強健的 Python》筆記(一)Type Hints 的成本與挑戰
  2. Python type checker:Mypy 介紹
  3. Django 專案加入 Mypy 指南

結語

pyenv 幫助我們靈活管理 Python 版本,Poetry 解決了套件的管理問題,Ruff、pre-commit 和 Mypy 等工具確保程式碼的乾淨與一致性,這些工具相輔相成,共同建構了一個高效率的開發環境

善用它們,是我們作為現代開發者的必備素養,也是團隊合作的重要基石。學習需要一些時間成本,但習慣以後,相信這些工具會成為你開發過程中不可或缺的助力