[英]Python error - OverflowError: Python int too large to convert to 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.