Python 型別提示練習:讓註解幫助讀者
型別提示是溝通工具。它告訴讀者函式接收和回傳什麼,也給編輯器足夠的資訊,在錯誤進入執行時之前發出提醒。它不會把 Python 變成靜態型別語言。
給參數和回傳值加註解
冒號引出參數註解,箭頭引出回傳註解。簡單值直接使用內建型別。註解儲存在 __annotations__ 中,get_type_hints 等工具可以讀取。
def greet(name: str) -> str:
return f"Hello, {name}"
print(greet("Ada"))帶型別的函式
描述集合裡的內容
list[int] 表示列表裡裝的是整數;dict[str, float] 表示鍵是字串、值是浮點數。這些提示描述介面,不會檢查每個執行時值。傳入包含字串的列表仍然可以執行。
def total(values: list[int]) -> int:
return sum(values)
print(total([1, 2, 3]))帶型別的集合
把缺失值寫清楚
尋找可能回傳 None。用 float | None 這樣的聯合型別把這種可能寫進回傳型別。呼叫方就能在算術前檢查 None,編輯器也能指出遺漏的分支。
def find_price(prices: dict[str, float], item: str) -> float | None:
return prices.get(item)
print(find_price({"tea": 3.5}, "coffee"))可能不存在的值
需要時在執行時讀取註解
get_type_hints 會把註解解析成型別物件。這對小型示範和框架很有用。大多數應用程式碼不應根據註解分支;它們是文件和檢查工具,不是第二套型別系統。
from typing import get_type_hints
def double(n: int) -> int:
return n * 2
print(get_type_hints(double))註解本身也是資料
期待文件作用,而不是強制檢查
在標註為 int 的位置傳入字串,並不會自動拋出 TypeError。函式會繼續執行,直到某個操作失敗。需要靜態強制時,在 CI 中使用 linter 或型別檢查器;不可信輸入仍需執行時驗證。
def double(n: int) -> int:
return n * 2
print(double("a"))提示不會轉換值
你的練習清單
- 給公開函式的參數和回傳值加註解。
- 集合內容用 list[int] 和 dict[str, float]。
- 值可能缺失時,回傳型別包含 None。
- 不要指望型別提示驗證執行時輸入。
- 需要強制執行時,使用型別檢查器。
常見問題
型別提示會讓 Python 更快嗎?
本身不會。它們是給工具使用的元資料,解釋器不會強制執行。
每個變數都要加註解嗎?
通常不用。註解函式邊界,以及從名稱和賦值看不出型別的值。
舊版 Python 怎麼表示 list[int]?
Python 3.8 及更早版本使用 typing.List[int]。現代 Python 支援內建泛型。
練習型別提示
12 道題,覆蓋註解、list[int]、可選回傳值和執行時行為。
繼續閱讀: