Python的hasattr有时会返回不正确的结果

时间:2016-02-23 00:37:21

标签: python properties attributes python-2.x hasattr

为什么hasattr表示该实例没有foo属性?

>>> class A(object):
...     @property
...     def foo(self):
...         ErrorErrorError
... 
>>> a = A()
>>> hasattr(a, 'foo')
False

我期待:

>>> hasattr(a, 'foo')
NameError: name 'ErrorErrorError' is not defined`

1 个答案:

答案 0 :(得分:14)

hasattr的python2实现相当天真,它只是尝试访问该属性并查看它是否引发异常。

不幸的是,这意味着属性中的任何未处理的异常都会被吞噬,并且该代码中的错误可能会丢失。要添加侮辱伤害,当hasattr吃异常时,它也会返回错误的答案(此处属性a.foo 确实存在,因此结果应返回True如果任何东西)。

在python3.2 +中,行为已得到纠正:

  

hasattr(object, name)

     

参数是一个对象和一个字符串。如果字符串是对象属性之一的名称,则结果为True,否则为False。 (这是通过调用getattr(object, name)并查看它是否会引发AttributeError来实现的。)

该修复程序为here,但不幸的是,此更改并未后退。

如果python2行为给您带来麻烦,请考虑避免使用hasattr;相反,您可以在getattr周围使用try / except,仅捕获AttributeError异常,并让任何其他异常处理未处理。