Pythonic习语用于检查(负)数组索引的有效性

时间:2012-08-30 15:49:29

标签: python

我的函数将字符串拆分为行,检查索引行,并返回两个值中的一个。这是一个简化版本:

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]

除了捕获错误之外,是否有惯用方法检查indexrows的合法索引?

2 个答案:

答案 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,确保索引在调用者上有效(或处理错误)。如果调用者传递了一大块文本和一个行索引,那么如果它们传递了无效索引则获得异常是完全合理的。