У меня есть пользовательский тип 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
быстрее (на самом деле более легко оптимизируемый).
Что же мне делать?