验证列表索引时,最好事先检查有效性还是捕获和处理IndexError?

时间:2012-08-23 16:50:22

标签: python exception

检查用户提供的矢量索引的pythonic方法是什么?

def get_value(vector, index):
    try:
        return vector[index]
    except IndexError:
        raise ValueError('bad index')

def get_value(vector, index):
   if -1 < index < len(vector):
       return vector[index]
   else:
       raise ValueError('bad index')

3 个答案:

答案 0 :(得分:2)

首先尝试更多Pythonic。来自glossary

  

EAFP

     

比获得许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。

)共有的LBYL风格形成对比

虽然我甚至不会把它放在try ... except附近,因为你只是抛出一个已经发生的IndexError。

答案 1 :(得分:1)

我认为将IndexError传播给用户是合理的。用户正在向您发送index内容。如果从您的界面中合理地抛出了超出范围IndexError。所以我会这样做:

def get_value(vector, index):
    """ gets value... throws IndexError() if index out of range"""
    return vector[index]

这也允许您在界面中使用有效的负数索引。

答案 2 :(得分:0)

一种方法是抛出IndexError - 这是一个无效的请求。另一个是做vector.get(index),它在失败时给你一个无类型(与try: return vector[index] except: return None相同)。这真的取决于你在失败时打算做什么。如果您想要请求用户再试一次,那么.get()或尝试除外可能是最好的。否则将异常提升到最高级别表示程序无法处理请求。

请注意,“Pythonic”方式通常会尝试除外 - 但我重申它更依赖于您的用例。