Python 为什么;他们";选择引发异常?

Python 为什么;他们";选择引发异常?,python,exception,exception-handling,standard-library,Python,Exception,Exception Handling,Standard Library,我在读关于: 参数是一个对象和一个字符串。如果 string是对象属性之一的名称,如果不是,则为False。 (这是通过调用getattr(object,name)并查看 是否引发AttributeError。) 我的 我不需要检查getattr函数是否会引发AttributeError,因为它会大大加快属性本身的搜索速度(以防引发异常) 当我使用标准库时,我希望它是以最好的方式编写的。在这种情况下,引发异常真的是实现hasattr的最佳方法吗?该类可能已经重写了\uuu getattr\uuu

我在读关于:

参数是一个对象和一个字符串。如果 string是对象属性之一的名称,如果不是,则为False。 (这是通过调用getattr(object,name)并查看 是否引发AttributeError。

我的

我不需要检查
getattr
函数是否会引发
AttributeError
,因为它会大大加快属性本身的搜索速度(以防引发异常)


当我使用标准库时,我希望它是以最好的方式编写的。在这种情况下,引发异常真的是实现
hasattr
的最佳方法吗?

该类可能已经重写了
\uuu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuu()
getattribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
以呈现
中不存在的属性


为了与
getattr()
保持一致,
hasattr()
需要了解这些属性。一种简单但通用的方法是调用
getattr()
并查看是否成功;如果对象实现了动态对象,例如,或重写


验证属性是否存在的唯一可靠方法是使用
getattr()

注意,在CPython中,
hasattr
并不会直接调用
getattr
内置函数;相反,它的C实现
PyObject\u HasAttr
调用
PyObject\u GetAttr
。然而,这样的设计将违反DRY,并在获取属性和查询属性之间引入差异。如果一个属性的访问速度太慢,以至于需要单独的查询来证明它的存在,那么首先它可能不应该作为一个属性公开。对于可能很重的计算内容,最好使用一种方法。