首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hasattr()与try-except块处理不存在的属性

hasattr()与try-except块处理不存在的属性
EN

Stack Overflow用户
提问于 2009-05-24 05:12:00
回答 12查看 32.6K关注 0票数 93
代码语言:javascript
复制
if hasattr(obj, 'attribute'):
    # do somthing

vs

代码语言:javascript
复制
try:
    # access obj.attribute
except AttributeError, e:
    # deal with AttributeError

哪一种应该是首选的?为什么?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-05-24 05:17:15

hasattr在内部快速执行与try/except块相同的任务:它是一个非常特定的、经过优化的单任务工具,因此在适用的情况下,它应该比非常通用的替代工具更可取。

票数 88
EN

Stack Overflow用户

发布于 2009-05-24 06:41:27

有没有说明性能差异的长椅?

时间是你的朋友

代码语言:javascript
复制
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'hasattr(c, "nonexistent")'
1000000 loops, best of 3: 1.87 usec per loop
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'hasattr(c, "a")'
1000000 loops, best of 3: 0.446 usec per loop
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'try:
 c.a
except:
 pass'
1000000 loops, best of 3: 0.247 usec per loop
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'try:
 c.nonexistent
except:
 pass'
100000 loops, best of 3: 3.13 usec per loop
$

       |positive|negative
hasattr|  0.446 |  1.87 
try    |  0.247 |  3.13
票数 93
EN

Stack Overflow用户

发布于 2013-05-24 11:18:36

还有第三种,而且通常是更好的选择:

代码语言:javascript
复制
attr = getattr(obj, 'attribute', None)
if attr is not None:
     print attr

优势:

  1. getattr没有坏的exception-swallowing behavior pointed out by Martin Geiser -在旧的Python中,hasattr甚至会吞下一个KeyboardInterrupt.
  2. The正常的exception-swallowing behavior pointed out by Martin Geiser你检查对象是否有属性的原因是你可以使用该属性,这自然会导致它。
  3. 该属性是原子读取的,并且是安全的,不会被其他线程更改对象。(不过,如果这是一个主要问题,您可能会考虑在访问对象之前锁定它。)
  4. 它比try/finally短,而且通常比except AttributeError短。宽的AttributeErrors块可以捕获您所期望的以外的其他,这可能会导致混淆behaviour.
  5. Accessing属性比访问局部变量慢(特别是如果它不是普通的实例属性)。(不过,老实说,在Python语言中进行微优化通常是一件愚蠢的事情。)

需要注意的一件事是,如果您关心obj.attribute设置为None的情况,则需要使用不同的标记值。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/903130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档