不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 風格的防禦性程式碼不僅提升了程式碼的可讀性,還能有效應對非同步操作中可能出現的問題,帶來實質的效益。

27會員
16內容數
區塊鏈著名的三角悖論 : 去中心化、可擴展性、安全性三者無法兼得。 這種顧此失彼的困境像極了人生。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
公司反常ㄕˋ(1)- 離開的最瀟灑 留下的最大不要以為你的離去會掀起波濤大浪 也許即便滅團了 公司還是會好好的營運下去 職場裡若有非誰不可 那肯定是家不健康的公司
Thumbnail
avatar
dkdk12358
2024-05-08
【影評】Netflix《有生之年》四十一歲一事無成的瀟灑人生:你一定有什麼事情 是想要做但是還沒有做的我們好像這一生都在找尋活著的意義,沒有賺大錢就是不夠努力嗎?每件事都為了一個無形的「意義」翻來覆去,活到現在覺得每天都在生存與逃跑之間拉扯,有時候會想:「難道人生就是要我們來經歷這些而已嗎?」 雖然生活過得亂七八糟,但心裡其實一直都有想做的事……。 家還在,只是我們長大了 《有生之年》(英語
Thumbnail
avatar
YC Sky
2023-10-16
釀私信|詹傑 ✕ 李劭婕 #5「當一個老派又瀟灑的人」回到源頭,我想還是你說的,我們都得問自己,真的對每一天都感到快樂嗎?因為那才是更重要且貼身的提問。因為有這樣的快樂,我對抉擇不抱怨,願意承擔抉擇帶來的後果,能夠自我提供滿足和肯定。有天,覺得夠了,也可以瀟灑離去,不用被夢想牢牢綑綁。
Thumbnail
avatar
釀電影
2023-09-12
當年你瀟灑的離去,只留下你英俊的殘影:側車Sidecar(白蘭地調酒首選)說到干邑白蘭地的調酒,Sidecar絕對是我第一個會想到的調酒,成份非常簡單只運用到干邑白蘭地、柑橘利口酒以及新鮮的檸檬汁,利用搖盪的方式呈現酒體裡明顯的柑橘香氣。雖然成分看起來非常簡單,調酒師的技巧將在這一杯酒展現的一覽無遺,換句話說這其實是一杯相對困難的經典調酒。
Thumbnail
avatar
朵拉朵朵拉
2023-07-10
李玟瀟灑離世的啟示...現代人照顧情緒、心靈成長的『必讀書單』「一見你就有好心情 不用暖身就會開心...」輕快爽朗、有朝氣的嗓音,Coco李玟的歌曲,相信陪伴不少少男少女走過青春年華,然而,5號晚間,卻傳出她於7月2日在家中輕生,送院後一直昏迷,最後離世的消息,相信讓不少人相當譁然震驚。 想追求心靈成長、有沒有哪些書適合閱讀的? 今天這篇文章要來和大家分享
Thumbnail
avatar
柯幸宜 Emily Ko
2023-07-06
公務員日常不日常 Day108:曾經我以為的瀟灑前陣子有幸做了一次工作經驗分享,談話中我告訴大家不要成為民眾的情緒垃圾桶,遇到無解的事情一笑置之即可。 我認為這些年的訓練,已經可以讓我面對民眾時處變不驚、不合理的事情都能夠坦然面對。 但這幾天我忽然發現,自己其實並不如想像的那麼瀟灑。
Thumbnail
avatar
新葉
2023-03-27
【BOOK】管他的呢,我決定活的有趣:蔡瀾的瀟灑寫意人生/蔡瀾年輕人,總要有點理想,總要有點抱負,總要有點想做的事情,要做就盡量去做吧!
Thumbnail
avatar
Onday
2022-12-15
成為自己的英雄──虬髯客時不我予時的瀟灑姿態對於虬髯客放棄逐鹿中原,人們普遍理解為此乃作者「君權神授」迷信思維的傳遞,但我認為這篇文章能夠傳誦千古,其實在於虬髯面對勢不可擋的失敗時,所展現出來的英雄姿態。
Thumbnail
avatar
岱華
2022-08-04
【人物專訪】「傷心慾絕」的浪子 李威龍的塗鴉與瀟灑 判刑前一日, 在荔枝角收押所探望阿龍。他拿起聽筒就滔滔不絕,「不用擔心,我不會坐太久的,應該一年多吧!」還高興地說,「在這裏,很多人喜歡我的畫,畫到不想畫了。」 翌日,李威龍被判監3年2個月。 「我不是為了社會做的」 「有什麼心理準備嗎?」網友續問。 「沒有,沒準備就是最好的準備。」他笑著說。
Thumbnail
avatar
新屎坑 shitwillcometrue
2022-07-16
台中薰衣草森林(新社店)在薰衣草的山谷裡,沒有都市的喧囂,只有微風緩緩吹過肖木楠樹, 暖和的陽光灑落薰衣草田進入園區須購買入園券(不分平假日) 一旁還有名信片的蓋章處,喜歡蓋旅遊戳章的,一定不能錯過。 來自森林的祝福 希望你(妳)更好 薰衣草森林腹地滿大的,在這附上新社薰衣草森林地圖,讓大家有一點點概念,延途路上都有指標指引方向,大家不用怕會走失。 可愛的熊熊配著當季花草造景
Thumbnail
avatar
佐藤野
2022-01-09