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

Python 验证列表索引时,最好事先检查其有效性,还是捕获并处理索引器?,python,exception,Python,Exception,检查用户提供的向量索引的pythonic方法是什么 def get_value(vector, index): try: return vector[index] except IndexError: raise ValueError('bad index') 或 def get_值(向量、索引): 如果-1

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

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

def get_值(向量、索引):
如果-1
我认为让
索引器向上传播给用户是合理的。用户正在向您传递一个
索引
。如果从您的界面合理地抛出了超出范围的索引器
。所以我只想做:

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

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

首先尝试更符合Python。从:

EAFP

请求原谅比允许更容易。这种常见的Python编码风格假设存在有效的键或属性,如果假设为false,则捕获异常。这种简洁快速的风格的特点是有许多尝试和例外的陈述。这种技术与许多其他语言(如C语言)所共有的LBYL风格形成对比


尽管我甚至不想把它放在
尝试
上,除了
,因为你只是抛出了一个索引器,它已经抛出了。

一种方法是让
索引器被抛出,这是一个无效的请求。另一种方法是执行
vector.get(index)
,它在失败时为您提供一个None类型(与
try:return vector[index]相同,除了:return None
)。这真的取决于你失败后打算做什么。如果要请求用户重试,那么.get()或try except可能是最好的选择。否则,将异常提升到顶层表示程序无法处理该请求


请注意,“Pythonic”方法通常是一种尝试,但我重申,它更依赖于您的用例。

向量是指
list
?如果是这样,您的第二个表单是不合适的,因为Python
list
s中的负索引是允许的。他们从列表的末尾检索。没错。与使用python和C/C++/Java相比,这是一个很大的区别。对于那些没有意识到LBYL=的人来说,三思而后行
def get_value(vector, index):
    """ gets value... throws IndexError() if index out of range"""
    return vector[index]