繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM