2016-12-05 72 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