不try一下怎麼知道行不行?Python提倡最瀟灑的防禦性程式碼風格 : EAFP

閱讀時間約 4 分鐘
對於處理主要業務邏輯的程式碼來說,判斷錯誤、處理異常的程式碼屬於"防禦性程式碼"。而EAFP、LBYL是兩種截然不同的防禦型程式碼撰寫風格。
raw-image


EAFP的全名是Easier to Ask for Forgiveness than Permission,是 Python 提倡的防禦型程式碼風格,鼓勵工程師直接編寫主要業務邏輯,不需要在執行主要邏輯前多做異常及錯誤的檢查,真的發生再處理就好。

EAFP風格的防禦性程式碼

user = {"name": "馬斯克"}

try:
send_email(user["email"])
send_sms(user["mobile"])

except KeyError:
print("Key is not exist"

從這段 Python 程式碼可以看到,我們在存取 user 字典前,不事先使用if判斷要存取的 key 是否存在於字典中,直接執行主要業務邏輯(send_email、send_sms),將所有key相關的錯誤丟到 except 區塊統一處理。


我們再來看看另一種防禦性程式碼風格: LBYL(Look Before You Leap),這種風格的程式碼要求工程師在撰寫主要業務邏輯之前,必須想清楚可能的錯誤並預先排除。

LBYL風格的防禦性程式碼

user = {"name": "馬斯克"}

if user.get("email"):
send_email(user["email"])
else:
print("Key is not exist: email")

if user.get("mobile"):
send_sms(user["mobile"])
else:
print("Key is not exist: mobile")

LBYL 的程式碼風格則是與上面這段程式碼類似,先用 if 確定 key 確實存在 user 字典裡,才取出需要的 user 資料執行主要業務邏輯(send_email、send_sms)。


兩種風格的比較

程式碼可讀性 : EAFP優於LBYL

EAFP 風格的程式碼主要業務邏輯與防禦型程式碼分離,程式碼清晰、可讀性較佳,工程師較容易專注處理主要業務邏輯。

程式碼執行效率 : EAFP等於LBYL

EAFP 風格的程式碼在異常狀況發生時,try/except 相關的 call stack 處理是比 if 慢的,但是只有發生異常時要處理。

相反的 LBYL 不管有沒有發生異常,都要花費固定成本執行 if 一次。因此在效率上可以說是不相上下。

多進程/多線程場景 : EAFP優於LBYL

if user.get("email"): 
# 假如發生 context switch, user的email被其他process刪除
send_email(user["email"])
else:
print("Key is not exist: email")

如果程式碼是運行在 Multi-process 或是 Multi-thread 等非同步場景之下,極有可能在if 敘述執行後發生 Context Switch,這個狀況下通過前一行 if 敘述的檢查並無法保證接下來一定可以存取到對應的資料。

這種狀況下 LBYL 風格的if檢查敘述必須搭配鎖相關的原子操作的機制才能發揮原本的檢查效果,而 EAFP 的 try/except 本身就已經涵蓋了這種狀況。


結論

Python 作為動態型別的程式語言,配合其完善的異常處理系統,強烈鼓勵開發者採用 EAFP風格編寫防禦性程式碼。

此外,在涉及多進程或多線程的應用場景中,採用 EAFP 風格的防禦性程式碼不僅提升了程式碼的可讀性,還能有效應對非同步操作中可能出現的問題,帶來實質的效益。

avatar-img
66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
再寫5分鐘 的其他內容
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
不要以為你的離去會掀起波濤大浪 也許即便滅團了 公司還是會好好的營運下去 職場裡若有非誰不可 那肯定是家不健康的公司
Thumbnail
我們好像這一生都在找尋活著的意義,沒有賺大錢就是不夠努力嗎?每件事都為了一個無形的「意義」翻來覆去,活到現在覺得每天都在生存與逃跑之間拉扯,有時候會想:「難道人生就是要我們來經歷這些而已嗎?」 雖然生活過得亂七八糟,但心裡其實一直都有想做的事……。 家還在,只是我們長大了 《有生之年》(英語
Thumbnail
回到源頭,我想還是你說的,我們都得問自己,真的對每一天都感到快樂嗎?因為那才是更重要且貼身的提問。因為有這樣的快樂,我對抉擇不抱怨,願意承擔抉擇帶來的後果,能夠自我提供滿足和肯定。有天,覺得夠了,也可以瀟灑離去,不用被夢想牢牢綑綁。
Thumbnail
說到干邑白蘭地的調酒,Sidecar絕對是我第一個會想到的調酒,成份非常簡單只運用到干邑白蘭地、柑橘利口酒以及新鮮的檸檬汁,利用搖盪的方式呈現酒體裡明顯的柑橘香氣。雖然成分看起來非常簡單,調酒師的技巧將在這一杯酒展現的一覽無遺,換句話說這其實是一杯相對困難的經典調酒。
Thumbnail
「一見你就有好心情 不用暖身就會開心...」輕快爽朗、有朝氣的嗓音,Coco李玟的歌曲,相信陪伴不少少男少女走過青春年華,然而,5號晚間,卻傳出她於7月2日在家中輕生,送院後一直昏迷,最後離世的消息,相信讓不少人相當譁然震驚。 想追求心靈成長、有沒有哪些書適合閱讀的? 今天這篇文章要來和大家分享
Thumbnail
前陣子有幸做了一次工作經驗分享,談話中我告訴大家不要成為民眾的情緒垃圾桶,遇到無解的事情一笑置之即可。 我認為這些年的訓練,已經可以讓我面對民眾時處變不驚、不合理的事情都能夠坦然面對。 但這幾天我忽然發現,自己其實並不如想像的那麼瀟灑。
Thumbnail
年輕人,總要有點理想,總要有點抱負,總要有點想做的事情,要做就盡量去做吧!
Thumbnail
對於虬髯客放棄逐鹿中原,人們普遍理解為此乃作者「君權神授」迷信思維的傳遞,但我認為這篇文章能夠傳誦千古,其實在於虬髯面對勢不可擋的失敗時,所展現出來的英雄姿態。
Thumbnail
判刑前一日, 在荔枝角收押所探望阿龍。他拿起聽筒就滔滔不絕,「不用擔心,我不會坐太久的,應該一年多吧!」還高興地說,「在這裏,很多人喜歡我的畫,畫到不想畫了。」 翌日,李威龍被判監3年2個月。 「我不是為了社會做的」 「有什麼心理準備嗎?」網友續問。 「沒有,沒準備就是最好的準備。」他笑著說。
Thumbnail
進入園區須購買入園券(不分平假日) 一旁還有名信片的蓋章處,喜歡蓋旅遊戳章的,一定不能錯過。 來自森林的祝福 希望你(妳)更好 薰衣草森林腹地滿大的,在這附上新社薰衣草森林地圖,讓大家有一點點概念,延途路上都有指標指引方向,大家不用怕會走失。 可愛的熊熊配著當季花草造景
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
不要以為你的離去會掀起波濤大浪 也許即便滅團了 公司還是會好好的營運下去 職場裡若有非誰不可 那肯定是家不健康的公司
Thumbnail
我們好像這一生都在找尋活著的意義,沒有賺大錢就是不夠努力嗎?每件事都為了一個無形的「意義」翻來覆去,活到現在覺得每天都在生存與逃跑之間拉扯,有時候會想:「難道人生就是要我們來經歷這些而已嗎?」 雖然生活過得亂七八糟,但心裡其實一直都有想做的事……。 家還在,只是我們長大了 《有生之年》(英語
Thumbnail
回到源頭,我想還是你說的,我們都得問自己,真的對每一天都感到快樂嗎?因為那才是更重要且貼身的提問。因為有這樣的快樂,我對抉擇不抱怨,願意承擔抉擇帶來的後果,能夠自我提供滿足和肯定。有天,覺得夠了,也可以瀟灑離去,不用被夢想牢牢綑綁。
Thumbnail
說到干邑白蘭地的調酒,Sidecar絕對是我第一個會想到的調酒,成份非常簡單只運用到干邑白蘭地、柑橘利口酒以及新鮮的檸檬汁,利用搖盪的方式呈現酒體裡明顯的柑橘香氣。雖然成分看起來非常簡單,調酒師的技巧將在這一杯酒展現的一覽無遺,換句話說這其實是一杯相對困難的經典調酒。
Thumbnail
「一見你就有好心情 不用暖身就會開心...」輕快爽朗、有朝氣的嗓音,Coco李玟的歌曲,相信陪伴不少少男少女走過青春年華,然而,5號晚間,卻傳出她於7月2日在家中輕生,送院後一直昏迷,最後離世的消息,相信讓不少人相當譁然震驚。 想追求心靈成長、有沒有哪些書適合閱讀的? 今天這篇文章要來和大家分享
Thumbnail
前陣子有幸做了一次工作經驗分享,談話中我告訴大家不要成為民眾的情緒垃圾桶,遇到無解的事情一笑置之即可。 我認為這些年的訓練,已經可以讓我面對民眾時處變不驚、不合理的事情都能夠坦然面對。 但這幾天我忽然發現,自己其實並不如想像的那麼瀟灑。
Thumbnail
年輕人,總要有點理想,總要有點抱負,總要有點想做的事情,要做就盡量去做吧!
Thumbnail
對於虬髯客放棄逐鹿中原,人們普遍理解為此乃作者「君權神授」迷信思維的傳遞,但我認為這篇文章能夠傳誦千古,其實在於虬髯面對勢不可擋的失敗時,所展現出來的英雄姿態。
Thumbnail
判刑前一日, 在荔枝角收押所探望阿龍。他拿起聽筒就滔滔不絕,「不用擔心,我不會坐太久的,應該一年多吧!」還高興地說,「在這裏,很多人喜歡我的畫,畫到不想畫了。」 翌日,李威龍被判監3年2個月。 「我不是為了社會做的」 「有什麼心理準備嗎?」網友續問。 「沒有,沒準備就是最好的準備。」他笑著說。
Thumbnail
進入園區須購買入園券(不分平假日) 一旁還有名信片的蓋章處,喜歡蓋旅遊戳章的,一定不能錯過。 來自森林的祝福 希望你(妳)更好 薰衣草森林腹地滿大的,在這附上新社薰衣草森林地圖,讓大家有一點點概念,延途路上都有指標指引方向,大家不用怕會走失。 可愛的熊熊配著當季花草造景