公式のドキュメントだと、これでしょうか。
https://docs.python.org/ja/3/reference/expressions.html#membership-test-operations
最終的には、旧式の反復プロトコルの実行を試みます、もし __getitem__() を定義しているようなユーザ定義クラスでは、 x in y は x is y[i] or x == y[i] となるような非負の整数インデクス i が存在し、それより小さい整数インデクスが IndexError を送出しないとき、かつそのときにかぎり True となります。 (別の何らかの例外が送出された場合、例外は in から送出されたかのようになります)。
この文章からだと、__getitem__(i) に対して、 i を 0 から順に 1, 2, ... と IndexError が出るまで試して行って、一致するものがあるかを調べているような感じかと思われます。
質問にあるクラスでは、__getitem(i)__ は存在しない i に対しては、None を返して IndexError が発生することはないので、永遠に i を大きくしながら調べ続けることになるのではないでしょうか。
どうしたらよいかは、やりたいこと次第かと思いますが、このクラスで __getitem__ を使って in をoverload するのは難しいように思います。
ちなみに、下記とかだと True になります。(正の数値がkeyで値が存在する場合のみ)
python
1hello[5] = 'foo'2print('foo' in hello)

0 コメント