__getitem__ превращает объект Python в итерируемыйДля цикла
for объекту не всегда нужен __iter__. Если класс принимает целые индексы от 0, Python последовательно запрашивает элементы с индексами 0, 1, 2 и так далее. Получив IndexError, интерпретатор считает последовательность законченной.В примере из статьи арифметическая последовательность вычисляет элемент по формуле прямо в
__getitem__: seq[3] возвращает 14, а тот же объект без дополнительного метода работает в цикле.Проверять поддержку целочисленных индексов заранее Python не станет. Поэтому обёртка над словарём выдаёт значения для ключей 0 и 1, а на ключе 2 падает с
KeyError: эта ошибка не означает конец итерации. Механику и код можно посмотреть в статье Indexable iterables.
