How to avoid overflow errors

James Stroud jstroud at mbi.ucla.edu
Sat Sep 15 03:19:45 CEST 2007


Steven D'Aprano wrote:
> I thought that overflow errors would be a thing of the past now that 
> Python automatically converts ints to longs as needed. Unfortunately, 
> that is not the case.
> 
>>>> class MyInt(int):
> ...     pass
> ...
>>>> MyInt(sys.maxint)
> 2147483647
>>>> MyInt(sys.maxint+1)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> OverflowError: long int too large to convert to int
> 
> 
> How do I subclass int and/or long so that my class also auto-converts 
> only when needed?
> 
> 
> 

Use __new__.

py> import sys
py>
py> class MyLong(long):
...   pass
...
py> class MyInt(int):
...   def __new__(cls, *args, **kwargs):
...     try:
...       return int.__new__(cls, *args, **kwargs)
...     except OverflowError:
...       return MyLong(*args, **kwargs)
...
py> MyInt(sys.maxint**2)
4611686014132420609L
py> type(_)
<class '__main__.MyLong'>


James



More information about the Python-list mailing list