專項練習 · 9 分鐘閱讀

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"))

提示不會轉換值

你的練習清單

常見問題

型別提示會讓 Python 更快嗎?

本身不會。它們是給工具使用的元資料,解釋器不會強制執行。

每個變數都要加註解嗎?

通常不用。註解函式邊界,以及從名稱和賦值看不出型別的值。

舊版 Python 怎麼表示 list[int]?

Python 3.8 及更早版本使用 typing.List[int]。現代 Python 支援內建泛型。

練習型別提示

12 道題,覆蓋註解、list[int]、可選回傳值和執行時行為。

打開練習

繼續閱讀: