在python decorator中修改的函数必须返回一个值

时间:2017-09-28 06:51:06

标签: python decorator

我试图理解装饰者的行为。 我知道装饰者必须返回一个对象,所以我可以理解下面的语法:

def my_deco(fonction):
    print("Deco is called with parameter the function {0}".format(fonction))
    return fonction

@my_deco
def hello():
    print("hello !")
Deco is called with parameter the function <function salut at 0x00BA5198>

这里装饰器做的不多,但是在我需要修改功能的情况下,我定义了这样的装饰器

def my_deco(fonction):
    def modified_func():
        print("Warning ! calling {0}".format(fonction))
        return fonction()
    return modified_func
@my_deco
def hello():
    print("Salut !")

通过modified_func修改初始函数行为。这很好

它包括对初始函数的调用。这很好

现在我不明白的是:为什么我们会返回函数的结果?在我的情况下,功能是一个简单的打印&#39;所以我不知道为什么要归还

感谢您的解释

1 个答案:

答案 0 :(得分:0)

正如评论中所述:通常在您编写装饰器时,您可以将其设置为可以与任何可能的功能一起使用。而这样做的方法是返回原始函数返回的任何内容,或者转换返回值(也可以在包装函数中完成)。

在Python中,实际上的所有函数都会返回一些东西。没有显式return语句的函数返回值None。因此,如果你的wrpper函数,在装饰器内,总是返回任何返回的装饰函数,它将是安全的:即使装饰函数没有显式返回,它将返回刚刚转发的None通过你的包装。

现在,这不是“强制性的”。如果您事先知道您的装饰器将仅应用于没有返回值的函数,那么您也可以不在包装函数中放置return语句 - 这不是一个不正确的语法(但它可能是您未来的陷阱)自)。