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

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

在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 是一樣的,所以使用上不會顯示錯誤

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

反觀使用 NewType

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

抓的到錯哦!

抓的到錯哦!

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

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


對我來說 人生就是一個遊戲 活得開心,活得漂亮,活得成功,活得有意義 都是這場遊戲的一個個任務 我想要把這個遊戲打通關 在這裡我會分享一些我自己的經驗 把遊戲打通關的一些技巧 打通關的過程 和我自己發現的小 bug,或捷徑 遇到的喜怒哀樂 遇到的困難 遇到的挫折 歡迎大家一起來摸透和想受 這場人生遊戲
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
方法鏈接和流暢接口在許多現代編程語言和框架中都有使用。這兩個概念有時互相重疊,因為流暢接口通常使用方法鏈接來實現。使用這些技巧可以提高程式碼的可讀性和維護性,使得編碼更符合人類語言的結構。這對於在專案中協同工作的團隊尤為重要,因為它可以讓每個人更容易理解和使用代碼。
本文靈感來自:How to Document Your Code Like a Pro 以下範例程式均為 Python 推薦插件:better comment 前言 程式碼的有效文件化是編程最重要的部分之一 Python 提升可讀性有以下方式: 註釋 類型提示 文檔字串 這些實踐可以提高程式碼的可讀
在程式設計中,我們通常會遇到一個問題: 何時應該使用具有方法的類別,何時應該在模組中使用函式? 如果選擇不當,你的程式碼可能比需要的更複雜,這使得維護更困難 首先,我們需要更好地理解函式和類別的差異。 函式接收輸入參數,然後進行一些操作,並返回結果。你可以將這個結果傳遞給其他函式。在像Haskell
方法鏈接和流暢接口在許多現代編程語言和框架中都有使用。這兩個概念有時互相重疊,因為流暢接口通常使用方法鏈接來實現。使用這些技巧可以提高程式碼的可讀性和維護性,使得編碼更符合人類語言的結構。這對於在專案中協同工作的團隊尤為重要,因為它可以讓每個人更容易理解和使用代碼。
本文靈感來自:How to Document Your Code Like a Pro 以下範例程式均為 Python 推薦插件:better comment 前言 程式碼的有效文件化是編程最重要的部分之一 Python 提升可讀性有以下方式: 註釋 類型提示 文檔字串 這些實踐可以提高程式碼的可讀
在程式設計中,我們通常會遇到一個問題: 何時應該使用具有方法的類別,何時應該在模組中使用函式? 如果選擇不當,你的程式碼可能比需要的更複雜,這使得維護更困難 首先,我們需要更好地理解函式和類別的差異。 函式接收輸入參數,然後進行一些操作,並返回結果。你可以將這個結果傳遞給其他函式。在像Haskell
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
紀錄一下2020年以來做過的斜槓(不務正業)的工作有哪些,包含自創line貼圖、APP開發還有錄製podcast。比較慘的就是沒賺到啥錢,但也沒有什麼損失就是了。
Thumbnail
上一篇告訴我們除了轉職為PM之外,身為工程師的你其實還有其他可能性。 本邊主要在講,根據不同轉職原因,當你決定要轉職了,該如何更穩健的轉型成為PM,以減少陣亡的機率
Thumbnail
轉職是一件對自己影響很大的決定,這並不是一篇鼓勵轉職的文章,而是希望幫助有轉職念頭的工程師們能夠再多想清楚,多了解自己實際面臨的問題,有時候在面臨一些職涯問題的時候,可能只需調整努力的目標即可,等到想清楚了、確定真的有需要時再轉也不遲。
Thumbnail
首先我接受了一些企業的面談邀約,包含才式、紅樓與麗臺,本文會記錄我在這三間公司面試的過程。
Thumbnail
首先我接受了一些企業的邀約,包含禾向、博訊、弘一與鯨躍,本文會記錄我在這四間公司面試的過程。
從一開始的JavaScript,到後面HTML和CSS,雖之前有稍微碰過一點其他線上課程的內容,但AC系統性的教學,一個單元一個單元循序漸進的上課方式滿適合我的,有一種在打遊戲破關的感覺,非常享受。 已經報名學期二了,期望自己在學期二能夠維持學習進度,持續精進! 謝謝AC!
Thumbnail
如果有在接觸軟體開發產業,很常見的一個說法是非本科(資訊、工程背景)的工程師底子差,做出來的東西很糟糕之類的。然而,事實真的是這樣嗎?又或者說,我們能夠如何解決這樣的問題?
Thumbnail
關於Bezos的「API命令」,這可說是科技史中堪稱是教科書等級的一個大事件。雖然這當然不是新聞,會看科技媒體的應該都有瀏覽過,但我想以自己的角度也深入去思考一輪,輸出跟大家分享。這7點的翻譯本身不是重點,真正的重點是Bezos想"改造"Amazon體質的那些思維。
Thumbnail
欲望是很神奇的東西,很久以前我一直想要一個App可以網羅所有英日文字典,手指一點就能在同一個畫面跳查好幾家字典。我心想英文和程式語言都是語言,乾脆自己下海寫一個App看看。過程歷經千辛萬苦,還是讓我寫出來了。想知道我怎麼做到的嗎?
即將到職滿一周年,平時每幾個月就會記錄一下期間內做了什麼、學了什麼,算是給自己的總回顧...
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
紀錄一下2020年以來做過的斜槓(不務正業)的工作有哪些,包含自創line貼圖、APP開發還有錄製podcast。比較慘的就是沒賺到啥錢,但也沒有什麼損失就是了。
Thumbnail
上一篇告訴我們除了轉職為PM之外,身為工程師的你其實還有其他可能性。 本邊主要在講,根據不同轉職原因,當你決定要轉職了,該如何更穩健的轉型成為PM,以減少陣亡的機率
Thumbnail
轉職是一件對自己影響很大的決定,這並不是一篇鼓勵轉職的文章,而是希望幫助有轉職念頭的工程師們能夠再多想清楚,多了解自己實際面臨的問題,有時候在面臨一些職涯問題的時候,可能只需調整努力的目標即可,等到想清楚了、確定真的有需要時再轉也不遲。
Thumbnail
首先我接受了一些企業的面談邀約,包含才式、紅樓與麗臺,本文會記錄我在這三間公司面試的過程。
Thumbnail
首先我接受了一些企業的邀約,包含禾向、博訊、弘一與鯨躍,本文會記錄我在這四間公司面試的過程。
從一開始的JavaScript,到後面HTML和CSS,雖之前有稍微碰過一點其他線上課程的內容,但AC系統性的教學,一個單元一個單元循序漸進的上課方式滿適合我的,有一種在打遊戲破關的感覺,非常享受。 已經報名學期二了,期望自己在學期二能夠維持學習進度,持續精進! 謝謝AC!
Thumbnail
如果有在接觸軟體開發產業,很常見的一個說法是非本科(資訊、工程背景)的工程師底子差,做出來的東西很糟糕之類的。然而,事實真的是這樣嗎?又或者說,我們能夠如何解決這樣的問題?
Thumbnail
關於Bezos的「API命令」,這可說是科技史中堪稱是教科書等級的一個大事件。雖然這當然不是新聞,會看科技媒體的應該都有瀏覽過,但我想以自己的角度也深入去思考一輪,輸出跟大家分享。這7點的翻譯本身不是重點,真正的重點是Bezos想"改造"Amazon體質的那些思維。
Thumbnail
欲望是很神奇的東西,很久以前我一直想要一個App可以網羅所有英日文字典,手指一點就能在同一個畫面跳查好幾家字典。我心想英文和程式語言都是語言,乾脆自己下海寫一個App看看。過程歷經千辛萬苦,還是讓我寫出來了。想知道我怎麼做到的嗎?
即將到職滿一周年,平時每幾個月就會記錄一下期間內做了什麼、學了什麼,算是給自己的總回顧...