iT邦幫忙

2024 iThome 鐵人賽

DAY 5
3

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

本文將介紹幾個重要的 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 等工具確保程式碼的乾淨與一致性,這些工具相輔相成,共同建構了一個高效率的開發環境

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

本文同步發表於我的部落格——Code and Me


上一篇
卷 4:API 範例專案介紹
下一篇
卷 6:環境設定 × 如何使用本專案
系列文
Django 忍法帖——Django Ninja 入門指南31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
gbaian10
iT邦新手 5 級 ‧ 2024-09-17 15:50:18

使用 pyenv 和 poetry env use 有什差別?

poetry env use 也可以選擇指定的 python 環境,那這樣為何還要同時使用兩者呢?

Kyo Huang iT邦新手 4 級 ‧ 2024-09-18 12:50:16 檢舉

因為poetry env use所指定的 Python 環境,都是從「系統的某個地方(路徑)」複製過來的,所以還是需要 pyenv 把特定版本的 Python 裝到「某個地方」

gbaian10 iT邦新手 5 級 ‧ 2024-09-18 21:42:05 檢舉

聽起來像是一個安裝各種版本python的套件,這是針對每個專案裝一個python解釋器在該專案或該專案的虛擬環境?

若有多個 python 版本我是自己安裝在本機的環境變數能找到的地方讓 poetry 能找到即可

Kyo Huang iT邦新手 4 級 ‧ 2024-09-19 23:14:43 檢舉

pyenv 安裝的所有 Python 版本都統一放在它自己的目錄底下,只有虛擬環境聲明使用時,才會複製一份過去

而在專案下使用 pyenv local 指令,也只是建立一個 symbolic link 而已(指向 pyenv 目錄底下的特定 Python 執行檔路徑)

我要留言

立即登入留言