在〈《強健的 Python》筆記(一)Type Hints 的成本與挑戰〉一文中,我們闡述了為 Python 專案程式碼加上 type hints 的長期價值需要付出的成本

文中多次提到了 Mypy 這個靜態類型檢查器

本文從歷史發展、工作原理與工具的整體輪廓上介紹 Mypy 的特色,

雖然沒有詳細的 Mypy 使用教學,但更了解 Mypy,可能讓你對 Python 的型別檢查產生不同的看法。

老實說,我覺得 Mypy 不太需要學習,只要引入一些設定就好。這部分我們會在下一篇文章中介紹。

最後,我會分享一些使用 Mypy 時的心得與經驗。

如果看過開頭那篇文章,你可能會認同:我們終將要成為 Python type hints 的信徒。而 Mypy 就是最佳的布道者。


為什麼需要 Mypy

Python 是一門廣受歡迎的「動態定型」程式語言,以其簡潔的語法和靈活性著稱。

然而,這種靈活性有時也會成為問題,特別是在大型專案中,型別錯誤可能會導致難以追蹤的 bug,從而降低程式碼的可靠性和可維護性。

在這樣的背景下,Mypy 應運而生。

Mypy 介紹

Mypy 是由 Jukka Lehtosalo 開發的一個開源專案,它是一個靜態類型檢查工具,旨在通過閱讀 Python 程式碼中的型別註解(type hints、type annotations)來提供完善的型別檢查。及早發現類型錯誤,從而提高程式碼品質。

Mypy 的歷史發展

Mypy 的開發歷史可以追溯到 2012 年,當時 Jukka Lehtosalo 在他的博士論文中首次提出了這個想法。

隨著專案的發展,Python 之父 Guido van Rossum 也對此表示支援——可參考良葛格的〈Type Hints的野心〉一文。並在 2014 年共同提出了 PEP 484,該 PEP 正式將型別註解引入了 Python 語言標準,並在 Python 3.5 中實現。

沒錯,Mypy 的存在甚至比 Python 3.5 更早。由此可知,Mypy 才是 Python type hints 的催生人😎

Mypy 的工作原理

Mypy 的工作原理非常簡單:在開發者新增型別註解後,Mypy 會在檢查過程中閱讀這些註解,並根據註解所描述的類型來判斷程式碼是否正確。

這樣一來,很多在運行時才會暴露的錯誤,可以在開發階段就被捕捉到。

使用 Mypy 的主要好處包括:

  • 提高程式碼的穩定性和可靠性:通過及早發現類型錯誤,可以避免很多運行時才會出現的 bug。
  • 增強程式碼的可讀性:型別註解可以作為文件的一部分,使程式碼的用途和預期行為更加清晰。
  • 提升團隊合作效率:當多個開發者協作時,型別註解可以幫助大家保持一致的理解和程式碼風格。

其他類型檢查器

對我而言,Mypy 是型別檢查時的首選,因為它最親民,意思是它檢查時最「寬容」,所以最容易上手。

但也有其他類型檢查器可供選擇,這裡只介紹最常見的幾個:

工具 描述 優點 缺點
Pyright 由 Microsoft 開發的一個高效能、功能強大的靜態類型檢查工具,特別適合大型專案。 直接整合 VSCode、支援 TypeScript 類型系統 社區支持相對較少
Pyre 由 Facebook 開發的靜態類型檢查工具,強調高效能和高準確性的類型檢查。 檢查速度快、精確度高 設定較為複雜,學習曲線較陡
Pytype 由 Google 開發的靜態類型檢查工具,支持自動類型推斷和錯誤檢查。 自動推斷類型 設定和使用相對複雜

它們剛好都是由各個巨頭公司開發的XD

其中值得一提的是 VS Code 中 Pylance 套件,它採用的正是 Pyright,你可以在編輯器中直接開啟它的型別檢查功能。

不過它的嚴格程度比 Mypy 還要高,要完全遵守真的很累(難怪說它適合大型專案),所以我還是比較喜歡 Mypy。


我的 Mypy 經驗與心得

從今年 3 月開始寫 Django Ninja 而認真導入 Mypy 至今,我覺得它對於發現潛在錯誤非常有幫助。

這無疑是靜態類型檢查的魅力所在:幫助你在開發過程中提前發現問題

它甚至會強迫你寫出更好、意圖更清晰的程式碼,因為你不得不思考變數的型別,無法再像以前那樣隨心所欲。

當然,為專案程式碼加上 type hints,會增加一定的工作量。但從獲得的收益,兩相權衡,我認為很值得

尤其要特別強調一點:預設的 Mypy 其實非常寬容,你可以慢慢地導入它,不用一下子就把大部分程式碼都加上 type hints。

我想這也正是 Python type hints 的核心精神:取你所需,不必非黑即白。