簡體   English   中英

溢出錯誤:Python int 太大而無法轉換為 C long

[英]OverflowError: Python int too large to convert to C long

我有這門課:

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

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

溢出錯誤:Python int 太大,無法轉換為 C long。

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

您使用的是 Python 2.6 嗎? 您可以嘗試對long子類化。

但總的來說,我強烈建議不要對 Python 內置類型進行子類化; CPython 保留跳過對此類類型的特殊方法的調用的權利,例如不會在str的子類上調用__str__ 您的示例在這里有效,但您可能會要求提供錯誤。

考慮委托,並委托您想要的操作員。 (當然,您可能還需要__int__ 。)

我喜歡 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添加一些強制轉換。 如果它避免了奇怪的錯誤,我想這並沒有那么糟糕。

我解決了一個類似的問題,用 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

感謝作者。

您可以通過此函數傳遞溢出的值並對其進行規范化。

最好的問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM