'NoneType' 对象不可调用 - python 装饰器

'NoneType' object is not callable - python decorators

我正在尝试了解 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()

但是当我 运行 这个脚本时它给我错误 > 追溯(最后一次通话): 文件“C:/Users/abcdef/Documents/FluentPython/NLP_C1_W1_lecture_nb_01.py”,第 3 行,位于 Examples.main() 主文件“C:\Users\abcdef\Documents\FluentPython\Examples.py”,第 25 行 f1() 类型错误:'NoneType' 对象不可调用

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

谁能详细说明为什么会这样。谢谢

register注解是对函数的包装,和做

基本一样
register(f1)

并且由于 register 没有 return 声明它 returns None,所以 f1() 实际上是尝试调用 None 作为函数。

register

中加上return func即可解决
def register(func):
    print(f'running registry -> {func}')
    registry.append(func)
    return func