了解装饰者的行为

时间:2018-01-17 13:49:43

标签: python python-3.x decorator

我想了解此代码中的装饰器行为

abc.py

def my_decorator_module(some_function):
    def wrapper():
        num = 10
        if num == 10:
            print('yess')
        else:
            print('no')

        some_function()

        print('print after some_function() called')

    return wrapper()

并将此函数称为装饰器

x.py

from abc import my_decorator_module

@my_decorator_module
def just_some_function():
    print("Wheee!")

输出

yess
Wheee!
print after some_function() called

当我执行x.py文件返回输出时,我没有在x.py文件中调用just_some_function(),为什么?

2 个答案:

答案 0 :(得分:3)

因为您在从外部装饰功能返回之前调用了wrapper。别这么做。

return wrapper   # not wrapper()

tutorial you're following之前已经引入了返回函数的概念,而不是调用它们并返回它们的结果;这就是你需要在这里做的事情。

答案 1 :(得分:2)

你没有明确地称呼just_some_function(),而是你的"装饰者"确实,比较最后一行:

def my_decorator_module(some_function):
    def wrapper():
        num = 10
        if num == 10:
            print('yess')
        else:
            print('no')

        some_function()

        print('print after some_function() called')

    # here !!!   
    return wrapper()

这实际上是一个错误的实现 - 你的装饰者不应该返回调用wrapper的结果,而是返回wrapper函数本身:

    return wrapper

如果您不明白原因:@decorator语法只是语法糖,所以:

@decorator
def somefunc():
    print("somefunc")

实际上只是一个捷径:

def somefunc():
    print("somefunc")

somefunc = decorator(somefunc)

所以你的装饰者必须返回一个函数对象(或任何可调用的FWIW),通常 - 但不一定 - 一些包装器将负责调用装饰函数(最好返回结果)。