try:
spam.foo
except AttributeError:
do_somthing()
(在不使用它的情况下检查这样的属性是否明智?)
最佳答案
更新:
如果你真正感兴趣的是属性foo
是否存在(而不使用属性),当然比hasattr()
更适合检查属性。
从开发人员/用户的角度来看,我不得不承认,对我来说,hasattr()
的使用更好地反映了您的意图。除此之外,它将导致更少的代码:
if not hasattr(spam,'foo'):
do_something()
hasattr()
的文档描述了它的实现方式:(这是通过)调用
getattr(object, name)
并查看它是否引发异常来实现的。所以基本上
hasattr()
和你做的一样。在这种情况下,我肯定会使用内置解决方案,即hasattr()
。你不会获得任何速度优势。Python鼓励EAFP paradigm:
请求宽恕比允许容易
所以,如果您或多或少地知道
spam
在大多数情况下都有一个foo
属性,那么这正是您应该这样做的方式(代码将是(很少?)更快)。否则,如果
spam
没有foo
属性(大多数情况下),则此方法更好:if hasattr(spam, 'foo'):
bar = spam.foo
else:
do_somthing()
我链接到的维基百科部分描述了这一点。引号(其中EAFP版本指的是您编写代码示例的方式):
这两个代码示例具有相同的效果,但会有性能差异。当spam具有eggs属性时,EAFP示例将运行得更快。当spam没有eggs属性时(“异常”情况),EAFP示例将运行得更慢。(…)如果异常情况很少,那么EAFP版本的平均性能将优于其他版本。
这在某种程度上是显而易见的,因为(使用EAFP)您不必每次在访问属性之前都对对象进行内省。