2016-12-05 64 views
0

我是一名Python初學者,在聲明裝飾器時遇到了這個問題。我不知道該怎麼稱呼這個特定場景,所以我無法有效地谷歌它。包裝函數爲什麼調用自己而不是傳遞給裝飾器函數的original_function?

的情況是,我宣佈2個裝飾功能,decorating_function1decorating_function2,並將它們添加到我的命名original_function功能。當我執行original_function時,它進入了無限遞歸。調試後,我發現decorating_function2的包裝函數正在調用它自己,而不是傳遞給decorating_function2的original_function。此外,當我直接在Python解釋器上試用此代碼時,它運行時沒有任何問題。 (我無法在翻譯中複製這個場景)

所以,我的問題是,是否有一個特定的情況可能導致這種行爲?

我正在嘗試做的代碼片段。下面的代碼運行正確:

def decorating_function1(original_function): 
    print(original_function.__name__) 
    def wrapper(*vargs,**kwargs): 
    print('inside wrapper of df1') 
    return original_function(*vargs,**kwargs) 
    return wrapper 

def decorating_function2(original_function): 
    print(original_function.__name__) 
    def wrapper(*vargs,**kwargs): 
    print('inside wrapper of df2') 
    return original_function(*vargs,**kwargs) 
    return wrapper 

@decorating_function2 
@decorating_function1 
def original_function(name,age): 
    print("Name of the person is %s and his age is %d" % (name,age)) 

回答

0

您的代碼對我來說很好,所以我會在這裏解決關於調用順序的問題。

您可能已經聽說「堆疊」裝飾器被稱爲「自下而上」。這是什麼意思?

當你的電話original_function,然後decorating_function1被調用的函數作爲參數。現在,這返回wrapper。然後,在完成之後,您有decorating_function2「堆疊」在decorating_function1之上。因此,decorating_function2被調用的參數爲wrapper。然後,這執行...所以wrapper裏面的decorating_function2被執行,然後調用decorating_function1的包裝,然後調用original_function

所以,它看起來像這樣:

original_function(如original_function(年齡,姓名))

我)decorating_function1 - >返回 「包裝」

II)decorating_function2(包裝) - >返回「包裝」

包裝器ⅱ)執行該調用我)的包裝物,因此,I) 被執行,且該呼叫original_function

如果您要添加額外的位在你的包裝original_function.__name__之前「decorating_function1/2」,你會看到:

Decorating function1 original_function 
Decorating function2 wrapper 
inside wrapper of df2 
inside wrapper of df1 
Name of the person is (a name) and his age is (a age) 
+0

謝謝,我得到了函數調用順序。我想知道的是,decorating_function2的包裝器什麼時候可以調用它自己,而不是傳遞給decorating_function2的original_function。重新編寫代碼片段後,我無法再現該場景。 – sidmishraw

+0

很難回答,沒有看到你以前的代碼。 – Pythonista

相關問題