更新於 2023/08/05閱讀時間約 2 分鐘

軟體工程師筆記 | Python 怎麼自訂型別,開始用 NewType 吧!

在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;反過來也是一樣。

直接給值類型檢查會認為 int 和 UserId 是一樣的,所以使用上不會顯示錯誤

反觀使用 NewType

是創建了一個全新的類型UserId,這個類型在運行時仍然是一個int,但在靜態類型檢查期間,它被視為一種獨立的類型。所以如果一個函數期望一個UserId作為參數,你不能給它一個普通的int,需要首先將這個int轉換為UserId。

抓的到錯哦!

所以,使用NewType提供了更嚴格的類型檢查,有助於捕捉可能的錯誤。而直接使用賦值的方式(UserId = int)則沒有這種嚴格的檢查,任何期望UserId的地方都可以接受一個int。

至於要怎麼使用,還是看你想要的使用場景
我自己會多用 NewType 因為我希望如果是直接給值可以顯示錯誤讓我知道!


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.