5

不変の無限シーケンスとして機能する python クラスを作成しています。

このクラスは、ジェネレータを使用してこの無限シーケンスにアクセスするのではなく、メソッド内のアルゴリズムに従って、シーケンス内の任意のインデックスの値を生成します__getitem__

__len__そのようなオブジェクトのメソッドを処理する最良の方法は何なのか興味があります。理想的には、私はそのまま戻っfloat("inf")てき__len__ます。ただし、バックグラウンドでlen()オブジェクトのメソッドを呼び出す関数には、ある程度特定の値が必要です。__len__

__len__float("inf") または decimal.Decimal("Infinity") を返すように設定されている場合len()、TypeError を発生させて拒否します。また、シーケンスが無限であることを意味する "-1" の値も拒否します。さらに、たまたま以前に書いた無限クラスを使ってみたところ、実際にから継承されintlen()何らかの理由で 0 が返されました。

値を「0」にすることは大きな不便ではありませんが、このようなクラスは非常に珍しいものですが、クラスの長さ属性を処理する良い方法はありますか?それは無限のシーケンスですか?

4

4 に答える 4

5

__len__()有効な整数を返す必要があります。できないため、シーケンスが常に無限である場合は を実装しないか、意味のある長さを与えることができる場合は a を__len__()上げる必要があります。ValueError

于 2015-12-31T03:00:46.633 に答える
3

前述のように、ドキュメントで__len__は整数 >= 0を返す必要があるため、TypeError.

無限によって設定された例に従い、長さがないことを示すitertools.cycle適切な値を上げます。TypeError

from itertools import cycle
c = cycle("a")
len(c)

TypeError: object of type 'itertools.cycle' has no len()
于 2015-12-31T03:26:43.667 に答える
3

__len__実際、オブジェクトには長さがないため、唯一の合理的な解決策はまったく実装しないことだと思います。

于 2015-12-31T03:00:50.833 に答える
3

このクラスを定義しないでください__len__。これは意味的に答えることが不可能だからです。

于 2015-12-31T03:01:14.933 に答える