[英]Functions decorator safety in python
該代碼如何工作? 它來自梯度的“數據科學,從零開始”的第8章。 為什么我需要在另一個函數中包裝一個函數? 有沒有更可讀的方法來實現這種執行處理? 這是它的解釋。
某些步長可能會導致我們的功能輸入無效。 因此,我們需要創建一個“安全應用”函數,以對無效輸入返回無窮大(永遠不應為最小):
def safe(f):
"""return a new function that's the same as f,
except that it outputs infinity whenever f produces an error"""
def safe_f(*args, **kwargs):
try:
return f(*args, **kwargs)
except:
return float('inf')
return safe_f
您缺少函數調用:
可以說我定義了一個平均函數,如下所示:
def naive_average(lst):
return float(sum(lst))/len(lst)
如果lst
為空會怎樣? 還是包含非數字內容? BOOM,例外!
使用您提到的裝飾器,該函數將如下所示
@safe
def naive_average(lst):
return float(sum(lst))/len(lst)
現在,在空的lst
上調用它會返回float('inf')
而不是異常
可以說我們有一個瑣碎的函數,像這樣:
def myfunc(n):
return 42/n
我們這樣做:
print(myfunc(0))
我們得到這個:
Traceback (most recent call last):
File "gash.py", line 14, in <module>
print(myfunc(0))
File "gash.py", line 12, in myfunc
return 42/n
ZeroDivisionError: division by zero
現在我們這樣做:
myfunc = safe(myfunc)
print(myfunc(0))
我們得到這個:
inf
第二次我們調用safe()
,它返回帶有嵌入式異常處理的新函數。 我們替換了名稱 “ myfunc”所指的內容,現在它指的是返回的函數。 原來的myfunc
不會丟失,它在新的myfunc
中被稱為f
。
@safe
裝飾器實際上與myfunc = safe(myfunc)
做相同的事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.