
[英]Python's hasattr on list values of dictionaries always returns false?
[英]Python's hasattr sometimes returns incorrect results
为什么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`
hasattr的python2实现相当幼稚,它只是尝试访问该属性并查看它是否引发异常。
不幸的是,这意味着属性中的任何未处理的异常都会被吞噬,并且该代码中的错误可能会丢失。 为了增加对伤害的侮辱,当hasattr吃掉异常时,它也会返回一个错误的答案(这里的属性a.foo
确实存在,所以如果有的话,结果应该返回True
)。
在python3.2 +中,行为已得到纠正:
hasattr(object, name)
参数是一个对象和一个字符串。 如果字符串是对象属性之一的名称,则结果为
True
否则返回False
。 (这是通过调用getattr(object, name)
并查看它是否引发AttributeError
。)
修复程序在这里 ,但不幸的是,更改没有后退。
如果python2行为给你带来麻烦,可以考虑避免使用hasattr
; 相反,您可以在getattr
周围使用try / except,仅捕获AttributeError
异常并让任何其他异常处理未处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.