OverflowError: Python中的整数过大,无法转换为C语言的长整型。

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__方法,以便仅在self.sim.in_observe_window()返回True时执行加法。

但是,如果初始值太大,会出现以下错误:

OverflowError:Python整数太大,无法转换为C长。

我试图做的事情正确的方法是什么,如何处理大数?

3个回答

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。我猜这还不错,如果它能避免奇怪的错误。


7
你是否在使用Python 2.6?你可以尝试子类化long
但一般情况下,我强烈建议不要对Python内置类型进行子类化;CPython保留跳过此类类型的特殊方法调用的权利,例如不会在str的子类上调用__str__。你在这里的示例是有效的,但可能会引发错误。
相反地,考虑委托,并委托你想要的操作符。(当然,你可能也需要__int__。)

4
我有Python 2.7的问题,但我需要我的代码能够兼容Python2和Python3。 - Maxime Chéramy

2

我曾经遇到过类似的问题,通过将大数转换为整数int(bigNumber)解决了。但我认为在你的情况下这太简单了。

你可以尝试使用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

感谢原作者。

您可以通过此函数传递溢出的值并将其规范化。

最好的问候


请问您能否解释一下这个函数是如何操作的以及为什么会这样工作吗? - Erdss4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接