2

检查用户提供的矢量索引的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')
4

3 回答 3

2

首先尝试更 Pythonic。从词汇表

EAFP

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

虽然我什至不会把它放在try...except因为你只是抛出一个 IndexError,它已经这样做了。

于 2012-08-23T16:56:12.123 回答
1

我认为只让IndexError传播给用户是合理的。用户正在将您传递给index某物。IndexError如果从您的界面合理地抛出超出范围。所以我会这样做:

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

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

于 2012-08-23T16:54:20.090 回答
0

一种方法是让它IndexError被抛出——这是一个无效的请求。另一种方法是vector.get(index)在失败时为您提供 None 类型(与 相同try: return vector[index] except: return None)。这实际上取决于您在失败时打算做什么。如果您想请求用户再试一次,那么 .get() 或 try except 可能是最好的。否则将异常提升到顶层表示程序无法处理请求。

请注意,“Pythonic”方式通常是一种尝试,但我重申它更多地取决于您的用例。

于 2012-08-23T16:56:59.827 回答