为什么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`
答案 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
异常,并让任何其他异常处理未处理。