【问题标题】:'NoneType' object is not callable - python decorators'NoneType' 对象不可调用 - python 装饰器
【发布时间】:2022-01-03 17:37:36
【问题描述】:

我正在尝试理解 Python 装饰器。 从 FluentPython 书中尝试了这个示例。 (例7.2,供参考(

# Using Decorators
registry = []

def register(func):
    print(f'running registry -> {func}')
    registry.append(func)


@register
def f1():
    print('running f1()')


@register
def f2():
    print('running f2()')


@register
def f3():
    print('running f3()')


def main():
    print('running registry')
    print(f'registry -> {registry}')
    f1()
    f2()
    f3()


if __name__ == '__main__':
    print('running main()')
    main()

但是当我运行这个脚本时它给了我错误 > Traceback(最近一次通话最后一次): 文件“C:/Users/abcdef/Documents/FluentPython/NLP_C1_W1_lecture_nb_01.py”,第 3 行,在 例子.main() 文件“C:\Users\abcdef\Documents\FluentPython\Examples.py”,第 25 行,在 main f1() TypeError: 'NoneType' 对象不可调用

无法理解为什么会这样。 我只是使用 f1()、f2() 和 f3() 调用函数 - f1、f2 和 f3。我希望打印出 'running f1()' 等,但我得到了一个错误。

有人可以详细说明为什么会这样。谢谢。

【问题讨论】:

    标签: python nonetype


    【解决方案1】:

    register注解是对函数的封装,和做的基本一样

    register(f1)
    

    由于register 没有return 语句,它返回None,所以f1() 实际上是尝试将None 作为函数调用。

    你可以通过在register上加return func来解决

    def register(func):
        print(f'running registry -> {func}')
        registry.append(func)
        return func
    

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2013-01-10
      • 2019-03-17
      • 2020-09-22
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多