python decorator和包装函数调试

时间:2017-09-26 04:41:28

标签: python decorator wrapper python-decorators

我通过试验实例来研究装饰器和包装器,我发现装饰器的行为是我无法理解的。

def decorator_function(original_function):
    def wrapper_function():
        print "wrapper is executed before {}".format(original_function.__name__)
        return original_function() # Try it without ()
    return wrapper_function

@decorator_function 
def display():
    print("display function ran!")

当我运行以上功能时:

In [59]: display()
wrapper is executed before display
display function ran!

然而,当我将打印功能移到包装器外面时,似乎包装器根本不会运行。 (可能是它跑了,但我没有看到证据。)

def decorator_function(original_function):
    def wrapper_function():
        #print "wrapper is executed before {}".format(original_function.__name__)
        return original_function() # Try it without ()
    print "wrapper is executed before {}".format(original_function.__name__)    
    return wrapper_function

@decorator_function 
def display():
    print("display function ran!")

然后我没有看到"包裹物在......之前执行..."了。怎么会? 我在这里缺少什么?

In [63]: display()
display function ran!

1 个答案:

答案 0 :(得分:1)

装饰器在代码加载时执行,而包装器在代码运行时执行。如果我将您的第二个示例转储到文件example.py中并按此运行:

pythohn -i example.py

我明白了:

wrapper is executed before display
>>> 

那是装饰者正在运行。现在,如果我调用display(),我会看到该函数的输出:

>>> display()
display function ran!
>>> 

我在这里看不到装饰器的输出,因为它已经运行