我的函数将字符串拆分为行,检查索引行,并返回两个值中的一个。这是一个简化版本:
def f(text, index):
rows = text.split('\n')
row = rows[index] # <-- IndexError thrown here.
if row_meets_some_condition:
return "Yes"
else:
return "No"
调用者有时会传递index
的负值(当他想使用基于文件结束的索引时),这样可以正常工作,除非text
行数太少,其中我在IndexError
行获得了row = rows[index]
。
除了捕获错误之外,是否有惯用方法检查index
是rows
的合法索引?
答案 0 :(得分:6)
在Python中捕获IndexError
非常惯用。如果您无法预测输入的行数,则可以在访问列表之前检查rows
的长度,或者只捕获IndexError
。我会选择第二个选项。
答案 1 :(得分:3)
捕捉IndexError
是惯用的方式。如果这对你来说很难看,你可以把它分解成一个单独的函数。
def validIndex(container, index):
try:
container[index]
except IndexError:
return False
else:
return True
另一种方法是使用if
语句,当然:
if index < 0 and index < -len(rows):
# invalid index
最后一种方法是让索引操作失败并引发IndexError
,确保索引在调用者上有效(或处理错误)。如果调用者传递了一大块文本和一个行索引,那么如果它们传递了无效索引则获得异常是完全合理的。