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

2024-01-12

为什么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`

Python 2 的实现hasattr https://docs.python.org/2/library/functions.html#hasattr相当天真,它只是尝试访问该属性并查看它是否引发异常。

很遗憾,hasattr会吃掉任何异常类型,而不仅仅是一个AttributeError与尝试访问的属性的名称相匹配。它抓住了一个NameError在所示的示例中,这会导致错误的结果False返回那里。雪上加霜的是,属性内任何未处理的异常都将被吞噬,属性代码内的错误可能会丢失,从而掩盖错误。

在 Python 3.2+ 中,该行为已得到纠正:

hasattr(object, name)

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

解决办法是here https://hg.python.org/cpython/rev/2de9d4457082/,但该更改并未向后移植。

如果 Python 2 行为给您带来麻烦,请考虑避免使用hasattr;相反,你可以使用 try/ except 周围getattr https://docs.python.org/2/library/functions.html#getattr, 捕捉only the AttributeError异常类型并让任何其他异常引发未处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 的 hasattr 有时会返回不正确的结果 的相关文章

随机推荐