【问题标题】:Why do I get an error message of NoneType object is not callable when I try to call this function?为什么我尝试调用此函数时收到 NoneType object is not callable 的错误消息?
【发布时间】:2019-01-05 01:17:54
【问题描述】:
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)

我猜这与对 return 的误解有关,因为我很确定我不应该添加括号。我的问题是为什么它不起作用?为什么它是 NoneType 但不是 NoneType 当我不放括号时。您对此越详细越好,因为我真的需要了解这一点。

【问题讨论】:

    标签: python return python-decorators nonetype


    【解决方案1】:

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

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

    wrapper_func()没有return语句,所以它的返回值为None,不可调用。

    另一方面,wrapper_func 被视为一个变量——一个一流的函数。因此,它是可调用的。

    【讨论】:

      【解决方案2】:

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

      return wrapper_func
      

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

      【讨论】:

        猜你喜欢
        • 2021-09-15
        • 1970-01-01
        • 2022-11-20
        • 2022-07-06
        • 2018-01-26
        • 2020-08-08
        • 1970-01-01
        • 2020-12-15
        • 1970-01-01
        相关资源
        最近更新 更多