Какой питонический/быстрый способ проверить, является ли аргумент "key" пользовательского метода __getitem__ срезом?

У меня есть пользовательский тип Sequence. По сути, это обертка для списка плюс булевский флаг, и я хотел, чтобы он эмулировал обычное поведение неизменяемой последовательности.

Моя проблема заключается в нарезке. Я понимаю, что в Python 3 способ ее реализации - это метод __getitem__(key), который возвращает элемент, если %key - одиночный индекс, и нарезанную последовательность, если %key - объект slice. Но как я должен различать эти случаи?

У меня в принципе есть две гипотезы.

sliced_list = self.wrapped_list[key]
if isinstance(key, slice):
    return MyCustomSequenceType(sliced_list, boolean_flag)
return sliced_list

Но это зло, не так ли? Или

sliced_list = self.wrapped_list[key]
try:
    return MyCustomSequenceType(sliced_list, boolean_flag)
except TypeError:
    return sliced_list

Последняя выглядит более питонической. Он опирается на то, что MyCustomSequenceType.__init__(self, datas, flag) вызывает len(datas), поэтому вызывает TypeError, если %datas является целым числом. Но тогда, если __init__ вызовет TypeError для другого случайного вопроса, это будет невозможно отследить. Также http://wiki.cython.org/enhancements/numpy/getitem намекает, что isinstance быстрее (на самом деле более легко оптимизируемый).

Что же мне делать?

5
задан CommonGuy 27 May 2015 в 13:02
поделиться