В Python при реализации типа последовательности я часто (относительно говоря) нахожу, что пишу код следующим образом:
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()
. Это рассматривается как антипаттерн в сообществе Python. Как его избежать?
- Я не могу использовать
functools.singledispatch
, потому что сознательно несовместим с методами (он попытается отправитьself
, что совершенно бесполезно, поскольку мы уже отправив наself
через полиморфизм ООП). Он работает с@staticmethod
, но что, если мне нужно получить материал изself
? - Листинг
int()
, а затем захватTypeError
, проверка на фрагмент и, возможно, повторное поднятие, все еще некрасиво, хотя, возможно, немного меньше. - Возможно, было бы проще преобразовать целые числа в одноэлементные срезы и обрабатывать обе ситуации с одним и тем же кодом, но у него есть свои проблемы (return
0
или[0]
?).