为什么python属性装饰器会吃这个异常?

时间:2015-07-30 03:42:50

标签: python exception-handling decorator

运行此代码时没有打印任何内容。为什么?没有异常被抛出,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
The previous answer建议的

BrenBarn提供了回答我的问题所需的信息,但不是直接的。但我现在可以回答我自己的问题:

属性装饰器使用AttributeError作为来自getter的信号来调用__getattr__,因此如果你的getter抛出属性错误,它将被捕获并且你不会看到它。< / p>

感谢lemonhead和mission.liao放纵我的无知。

2 个答案:

答案 0 :(得分:4)

好的,我弄清楚这里发生了什么:

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

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

答案 1 :(得分:1)

主要原因是你覆盖__getattr__方法

当你删除奇怪的.__ getattr __时,会按预期调用bizarre.odd。