Индекс для последовательности, такой как list
в Python, Array
в Java или std::vector<int>
в C ++, может выйти за пределы диапазона с учетом отрицательного индекса.Когда это происходит и язык среды выполнения выбирает их обнаружение, они генерируют исключение с индексом, вызывающим ошибки, или без него.В моей ситуации я пишу некоторый код-обертку, чтобы использовать индекс для доступа к списку, примерно так:
function! MyGetItem(list, index)
return list[index]
endfunction
Я хочу обнаружить IndexError
, и у меня есть два способа:
- используйте
try-catch
вокруг list[index]
, чтобы пересечь и, вероятно, украсить встроенную ошибку. - обнаружите ошибку самостоятельно и защитите
list[index]
.
Проблема в том, что встроенная ошибка не работает, когда индекс отрицательный.Например, если я использую list[-2]
, где len(list) == 1
, ошибка будет index out of range: -1
, что на самом деле index + len(list)
.Пытаясь понять, является ли общепринятой практикой указание индекса как такового, я попробовал один и тот же пример нескольких языков.В тех, кто не поддерживает отрицательный индекс, таких как java и C ++, индекс сообщается как он.Однако в Python об индексе не сообщается:
>>> s[-1]
IndexError: string index out of range
>>> [][0]
IndexError: list index out of range
Это заставляет меня задуматься, выбирает ли Python игнорирование плохого индекса из-за какого-то принципа разработки программного обеспечения.В какой ситуации мне следует следовать?