私はちょっとここで立ち往生しています。私は基本的に実験段階にあり、算術演算の場合に 1 として機能する「不明な」値を割り当てることができることを除いて、それがあなたint
の古き良きものとまったく同じように機能するようにサブクラス化できるかどうか疑問に思いますint
.
私が言うことができるように:
>>> uint(5) + 5
10
>>> uint('unknown')
unknown
>>> int(uint('unknown'))
1
>>> uint('unknown') + 5
6
>>>
実際、float('inf')
必要なのは整数と単一の「特別な」値だけであることを除けば、すでに で動作しているものと何らかの形で似ています。
私が想像していたのは、次のようなものです。
class uint(int):
def __init__(self, value):
self.value = value
self.unknown = self.value == "unknown"
def __int__(self):
return 1 if self.unknown else self.value
def __str__(self):
return "unknown" if self.unknown else str(self.value)
ValueError: invalid literal for int() with base 10: 'unknown'
しかし、この例は、インスタンス化しようとするとスローされuint('unknown')
ます。
それで、これは可能ですか?どうすればそれについて行くでしょうか?
背景レベル 1
誰かが尋ねた場合に備えて、背景は、イテラブルのリストがあり、を使用して新しいリストを作成したいということですitertools.product
。__len__
しかし、前に、一部のイテレーターがそれを実装する場合に備えて、最終要素の (最小) 数を推測できるようにするために を利用したいと考えています。したがって、最終的な数値に関しては、 を持たない iterable については__len__
、1 と想定しています。
私がこれをやりたい理由class uint(int)
は、個別のカウントを安全に公開できるようにしたいからです (誰かが "loading (1500 = 10 * 10 * unknown * 15) elements" のようなログをプッシュして、まだ通過できるようにするためです)。それらのいくつかは「不明」であるという情報について。
背景レベル 2
ライブラリが反復可能なオブジェクトの定義で使用するためにこのクラスを提供する状況を実際に空想している__len__
ので、「最小」、「最大」、または「最良の推測」のいずれかに基づいて数値を返すことができますが、まだそうではありませんいくつかの単純な数学でさらに使用することに悩まされています。
>>> count = uint(100, 'minimum')
>>> print count
"minimum of 100"
>>> count * 20
2000
>>>
巨大なファイルを読み取る反復子を持つオブジェクトを想像してみてください。なぜオブジェクトは「まあ、ファイルは 400 MiB なので、少なくとも 4,000 レコードあるでしょう」と言うことができなかったのでしょうか?
おまけの質問: どちらが簡単ですか: int をサブクラス化するか、新しいクラスを作成しますが、算術演算用のインターフェイスを実装して維持する必要がありますか?