【问题标题】:Why does python property decorator eat this exception? [duplicate]为什么 python 属性装饰器会吃掉这个异常? [复制]
【发布时间】:2015-10-21 06:48:07
【问题描述】:

当我运行这段代码时,什么都没有打印出来。为什么?不抛出异常,不执行 if...elif...else 结构中的任何内容。

环境:Python 2.7。

d= {"x":1}

class bizarre(object):
    def __init__(self):
        self.metadata = {}

    def __getattr__(self, name):
        return self.metadata.get(name, None)

    @property
    def odd(self):
        if False:
            print '1'
        elif self.fake.get("blah", ''):
            print '2'
        else:
            print '3'

b=bizarre()
b.odd

BrenBarn 建议的The previous answer 具有回答我的问题所需的信息,尽管不是直接的。但我现在可以回答我自己的问题了:

属性装饰器使用AttributeError作为来自getter的信号来调用__getattr__,所以如果你的getter抛出一个属性错误,它会被捕获并且你不会看到它。

感谢柠檬头和 Mission.liao 纵容我的无知。

【问题讨论】:

  • 不要认为这是重复的,虽然它们有相同的原因,上一个问题是关于 __getattr__ 和这个问题是关于 @property 装饰器。

标签: python exception-handling decorator


【解决方案1】:

好的,我知道这里发生了什么:

 elif self.fake.get("blah", ''):
     print '2'

这是有问题的行。 self.fakeNone,所以运行 None.get('blah') 会引发 AttributeError。但是,由于 this 在属性内部,python 将其视为该属性不存在,因此依次调用 __getattr__,它不打印任何内容

【讨论】:

  • 我不知道属性装饰器是如何工作的。谢谢,@lemonhead
【解决方案2】:

主要原因是你重写了 __getattr__ 方法

当您删除 bizarre.__getattr__ 时,将按预期调用 bizarre.odd。

【讨论】:

  • 嗯...但看起来 bizarre.odd 仍在被调用?
  • 是的。如果你把try/except放进去,你会看到它失败了'NoneType' object has no attribute 'get'(因为self.fakeNone,那么你在上面调用get);但错误被默默吞下。我不够聪明,无法弄清楚原因,但here 对此进行了较大的讨论。 odd 肯定会被调用。
  • 你说得对,我在这里漏掉了一些东西
  • @Amadan,是的,得到了​​同样的结论。
猜你喜欢
  • 2020-09-28
  • 2020-06-29
  • 2011-05-04
  • 1970-01-01
  • 2010-10-19
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多