1. 為什麼需要型別註解?有哪些好處?
Python 是一種動態型別語言,即使不明確指定變數或函式的型別,也能正常執行。這樣的特性讓程式撰寫更具彈性,但當程式規模變大,或在多人協作開發時,程式碼的可讀性可能會變差。這時,使用「型別註解」就非常有幫助。
動態型別的挑戰與型別註解的優點
在 Python 中,變數的型別有時會變得模糊不清。雖然這在小型腳本中可能不是大問題,但當專案變得複雜時,會造成理解困難,甚至容易產生錯誤。透過型別註解,可以帶來以下幾個好處:
- 提升可讀性:透過型別註解,變數與函式的型別變得清楚明確,讓其他開發者更容易理解程式碼。
- 提早發現錯誤:使用像是
mypy
這類工具,可以在執行前就偵測到型別不一致的問題。 - 提升開發效率:與編輯器的自動補全功能配合,可以讓撰寫程式更流暢快速。
2. 基本的型別註解寫法
型別註解是從 Python 3.5 開始正式支援的功能,允許在程式中明確指定型別,使開發者能更清楚理解程式的行為。
如何為變數加上型別註解
給變數加上型別註解的方法很簡單,只需要在變數名稱後方加上型別即可,如下所示:
x: int = 10
y: float = 3.14
name: str = "John"
為函式的參數與回傳值加上型別註解
在函式中,也可以為參數與回傳值加上型別註解。例如,以下的函式中,參數 a
是 int
型別,而回傳值是 str
型別:
def greet(age: int) -> str:
return f"Your age is {age}"
型別註解不會影響程式執行,但可以提升程式的可讀性,並與編輯器的補全功能配合,提升開發效率。

3. typing
模組的應用
Python 的 typing
模組可用來表示更複雜的型別。在這一節,我們會介紹一些常見的使用方式。
List
型別的使用範例
若想為串列(list)指定型別,可以使用 List
。以下範例中,指定了一個 int
型別的整數串列:
from typing import List
numbers: List[int] = [1, 2, 3, 4, 5]
在 Python 3.9 之後,也可以使用內建的 list
來取代 List
:
numbers: list[int] = [1, 2, 3, 4, 5]
Dict
型別的使用
對於字典(dictionary)也可以加上型別註解。以下範例中,鍵是 str
,值是 int
:
from typing import Dict
inventory: Dict[str, int] = {"apple": 10, "banana": 5}
Union
的應用
當參數可能是多種型別時,可以使用 Union
。以下例子表示引數可能是 str
或 int
:
from typing import Union
def process(value: Union[int, str]) -> None:
if isinstance(value, int):
print(f"Integer: {value}")
else:
print(f"String: {value}")
像這樣利用 typing
模組,可以更靈活且直觀地描述型別。
4. 進階型別註解的使用範例
型別註解也支援更複雜的資料結構與函式設計。以下將介紹多個回傳值與自定義型別的實作方式。
多個回傳值的型別指定
若函式會回傳多個值,可以使用 tuple
來指定其回傳型別:
def get_coordinates() -> tuple[float, float]:
return 35.6895, 139.6917
這樣可以讓回傳值的型別一目了然,提升可讀性。
定義自訂型別
使用 NewType
可建立自訂型別。以下範例定義了一個名為 UserId
的新型別:
from typing import NewType
UserId = NewType('UserId', int)
def get_user(user_id: UserId) -> str:
return f"User ID is {user_id}"
透過定義自訂型別,可以讓程式邏輯更清晰,意圖也更容易被理解。
5. 型別檢查工具的使用方法
除了撰寫型別註解之外,若能結合靜態型別檢查工具,將能撰寫出更穩健的程式碼。常見的工具包括 mypy
和 Pylance
。
mypy
的安裝與使用方式
mypy
是一款型別檢查工具,會根據 Python 程式碼中的型別註解進行錯誤檢查。首先請先安裝它:
pip install mypy
接著執行型別檢查:
mypy script.py
執行後,若有型別不一致或問題,系統會即時顯示警告訊息。
使用 Pylance
進行即時型別檢查
VSCode 的擴充套件 Pylance
支援即時型別檢查。根據型別註解內容,編輯器會立即顯示錯誤提示,方便快速修正。
def add_numbers(a: int, b: int) -> str:
return a + b # 此處會顯示錯誤提示,提醒型別不符
由於能即時檢查錯誤,因此可提升開發速度,並減少錯誤發生的機率。
6. 在實際專案中使用型別註解
型別註解在實際專案中非常實用。本節會介紹在開發流程中的具體應用範例。
團隊開發中型別註解的重要性
在團隊合作或開放原始碼專案中,型別註解可以大幅提升溝通與理解效率。以下是從 API 取得資料並進行處理的範例:
from typing import Dict, Any
def fetch_data() -> Dict[str, Any]:
return {"status": 200, "data": {"user": "Alice", "age": 30}}
透過型別註解,可以清楚表達資料的結構,讓其他開發者快速掌握程式的目的。
使用型別註解進行資料驗證
型別註解也有助於資料驗證。以下函式會檢查串列中的所有元素是否皆為字串:
from typing import List
def validate_strings(values: List[str]) -> bool:
return all(isinstance(v, str) for v in values)
使用型別註解能提升程式的正確性,有效避免錯誤發生。
型別註解在重構時的便利性
在進行程式重構(refactoring)時,型別註解能作為防止錯誤的重要依據。特別是參數或回傳值較多的函式,更容易出錯。
以下是範例程式碼:
def process_data(data: dict) -> None:
# 處理內容
pass
若資料結構變得複雜,或可能包含不同型別,就容易在重構時產生問題。若使用型別註解明確指定資料內容,如下所示:
from typing import Dict, Union
def process_data(data: Dict[str, Union[str, int]]) -> None:
# 處理內容
pass
這樣一來,即使重構,也能透過型別檢查工具(例如 mypy
)偵測錯誤,防止潛在 bug 發生。

7. 總結
Python 的型別註解在大型專案或團隊開發中,是提升可讀性與維護性的強大工具。透過型別註解不僅能預防錯誤,還能提升程式碼品質。此外,配合 mypy
或 Pylance
等靜態型別檢查工具,更能在開發過程中即早發現錯誤並快速修正。
型別註解特別有以下優點:
- 提升程式的可讀性,讓其他開發者更快理解邏輯。
- 重構更安全,能在不破壞功能的情況下優化程式。
- 結合靜態型別檢查工具,可提早發現錯誤並提升開發效率。
未來在開發 Python 專案時,建議積極導入型別註解,打造更穩固、易於維護的程式碼。