【问题标题】:python decorator and wrapper function debugpython装饰器和包装器函数调试
【发布时间】:2018-03-07 04:11:11
【问题描述】:

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

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!

【问题讨论】:

    标签: python decorator wrapper python-decorators


    【解决方案1】:

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

    pythohn -i example.py
    

    我明白了:

    wrapper is executed before display
    >>> 
    

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

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

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

    【讨论】:

    • 更准确地说,“包装器被执行”是在定义display时打印的(也就是decorator_function实际执行的时候)。
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2018-10-03
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多