Python Decorator - 這邊幫你做一個重試的動作, Make a retry for your test steps

Wis
Drunk-House :”P
Published in
5 min readNov 14, 2019

前言

Python Decorator,譯為修飾器或裝飾器,是一個 Python 特有的語法與進階應用,可以讓你的程式碼變得更簡潔,也可以很容易的重複使用。在 Python 開發的過程中你也會常常需要它來讓你的程式更簡單。

那麼,簡單的介紹一下 Decorator 的邏輯,以悲傷的柴犬為例:
如果圖片只有一隻悲傷的柴犬:

你可能會覺得,柴犬是心情鬱卒,或是今天星期一 ?! 不太開心=_=
在不同的視角下,會有著不同的解讀。

那麼,我們可以在不改變原始圖片的情況下,我們將原圖 (Function) 加上文字 (Decorator) 之後,產生了新的結果。

修飾器強化了作者想表達的其實是 --- "一隻吃不到肉肉而難受的阿柴 ❤ "

一隻吃不到肉肉而難受的阿柴 ❤ 天天

實作

Python 程式開發的過程中,常常會需要 retry 各種不同的 step,來確保產品功能的運作正常 。(Ex: Network connection、Apply Settings...)

但又不想要在每個 step 內做各自的 retry,顯的程式很複雜,又雜亂。
這時候修飾器就會變得很方便。

原程式片段 :

step_1: 柴犬沒有肉肉的情況下,停1秒之後繼續等待肉肉的出現,若有肉肉吃就叫一聲 WoW~。

step_2: 柴犬如果沒晚餐,停1秒之後繼續等待晚餐出現,若有肉肉就很開心的搖尾巴。

使用修飾器改寫這兩個步驟:

Output:

step_1(meat=None)的情況下,輸出結果為:Retry [function: step_1], Shiba Inu no any meat
Retry [function: step_1], Shiba Inu no any meat
Retry [function: step_1], Shiba Inu no any meat
Traceback (most recent call last):
File ".\sample_code.py", line 39, in <module>
step_1(None)
File ".\sample_code.py", line 17, in warp_func
raise Exception("Retry timeout")
Exception: Retry timeout
-------------------------------------------------step_1(meat=1), step_2(dinner=None)的情況下,輸出結果為:
Shiba Inu get meat WoW~
Retry [function: step_2], Shiba Inu no dinner to eat
Retry [function: step_2], Shiba Inu no dinner to eat
Retry [function: step_2], Shiba Inu no dinner to eat
Traceback (most recent call last):
File ".\sample_code.py", line 40, in <module>
step_2(dinner=None)
File ".\sample_code.py", line 17, in warp_func
raise Exception("Retry timeout")
Exception: Retry timeout

將 retry 的部分抽出來寫進 decorator,function step_1()、step_2() 的邏輯改變成,若參數為 None or False 直接拋出例外,再經由 decorator 的裝飾,將ValueError 這個例外接起來後 retry。

邏輯上可以達到一樣的結果。省掉了 for loop 重複的部分,也使得 retry 的功能可以被更多的 function 直接裝飾應用,484 很方便呢~

參考資料的連結裡還有更多 decorator 的範例。

--

--

Wis
Drunk-House :”P

The life of Software Engineer. 陽光、空氣、啤酒🍻、水,咖啡☕️、柯基 & 柴犬 🐕。