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

oro*_*aki 2 python

try:
    spam.foo
except AttributeError:
    do_somthing()
Run Code Online (Sandbox Code Playgroud)

(在不使用它的情况下检查这样的属性是明智的吗?)

Fel*_*ing 13

更新:

如果您真的只对该属性是否foo存在感兴趣(并且不对该属性执行某些操作),那么当然hasattr()可能是检查该属性的更好方法.
开发者/用户的角度来看,我必须承认,对我来说,hasattr()更好的使用反映了你的意图.除此之外,它会导致更少的代码:

if not hasattr(spam,'foo'):
    do_something()
Run Code Online (Sandbox Code Playgroud)

文档hasattr()描述了它是通过以下方式实现的:

(这是通过实现)调用getattr(object, name)并查看它是否引发异常.

所以基本上hasattr()和你做的完全一样.在这种情况下,我肯定会采用构建解决方案,即hasattr().你不会获得任何速度优势.


Python鼓励EAFP范例:

要求宽恕比获得更容易

所以,如果你或多或少知道大多数时候spam都会有一个foo属性(代码会更快(很少?)),这就是应该这样做的方式.
否则,如果spam没有foo属性(大部分时间),那么这种方法会更好:

if hasattr(spam, 'foo'):
    bar = spam.foo
else:
    do_somthing()
Run Code Online (Sandbox Code Playgroud)

我链接的维基百科上的部分描述了这一点.引用(EAFP版本指代您编写代码示例的方式):

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

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