Python 是一種動態語言,其型別檢查與處理是在運行時期(Runtime)進行,與靜態語言如 C 有所不同。這種特性帶來了高度的靈活性,使 Python 非常適合快速迭代和原型開發,並能靈活應對需求變更。然而,這也意味著型別錯誤只有在運行時才會被發現,可能導致程式崩潰。隨著應用程式的規模和複雜度增加,動態語言的靈活性可能會使程式碼難以理解和維護。
為了解決這一問題,Python 官方引入了型別提示(Typing Hint),允許開發者為關鍵的變數、函數參數和返回值提供型別標註。這種做法在保持 Python 靈活性的同時,提升了程式碼的可讀性和可維護性。
本篇文章將介紹一個充分利用型別提示的工具——Mypy。Mypy 能在應用程式運行前根據已有的型別提示進行靜態型別檢查,從而找出潛在的類型錯誤。例如,如果開發者定義了一個函式要求接收 int
類型的參數,卻意外地傳入了一個 str
,Mypy 會在應用程式執行之前提示這個潛在的錯誤。
接下來,我將通過範例來進一步介紹 Mypy 的功能。
本次範例使用的是 Mypy 1.11.2 版本
poetry add mypy==1.11.2
首先,請建立一個名為 main.py
的檔案。在這個範例中,我們將定義一個函式,該函式會嘗試從陣列中取得位於指定 index 的數值。如果 index 超出了陣列的範圍,函式將返回 None。最後,我們會將獲取的值轉換為大寫字母。
from typing import Optional
def find_item(items: list[str], index: int) -> Optional[str]:
if 0 <= index < len(items):
return items[index]
return None
item = find_item(["apple", "banana"], 5)
print(item.upper())
接著,執行指令 poetry run mypy main.py
,即可獲得型別檢查的結果。結果顯示第11行存在型別錯誤,由於 item
的型別可能是str
或 None
,當開發者執行此應用程式且 item
的型別為 None
時,調用 upper()
方法將導致程式在運行時崩潰,並顯示錯誤訊息 AttributeError: 'NoneType' object has no attribute 'upper'
。
Mypy 的優勢正體現在此。它根據現有的型別提示推斷潛在的錯誤,幫助開發者在程式運行前發現並修正問題。這種靜態型別檢查能有效提高程式碼的穩定性和可維護性。