2013-10-29 132 views
9

我有這個類:OverflowError:Python的詮釋太大,轉換爲C長

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

什麼是正確的方法來做我想做的事情,並處理大數字?

回答

7

你在Python 2.6嗎?您可以嘗試子類long

但總的來說,我強烈建議不要繼承Python的內置類型; CPython保留跳過對這些類型的特殊方法的調用的權利,例如,不會在str的子類上調用__str__。你的例子在這裏工作,但你可能會問bug。

考慮委託,並委派你想要的運營商。 (當然,您可能還需要__int__。)

+4

我有Python 2.7的問題,但我需要我的代碼與Python2和Python3兼容。 –

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 

學分給作者。

您可以通過此函數傳遞溢出值並使其歸一化。

祝你好運

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。這不是那麼糟糕,我想如果它可以避免怪異的錯誤。