检查用户提供的矢量索引的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')
答案 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”方式通常会尝试除外 - 但我重申它更依赖于您的用例。