簡體   English   中英

為什么要在裝飾器中定義一個函數?

[英]Why define a function inside a decorator?

為什么在裝飾器中定義一個新函數作為下面的包裝函數是一種做法:

def not_during_the_night(func):
    def wrapper():
        if 7 <= datetime.now().hour < 22:
            return func
        else:
            pass  # Hush, the neighbours are asleep
    return wrapper

而不是只是做類似的事情?:

def not_during_the_night(func):
    if 7 <= datetime.now().hour < 22:
        return func
     else:
        pass  # Hush, the neighbours are asleep

最后的結果不一樣嗎? 另外,如果我們需要添加一些功能,我們也可以這樣做,所以我真的不明白為什么裝飾器是這樣寫的,但必須有一個很好的理由。 :)

編輯:我不小心在第一個案例中留下了括號,問題應該是這樣的

裝飾器的想法是返回一個您可以根據需要調用的函數,並根據裝飾器的目的增強功能。

您建議的將在使用中失敗。 首先,如果我在晚上實例化這個,你的提議將返回None ,我的調用程序會崩潰,即使我在中午調用該函數。

更一般地說,您的提議根據實例化時間凍結功能,而不是我的用例調用函數的時間。

它不會是相同的結果,在第一個帶有包裝器的示例中,每次調用裝飾函數時都會檢查時間條件。 在第二個示例中,在您將裝飾器應用於函數時,將只檢查一次時間條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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