尝试调用此函数时,为什么会收到错误消息,提示无法调用NoneType对象?

时间:2018-07-27 21:56:34

标签: python return python-decorators nonetype

def decorator_function(original_func):
    def wrapper_func():
        print('Run this code before the function that needs docorated')
        original_func()
        print('Run this code after the function that needs decorated has been called')
    return wrapper_func()

def function_needing_decorated():
    print('I need to be decorated')


decorator_test = decorator_function(function_needing_decorated)

我猜想这与对回报的误解有关,因为我敢肯定我不应该加上括号。我的问题是为什么它行不通?为什么它是一个NoneType,但是当我不将括号放在那里时,它不是NoneType。您对此越详细,就越好,因为我真的需要了解这一点。

2 个答案:

答案 0 :(得分:1)

您不应在装饰器内部调用包装器-您应该返回包装器本身。

return wrapper_func

您正在做的是返回调用包装器的结果;因为该包装器本身不返回任何东西,所以装饰器本身现在什么也不是。

答案 1 :(得分:0)

在函数名称(wrapper_func())后面加上括号,实际上是在调用函数。

包装器函数正在评估中,其生成的值由decorator_function返回。

wrapper_func()没有return语句,因此它的返回值为None,这是不可调用的。

另一方面,

wrapper_func被视为变量-一流的功能。结果,它是可调用的。