初探 Python 中的 typing 模組 - 強化型別提示與依賴注入

Posted by Andylinee on Monday, August 7, 2023

Python 作為一種動態語言,優雅簡潔的語法使得開發者可以快速地撰寫程式碼。然而,在大型專案或團隊合作中,強化程式碼的可讀性、可維護性和錯誤檢測是至關重要的。Python 的 typing 模組在這方面扮演了重要的角色,它允許我們為 Python 程式碼添加靜態型別提示(Type Hints),讓 IDE 和靜態類型檢查工具能更容易協助開發者發現錯誤和改進程式碼。

什麼是 typing 模組?

typing 模組是 Python 3.5 以後加入的內建模組,它提供了一組用於指定變數、函式回傳值、函式參數等型別提示的工具。儘管 Python 依然是動態型別的語言,typing 模組能夠為我們的程式碼帶來更豐富的型別資訊,讓開發者在撰寫程式碼時更容易瞭解資料的形式與用途。

使用 Type Hints 增強型別提示

在 Python 中,型別提示是指在變數、函式參數和回傳值等地方添加型別資訊,以便在開發過程中更容易理解程式碼的意圖。typing 模組中的 Type Hints 提供了各種內建型別(如 intstrlist 等)以及用於創建自定義型別的工具。以下是一些 Type Hints 的常見用法和案例:

基本型別提示

from typing import List

def get_square_root(number: float) -> float:
    return number ** 0.5

# Usage
numbers_list: List[int] = [1, 4, 9, 16]

result = get_square_root(25)
print(result)  # Output:5.0

在這個例子中,我們使用 floatList[int] 等 Type Hints 指定了函式參數和變數的型別,讓開發者知道這些資料的類型,提高程式碼的可讀性。

使用 TypeVar 創建泛型型別

from typing import TypeVar, List

T = TypeVar('T')

def find_item(items: List[T], target: T) -> int:
    return items.index(target)

# Usage
fruits = ['apple', 'banana', 'orange']

index = find_item(fruits, 'banana')
print(index)  # Output:1

index = find_item(fruits, 'orange')
print(index)  # Output:2

在這個例子中,我們使用 TypeVar 創建了一個泛型型別 T,它可以代表任意型別。在函式 find_item() 中,我們使用了 T 作為 List 的元素型別和 target 的型別,這樣就能夠同時支援不同型別的列表和目標值。

使用 Depends 實現依賴注入

除了增強型別提示,typing 模組還提供了 Annotated 類型用於實現依賴注入(Dependency Injection),這在 Web 框架中非常有用,特別是在 FastAPI 等框架中。

from typing import Annotated
from fastapi import Depends

T = Annotated[int, Depends(lambda: 42)]

def example_function(input_value: T) -> T:
    return input_value

# Usage
result1 = example_function(10)
print(result1)  # Output: 10

result2 = example_function()
print(result2)  # Output:42

在這個例子中,我們使用 DependsAnnotated 來實現依賴注入。在 FastAPI 中,Depends 用於注入依賴項,Annotated 用於指定型別並提供相關的依賴。在函式 example_function() 中,我們使用 T 作為參數的型別提示,同時指定了一個依賴函式 lambda: 42,如果沒有傳入參數,則使用默認值 42

結論

typing 模組是 Python 中一個強大的工具,它讓開發者能夠增強型別提示,提高程式碼的可讀性和可維護性。通過使用 Type Hints,開發者可以清晰地指定變數、函式參數和回傳值的型別,讓開發過程更加順暢。同時,typing 模組中的 AnnotatedDepends 等特性也讓開發者更容易在 Web 開發中實現依賴注入。希望本文能幫助讀者更好地理解 typing 模組的用法,提升 Python 程式碼的品質和效率。


《DTW 數位科技週報》

如果想要每週獲得最新的數位科技、區塊鏈及人工智慧新聞整理,歡迎訂閱免費電子報:《DTW 數位科技週報》