簡體   English   中英

Python中的函數裝飾器安全性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM