溢出错误:Python int太大,无法转换为C long
我有这门课:溢出错误:Python int太大,无法转换为C long,python,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) s
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
这基本上覆盖了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
但是,如果初始值太大,我有:
溢出错误:Python int太大,无法转换为C long
什么是正确的方法来做我正在尝试做的事情并处理大数字?我解决了一个类似的问题,将它转换为int和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
def int_溢出(val):
如果不是-sys.maxint-1您是否使用Python 2.6?您可以尝试子类化long
但总的来说,我强烈建议不要将Python内置类型子类化;CPython保留跳过对此类类型的特殊方法的调用的权利,例如,不会对str
的子类调用\uuuuuuuu
。这里的示例是有效的,但您可能会询问bug
考虑授权,并授权您想要的操作员。(当然,你也可能想要\uuuu int\uuuu
)我喜欢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
变量,不想对代码做太多更改。但是,如果我定义了\uuuu int\uuu
和\uu float\uuu
,我只需要向int
添加一些强制转换。我想如果它能避免奇怪的bug,那也没那么糟糕。我对Python 2.7有问题,但我需要我的代码与Python2和Python3兼容。你能解释一下该函数是如何工作的以及为什么工作的吗?