Python list.index выдает исключение, когда индекс не найден - PullRequest
13 голосов
/ 23 марта 2009

Почему list.index генерирует исключение вместо использования произвольного значения (например, -1)? Что за идея стоит за этим?

Мне кажется, что иметь дело с особыми значениями, а не с исключениями, понятнее.

РЕДАКТИРОВАТЬ : я не знал, -1 является потенциально допустимым значением. Тем не менее, почему не что-то еще? Как насчет значения None?

Ответы [ 10 ]

12 голосов
/ 23 марта 2009

Потому что -1 сам по себе является допустимым индексом. Он мог бы использовать другое значение, например None, но это было бы бесполезно, что -1 может быть в других ситуациях (например, str.find()), и было бы равносильно проверке ошибок, а это именно то, что исключения для.

7 голосов
/ 23 марта 2009

Добавить к ответу Девина: Это старая дискуссия между особыми возвращаемыми значениями и исключениями. Многие гуру программирования предпочитают исключение, потому что в случае исключения я вижу всю трассировку стека и сразу понимаю, что не так.

6 голосов
/ 23 марта 2009

Ну, специальное значение на самом деле должно быть None, потому что -1 является допустимым индексом (означающим последний элемент списка).

Вы можете эмулировать это поведение:

idx = l.index(x) if x in l else None
4 голосов
/ 24 марта 2009

Дебаты «значение исключения-ошибки» частично касаются ясности кода. Рассмотрим код со значением ошибки:

idx = sequence.index(x)
if idx == ERROR:
    # do error processing
else:
    print '%s occurred at position %s.' % (x, idx)

Обработка ошибок заканчивается в середине нашего алгоритма, скрывая ход программы. С другой стороны:

try:
    idx = sequence.index(x)
    print '%s occurred at position %s.' % (x, idx)
except IndexError:
    # do error processing

В этом случае объем кода практически одинаков, но основной алгоритм не нарушается при обработке ошибок.

2 голосов
/ 23 марта 2009

Это в основном для того, чтобы ошибки были обнаружены как можно скорее. Например, рассмотрим следующее:

l = [1, 2, 3]
x = l.index("foo")  #normally, this will raise an error
l[x]  #However, if line 2 returned None, it would error here

Вы заметите, что ошибка будет выдана на l[x], а не на x = l.index("foo"), если индекс вернет None. В этом примере это не имеет большого значения. Но представьте, что третья строка находится в совершенно ином месте в программе с миллионами строк. Это может привести к небольшому кошмару отладки.

2 голосов
/ 23 марта 2009

В Python -1 является допустимым индексом, означающим число от конца списка (вместо начала), поэтому, если вы должны были сделать

idx = mylist.index(someval)
nextval = mylist[idx+1]

тогда вы получите первое значение массива, вместо того, чтобы понять, что произошла ошибка. Таким образом вы можете поймать исключение и разобраться с ним. Если вы не хотите исключений, просто проверьте заранее:

if someval in mylist:
    idx = mylist.index(someval)

Редактировать: Нет смысла возвращать None, потому что если вы собираетесь проверить None, вы можете также проверить, есть ли значение в списке, как указано выше!

1 голос
/ 23 марта 2009

Я согласен с Девином Жанпьером и хотел бы добавить, что работа со специальными значениями может хорошо выглядеть в небольших примерах, но (за некоторыми заметными исключениями, например, NaN в FPU и Null в SQL), он также не масштабируется почти так же. Единственный раз, когда это работает, где:

  • Как правило, у вас много вложенной однородной обработки (например, математика или SQL)
  • Вас не волнует различение типов ошибок
  • Вам все равно, где произошла ошибка
  • Операции являются чистыми функциями без побочных эффектов.
  • Ошибка может быть придана разумное значение на более высоком уровне (например, "Нет совпадений строк")
0 голосов
/ 16 февраля 2015
def GetListIndex(list, searchString):
    try:
        return list.index(searchString)

    except ValueError:
        return False

    except Exception:
        raise
0 голосов
/ 23 марта 2009

Это семантический аргумент. Если вы хотите узнать индекс элемента, вы утверждаете, что он уже существует в списке. Если вы хотите знать, существует ли он, вы должны использовать in.

0 голосов
/ 23 марта 2009

Одна простая идея: -1 идеально подходит в качестве индекса (как и другие отрицательные значения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...