为什么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(使用前将#替换为@)