与装饰家的奇怪

时间:2012-01-13 18:10:47

标签: python decorator

我想制作一个装饰器来捕捉异常并充分记录它们。

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

@logger
def d():
    return 2/2

if __name__ == '__main__':
    d()

多数民众赞成我认为,但是我运行它并且我有一个例外:

1

Traceback (most recent call last):

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

    d()

TypeError: 'NoneType' object is not callable

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

2 个答案:

答案 0 :(得分:19)

你的装饰师需要返回一个函数,但它没有返回任何东西,因此&#39; TypeError:&#39; NoneType&#39;对象不可调用&#39;。你可以这样实现它:

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

查看This question,了解如何编写/使用装饰器的一个很好的例子。

答案 1 :(得分:2)

您定义的

logger不会返回值。所有这些函数都可以被认为是返回None。您尚未正确定义装饰器。看起来应该更像这样:

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

...但请记住,这会丢失大量信息,捕获并吞下大量异常,并且还会吞下foo函数的任何返回值。虽然您可能在生产代码中执行的操作与此处显示的内容不同,但重要的是装饰器函数本身必须返回一个可以调用的函数(在我的示例中为_logger)。