【发布时间】:2018-01-25 17:26:38
【问题描述】:
让我们考虑这个例子 - 代码返回列表 li(如果存在)中第一个 None 值的索引,或者如果 None 不存在于 li 中,则返回最后一个元素的索引。
我可以检查 None 是否在列表中,但使用 ifs 不是首选方式 - Dive Into Python 鼓励使用异常,因为据说它们更快并且使代码更清晰(请参阅this 问题)。所以我提出了三种方法:
1.
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
print my_index
my_index 在 try/except 块中声明。更少的行,没有多余的声明。可能的问题 - 不同的异常类型将导致无法创建 my_index 并导致 print 上的脚本崩溃。
2.
my_index = None # or anything else
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
print my_index
my_index 在 try/except 之前声明,并且无论发生什么异常都会分配一个值。缺点 - 更多的行,看起来多余。
3. 编辑:不起作用 - finally 执行,无论 try/except 结果如何
try:
my_index = li.index(None)
except ValueError:
my_index = len(li) - 1
finally:
my_index = None # or anything else
print my_index
优点 - 总是有效(或至少我认为如此)。缺点 - 在我的整个 Python 体验中,我从未见过有人使用 finally,这一定是有原因的。
哪些方法被认为是首选和 Pythonic 方法?也许有更好的解决方案?
【问题讨论】:
-
我可能会使用 1.。你说:“不同的异常类型将导致不创建 my_index”,但如果发生这种情况,那么代码逻辑就会出现严重错误:
li甚至不存在,或者它是一个没有 @987654335 的对象@ 方法,所以你可能想要在那个时候崩溃(或有一些其他错误处理),你可能不想愉快地继续使用并不真正相关的默认my_index。
标签: python exception-handling try-catch