作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图找出确定对象 obj
是否可以执行操作 do_stuff()
的不同方法之间的权衡。据我了解,可以通过三种方式确定这是否可行:
# Way 1
if isinstance(obj, Foo):
obj.do_stuff()
# Way 2
if hasattr(obj, 'do_stuff'):
obj.do_stuff()
# Way 3
try:
obj.do_stuff()
except:
print 'Do something else'
哪个是首选方法(为什么)?
最佳答案
我相信最后一种方法通常是 Python 编码人员的首选,因为 motto在 Python 社区中教授:“请求宽恕比获得许可更容易”(EAFP)。
简而言之,座右铭的意思是避免在做某事之前检查你是否可以做某事。相反,只需运行该操作。如果失败,请妥善处理。
此外,第三种方法还有一个额外的好处,即可以清楚地表明该操作应该有效。
话虽如此,您真的应该避免像那样使用裸except
。这样做将捕获任何/所有异常,甚至是不相关的异常。相反,最好专门捕获异常。
在这里,您需要捕获 AttributeError
。 :
try:
obj.do_stuff() # Try to invoke do_stuff
except AttributeError:
print 'Do something else' # If unsuccessful, do something else
关于python isinstance vs hasattr vs try/except : What is better?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024913/
我是一名优秀的程序员,十分优秀!