2015-08-07 1 views
3

В Python Documentation говорится, чтоКак повысить индексный индекс, когда индексы среза находятся за пределами допустимого диапазона?

ломтик индексы молчаливо укороченная падать в допустимого диапазона

и для этого нет IndexErrors воскрес, когда нарезка списка, независимо какие start или stop параметров используются:

>>> egg = [1, "foo", list()] 
>>> egg[5:10] 
[] 

Поскольку список egg не содержит каких-либо индексов больше чем 2, egg[5] или egg[10] вызов будет поднимать IndexError:

>> egg[5] 
Traceback (most recent call last): 
IndexError: list index out of range 

Вопрос теперь, как мы можем поднять IndexError, когда оба дали индексы среза находятся за пределами допустимого диапазона?

+0

Почему нет? Потому что пустой результат среза по-прежнему является действительным объектом. Если вы хотите поднять исключения, проверьте исходные и конечные индексы вручную или явно проверьте «len (egg)» на ваши границы. –

+0

@MartijnPieters: Спасибо за ваш ответ! Я не уверен, что это дубликат, потому что я спрашиваю о «Как поднять IndexError, когда вырезаете последовательность», а не «* Почему индекс резки за пределами диапазона работает *». Но поправьте меня, если я ошибаюсь :) – elegent

+0

Вы задали ** два ** вопроса, делая свой пост слишком широким. Я обманул вас к предыдущему вопросу, который отвечает первым, и предоставил вам варианты ответа на второй. –

ответ

1

Здесь нет серебряной пули; вы должны проверить обе границы:

def slice_out_of_bounds(sequence, start=None, end=None, step=1): 
    length = len(sequence) 
    if start is None: 
     start = 0 if step > 1 else length 
    if start < 0: 
     start = length - start 
    if end is None: 
     end = length if step > 1 else 0 
    if end < 0: 
     end = length - end 
    if not (0 <= start < length and 0 <= end <= length): 
     raise IndexError() 

Поскольку конечное значение в нарезке эксклюзивно, допускаются диапазон до length.

1

В Python 2 вы можете переопределить __getslice__ метод, таким образом:

class MyList(list): 
    def __getslice__(self, i, j): 
     len_ = len(self) 
     if i > len_ or j > len_: 
      raise IndexError('list index out of range') 
     return super(MyList, self).__getslice__(i, j) 

Затем использовать класс вместо list:

>>> egg = [1, "foo", list()] 
>>> egg = MyList(egg) 
>>> egg[5:10] 
Traceback (most recent call last): 
IndexError: list index out of range 
Смежные вопросы