OverflowError:Python int太大而无法转换为C long

时间:2013-10-29 23:30:27

标签: python

我有这堂课:

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__返回self.sim.in_observe_window(),那么基本上会覆盖True方法,以便仅添加{。}}。

但是,如果初始值太大,我会OverflowError: Python int too large to convert to C long

我正在尝试做什么以及处理大数字的正确方法是什么?

3 个答案:

答案 0 :(得分:7)

您使用的是Python 2.6吗?您可以尝试对long进行子类化。

但总的来说,我强烈建议不要继承Python内置类型; CPython保留跳过对此类型的特殊方法的调用的权利,例如,不会在__str__的子类上调用str。你的例子在这里有效,但你可能会要求提出错误。

考虑委派代理,并委托您想要的运算符。 (当然,您可能还需要__int__。)

答案 1 :(得分: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添加一些强制转换。如果它避免了奇怪的错误,那就不错了。

答案 2 :(得分: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

致作者的信用。

您可以通过此函数传递溢出值并使其标准化。

祝你好运