В Python, при реализации типа последовательности, я часто (условно говоря) найти себе написание кода, как это:Как написать __getitem__ чисто?
class FooSequence(collections.abc.Sequence):
# Snip other methods
def __getitem__(self, key):
if isinstance(key, int):
# Get a single item
elif isinstance(key, slice):
# Get a whole slice
else:
raise TypeError('Index must be int, not {}'.format(type(key).__name__))
код проверяет тип аргумента явно с isinstance()
. Это regarded as an antipattern в сообществе Python. Как этого избежать?
- Я не могу использовать
functools.singledispatch
, потому что quite deliberately несовместимы с методами (он будет пытаться направить наself
, что совершенно бесполезно, так как мы уже диспетчеризация наself
через ООП полиморфизм). Он работает с@staticmethod
, но что, если мне нужно получить материал изself
? - Кастинг до
int()
, а затем ловлиTypeError
, проверка на ломтик и, возможно, повторное поднятие все еще некрасиво, хотя, возможно, немного меньше. - Возможно, было бы проще преобразовать целые числа в одноэлементные срезы и обрабатывать обе ситуации с одним и тем же кодом, но у этого есть свои проблемы (возврат
0
или[0]
?).
Конечно, язык * используется *, чтобы сделать это для нас с '__getslice__', но это устарело, что заставляет меня задуматься о надежности всей техники. – Kevin
@ Кевин, он устарел по разным причинам. Они хотели создать объект 'slice', но' __getslice__' взял аргументы 'i' и' j'. Это сломало бы обратную совместимость. –