在Python中,这是一个很好的做法吗?

时间:2010-03-11 06:59:34

标签: python

try:
    spam.foo
except AttributeError:
    do_somthing()

(不使用它来检查这样的属性是明智的吗?)

2 个答案:

答案 0 :(得分:13)

<强>更新

如果您真的只关心属性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()

我链接的Wikipedia部分描述了这一点。引用(其中 EAFP版本指的是您编写代码示例的方式):

  

这两个代码示例具有相同的效果,但会有性能差异。当垃圾邮件具有属性鸡蛋时, EAFP 样本运行得更快。当垃圾邮件没有属性 egg(“例外”情况)时,EAFP示例运行速度。 (...)如果特殊情况很少,那么 EAFP版将具有优越的平均性能

在某种程度上显而易见的是(使用EAFP),您不必在每次想要访问属性之前都内省对象。

答案 1 :(得分:2)

更好地使用

if hasattr(spam,"foo"):
   #dosomthing with spam.foo
else:
   do_somthing()

Python文档:

  

hasattr(对象,名称)
      参数是一个对象和一个字符串。如果是,则结果为True   string是其中一个的名称   对象的属性,否则为False。   (这是通过调用来实现的   getattr(对象,名称)和看到   是否引发例外或   不。)