在Python的typing模組中,NewType用來創建新的類型,其實是一個現有類型的變體。這對於型別檢查(Type Checking)非常有用,能夠幫助我們更清楚地理解我們的代碼和預期的行為。
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(2)
def get_username(user_id: UserId) -> str:
"""get username by id"""
user_id_name_dict: dict[UserId, str] = {
UserId(1): 'Alice',
UserId(2): 'Bob',
UserId(3): 'Carol',
}
return user_id_name_dict[user_id]
print(get_username(some_id)) # Bob
print(get_username(UserId(1))) # Alice
但,看到這裡你一定會想
我之前直接給值也是可以用啊(我以前都直接用變數)
那為什麼要用 NewType 呢
UserId = int
的確可以,但微小的差別就在類型檢查上
直接給值並沒有創建一個新的類型,只是給已存在的int類型起了另一個名字。在類型檢查期間,UserId和int是完全可互換的。如果一個函數期望一個UserId作為參數,你可以給它一個int;反過來也是一樣。
反觀使用 NewType
是創建了一個全新的類型UserId,這個類型在運行時仍然是一個int,但在靜態類型檢查期間,它被視為一種獨立的類型。所以如果一個函數期望一個UserId作為參數,你不能給它一個普通的int,需要首先將這個int轉換為UserId。
所以,使用NewType提供了更嚴格的類型檢查,有助於捕捉可能的錯誤。而直接使用賦值的方式(UserId = int)則沒有這種嚴格的檢查,任何期望UserId的地方都可以接受一個int。
至於要怎麼使用,還是看你想要的使用場景
我自己會多用 NewType 因為我希望如果是直接給值可以顯示錯誤讓我知道!