为什么在此装饰器中返回None?

时间:2019-02-24 09:00:19

标签: python return return-value python-decorators

我正在用Python阅读此代码段:

def decorator_function(original_function):
    def wrapper_function(*arg,**kwargs):
        print("This line is executed before the original function")
        result = original_function(*arg, **kwargs)
        print("This line is executed after the original function")
        print (result)
        return result #Why do we need to return result from this decorator?
    return wrapper_function

@decorator_function
def display_info(name, age):
    print(name, age)

display_info("You", 1)
display_info("Me", 99)

装饰的函数返回无,并且无论我们是否有return result这一行,上面的代码段都将产生相同的结果。

我想知道是否有任何原因(Pythonic?将来的代码维护?)返回此None。

该代码段是YouTube装饰器上的Python教程的一部分。

谢谢

2 个答案:

答案 0 :(得分:1)

修饰的函数将返回None,因为函数display_info没有return语句,因此返回void。并且decorator_function内部的闭包返回并输出与对原始函数display_info的调用返回的值相同的值(装饰器的动作未触及该值),很明显它将返回一个{值{1}}。

修改

  

我们为什么需要该return语句?

在这种情况下这是完全可选的,您可以确定只能将此装饰器添加到返回void或绝对不返回任何值的函数中,但是如果不是这种情况,则需要添加return语句,因为如果您不这样做, t添加return语句,您的原始函数有机会返回某些内容,将返回void。

答案 1 :(得分:1)

它返回None,因为您的None返回Nothing。

display_info()

这里的结果将为result = original_function(*arg, **kwargs) 。因此,当您尝试None时,您不会获得任何帮助。

我相信您期望print(result)中有元组("You", 1)