__add__
を実装しているがサブクラス化していないPython オブジェクトを使用していint
ます。MyObj1 + MyObj2
正常に動作しますがsum([MyObj1, MyObj2])
、TypeError
最初sum()
に0 + MyObj
. を使用するsum()
には、オブジェクト__radd__
を処理するMyObj + 0
か、パラメーターとして空のオブジェクトを指定する必要がありstart
ます。問題のオブジェクトは空になるように設計されていません。
誰かが尋ねる前に、オブジェクトはリストのようなものでも文字列のようなものでもないので、join() や itertools を使用しても役に立ちません。
詳細を編集:モジュールには SimpleLocation と CompoundLocation があります。Location を Loc に略します。ASimpleLoc
には右開き区間が 1 つ、つまり [start, end) が含まれます。追加すると、間隔のリストを含む がSimpleLoc
生成されます。最終用途には、長さのチェックやメンバーシップのチェックなど、共用体の反復が含まれます。CompoundLoc
[[3, 6), [10, 13)]
[3, 4, 5, 10, 11, 12]
数値は比較的大きくなる可能性があります (たとえば、2^32 より小さいが、通常は 2^20 です)。間隔はおそらく極端に長くはなりません (100 ~ 2000 ですが、それより長くなる可能性があります)。現在、エンドポイントのみが保存されています。私は現在set
、場所が として構築されるようにサブクラス化しようと暫定的に考えていset(xrange(start, end))
ます。ただし、セットを追加すると、Python (および数学者) が適合します。
私が見た質問:
私は2つの解決策を考えています。1 つは、このコメントsum()
で提供されているループを回避して使用することです。0番目と1番目のアイテムを追加するのではなく、イテラブルの0番目のアイテムを0に追加することから始まる理由がわかりません(リンクされたコメントのループのように); 難解な整数最適化の理由があることを願っています。sum()
私の他の解決策は次のとおりです。ハードコーディングされたゼロチェックは好きではありませんが、それが私が機能させることができた唯一の方法sum()
です。
# ...
def __radd__(self, other):
# This allows sum() to work (the default start value is zero)
if other == 0:
return self
return self.__add__(other)
要約すると、sum()
整数に追加することも空にすることもできないオブジェクトで使用する別の方法はありますか?