与装饰家的奇怪

Den*_*nis 15 python decorator

我想做一个装饰器,它将捕获异常并充分记录它们.

def logger(foo):
    try:
        print foo()
    except Exception as e:
        print e

@logger
def d():
    return 2/2

if __name__ == '__main__':
    d()
Run Code Online (Sandbox Code Playgroud)

这是正确的,但我然后运行它,我有这样的例外:

1

Traceback (most recent call last):

  File "log.py", line 14, in <module>

    d()

TypeError: 'NoneType' object is not callable
Run Code Online (Sandbox Code Playgroud)

为什么解释器告诉我该函数有None类型,但是调用它并打印答案?

jef*_*upp 22

你的装饰器需要返回一个函数,但是它没有返回任何东西,因此'TypeError:'NoneType'对象不可调用'.你可以这样实现它:

def logger(foo):
    def fn():
        try:
            print foo()
        except Exception as e:
            print e
    return fn
Run Code Online (Sandbox Code Playgroud)

查看这个问题,了解如何编写/使用装饰器的一个很好的例子.