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

但是,如果初始值太大,我有:

溢出错误: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__and __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 回答