__getitem__ for in

Python で自作クラスに __getitem__ を定義すれば for 文が使えるようになる。
しかし場合によっては無限大になったり存在しない値を戻したりしかねない。

len から自前で最大値を取得して、という方法ではないようだ。
for 文はいったい何を基準で抜けているのか。

配列の範囲外を得ようとすると IndexError の例外を投げてくる。
ということはコレを利用して for 文を抜けているのだろうか。
下記の __getitem__ が無限になってしまうコードに入れて実験。

#!/usr/bin/env python3

class Test():
    def __getitem__(self, n):
        if n > 3:
            raise IndexError
        return n * 2

t = Test()

for n in t:
    print(n)

'''output
0
2
4
6
'''

なるほど。

Poppler で範囲外を指定すると None を戻すだけで例外にならず親でエラーになっていた。
cbz 等は self.namelist が IndexError を吐いて親に raise していただけ。
Python が用意してくれた例外に頼らず自身で raise していこう。