1. 前言
由於其彈性與易用性,Python 深受許多開發者喜愛。作為一種動態型別語言,它最大的特色之一就是變數與函式參數不需要明確指定型別。然而,隨著專案規模擴大與團隊合作的普及,「型別標註」在提升程式碼可讀性與可維護性方面的重要性日益增加。本文將從基礎到進階,詳細說明 Python 中的型別標註,並介紹實用的應用方式。
2. 什麼是型別提示(Type Hint)?
自 Python 3.5 起,導入了名為「型別提示(Type Hints)」的功能。型別提示在程式執行時不會產生影響,但它能提供開發者、整合式開發環境(IDE)與靜態分析工具有關變數、函式參數與回傳值的預期型別資訊。透過這些提示,不僅能提升程式碼的可讀性,也有助於更早發現錯誤,並提高開發效率。
3. 基本的型別標註方式
對變數進行型別標註
當你想為變數指定型別時,可以在變數名稱後加上冒號(:)與型別名稱。這樣可以明確說明該變數應該屬於哪種資料型別。
age: int = 25
name: str = "Alice"
為函式的參數與回傳值指定型別
透過為函式的參數與回傳值指定型別,可以讓函式的使用方式更加清晰明確。
def add(x: int, y: int) -> int:
return x + y

4. 複雜資料結構的型別標註
List 與 Tuple
對於像是 List 或 Tuple 這樣的集合型別,也可以進行型別標註。可以透過 typing
模組來指定集合中元素的型別。
from typing import List, Tuple
numbers: List[int] = [1, 2, 3]
coordinates: Tuple[float, float] = (1.5, 2.3)
Optional 與 Union
如果參數允許為 None
,或需要接受多種型別,可以使用 Optional
或 Union
。
from typing import Optional, Union
def greet(name: Optional[str] = None) -> str:
if name:
return f"Hello, {name}!"
return "Hello, World!"
def process(value: Union[int, float]) -> float:
return float(value * 2)
5. 自訂類別的型別標註
對於使用者自訂的類別,也可以進行型別標註。這樣可以明確定義類別屬性與方法參數、回傳值的預期型別。
class Person:
def __init__(self, name: str, age: int):
self.name: str = name
self.age: int = age
def introduce(person: Person) -> str:
return f"{person.name} is {person.age} years old."
6. 善用型別檢查工具
若要有效活用型別提示,引入靜態分析工具是非常有幫助的。常見的工具有 mypy
與 Pyright
。
安裝與使用 mypy
mypy
是一款用來檢查 Python 程式碼中型別的靜態分析工具。可依下列步驟安裝並使用:
pip install mypy
安裝完成後,可使用下列指令來執行型別檢查:
mypy your_script.py
介紹 Pyright
Pyright
是由 Microsoft 開發的高速型別檢查工具,與 Visual Studio Code 整合性極佳。它能即時檢查型別,提升開發效率。
7. 型別標註的優點與注意事項
型別標註的好處
- 提升程式碼可讀性:明確的型別資訊讓程式的意圖更容易被理解。
- 提前發現錯誤:使用靜態分析工具能在執行前找出型別不一致的問題。
- 提升開發效率:支援型別的 IDE 可提供更準確的自動補全與提示功能。
使用型別標註時的注意事項
型別提示並非強制規範,過度使用反而可能讓程式碼變得冗長。特別是在撰寫簡短腳本或原型階段時,適度省略型別標註也有其必要。

8. 常見問題(Q&A)
Q1. 型別提示是必要的嗎?
不是,型別提示並非 Python 語法中的強制要求。但為了提升程式碼的可讀性與可維護性,在大型專案或多人協作時仍建議使用。
Q2. 使用型別提示會影響效能嗎?
不會。型別提示僅為靜態資訊,在執行時不會影響效能,Python 會忽略這些提示。
Q3. 型別提示與註解型別提示有何不同?
型別提示是直接在程式碼中為變數或函式加上型別資訊;而註解型別提示是使用註解的方式標示型別,常見於 Python 2 或不支援型別提示的情況下(如:list 中的元素)。
# 型別提示
age: int = 25
# 註解型別提示(用於 Python 2 等)
age = 25 # type: int
Q4. Python 的型別標註需要非常嚴格嗎?
Python 是動態型別語言,型別提示僅是「建議」而非強制限制。雖然可傳入不同型別的資料,但若使用靜態分析工具,就能在開發階段收到型別錯誤的警告。這種彈性讓團隊可依照需求調整型別標註的嚴謹程度。
Q5. 哪些情況下應該使用型別標註?
雖然不是必須,但在以下情況下特別有幫助:
- 大型專案:多人開發與後期維護時,有助於快速理解程式結構。
- 設計函式介面:明確定義參數與回傳值的型別,使函式更易於正確使用。
- 需要長期維護的程式:型別提示能協助追蹤修改影響範圍,降低出錯機率。
9. 型別標註的實戰範例
以下介紹一些實際使用型別提示的情境,幫助你了解其在開發中的實用性。
資料處理的應用場景
當你在撰寫處理資料的函式時,輸入資料通常是 list、dict 或是更複雜的結構。使用型別標註可以準確表達資料結構,若資料格式錯誤也能提早發現。
from typing import List, Dict
def process_data(data: List[Dict[str, float]]) -> float:
total = 0.0
for item in data:
total += item["value"]
return total
# 使用範例
data = [{"value": 10.5}, {"value": 20.3}, {"value": 30.0}]
print(process_data(data)) # 正確使用方式
在這個範例中,process_data
函式的參數 data
被標註為「由字串鍵與浮點數值組成的字典所構成的列表」,讓人一眼就能理解其資料結構。
類別設計的應用場景
型別提示在類別設計中也非常實用。為類別屬性加上型別提示,可清楚表達類別的結構,避免建立實例時傳入錯誤資料。
class Product:
def __init__(self, name: str, price: float, in_stock: bool):
self.name: str = name
self.price: float = price
self.in_stock: bool = in_stock
def update_stock(self, amount: int) -> None:
self.in_stock = amount > 0
在這個例子中,Product
類別的 name
、price
、in_stock
等屬性都明確指定了型別,也讓 update_stock
方法的參數型別一目了然。