【问题标题】:Strangeness with a decorator装饰师的奇怪之处
【发布时间】:2012-02-09 22:17:21
【问题描述】:

我想制作一个装饰器,它可以捕获异常并充分记录它们。

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 类型,但调用它并打印答案?

【问题讨论】:

标签: python decorator


【解决方案1】:

您的装饰器需要返回一个函数,但它没有返回任何内容,因此“TypeError: 'NoneType' object is not callable”。你可以这样实现它:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多