9

私はこのクラスを持っています:

class MetricInt(int):
    """Int wrapper that adds only during the observation window."""
    def __new__(cls, _, initial):
        return int.__new__(cls, initial)

    def __init__(self, sim, initial):
        int.__init__(initial)
        self.sim = sim

    def __add__(self, val):
        if self.sim.in_observe_window():
            self = MetricInt(self.sim, super(MetricInt, self).__add__(int(val)))
        return self

基本的に__add__メソッドを上書きするだけで、 ifself.sim.in_observe_window()が返されますTrue

ただし、初期値が大きすぎる場合は、次のようになります。

OverflowError: Python int が大きすぎて C long に変換できません。

私がやろうとしていることを実行し、大きな数字を処理する正しい方法は何ですか?

4

3 に答える 3

7

Python 2.6 を使用していますか? long代わりにサブクラス化を試すことができます。

しかし、一般的には、Python の組み込み型をサブクラス化しないことを強くお勧めします。CPython は、そのような型の特別なメソッドへの呼び出しをスキップする権利を留保します。たとえば__str__、 のサブクラスでは呼び出しませんstr。ここでの例は機能しますが、バグを求めている可能性があります。

代わりに委譲を検討し、必要なオペレーターを委譲してください。(もちろん、 も必要__int__な場合があります。)

于 2013-10-29T23:42:49.370 に答える
7

代わりに、委任に関する Eevee の回答が気に入っています。彼はコードを提供していないので、私はそれをやっています:

class MetricInt(object):
    """Int wrapper that adds only during the observation window."""
    def __init__(self, sim, initial):
        self.sim = sim
        self.val = int(initial)

    def __add__(self, val):
        if self.sim.in_observe_window():
            self.val += int(val)
        return self

    def __int__(self):
        return self.val

    def __float__(self):
        return float(self.val)

このようにして、問題は解決されます。型をサブクラス化することにしたのは、コードintに既にいくつかのint変数があり、コードをあまり変更したくなかったからです。ただし、 と を定義する__int____float__、 にいくつかのキャストを追加するだけで済みますint。奇妙なバグを回避できれば、それほど悪くはないと思います。

于 2013-10-30T00:17:28.287 に答える
2

int(bigNumber) を使用して int にキャストする同様の問題を解決しましたが、あなたの場合は簡単だと思います。あなたはnumpyで試すことができます:

numpy.int32(Your big number)

そして、どこかで見つけたこれらは、今では思い出せません:

def int_overflow(val):
  if not -sys.maxint-1 <= val <= sys.maxint:
    val = (val + (sys.maxint + 1)) % (2 * (sys.maxint + 1)) - sys.maxint - 1
  return val

著者へのクレジット。

オーバーフローした値をこの関数に渡して、正規化することができます。

よろしくお願いします

于 2013-10-29T23:40:49.953 に答える