Strange behaviour: subclass of int returns 3 when constructed with long
Alex Martelli
aleax at aleax.it
Sun Feb 9 10:43:14 EST 2003
Gerrit Holl wrote:
> Hi,
>
> 0 >>> class A(int): pass
> 0 ...
> 1 >>> int(sys.maxint)
> 2147483647
> 2 >>> A(sys.maxint)
> 2147483647
> 3 >>> int(sys.maxint+1)
> 2147483648L
> 4 >>> A(sys.maxint+1)
> 3
> 5 >>> A(sys.maxint+42)
> 3
> 6 >>> int(A(sys.maxint+1))
> 3
In Python 2.3a1, this behavior is indeed reproducible on my
system, too.
> how can this behaviour be explained? Shouldn't A behave identical to int?
int has acquired some magic to generate long instead when needed,
as in your statement number 3. It apppears the magic isn't
smoothly inherited in 2.3a1. You may want to signal this bug
in the sourceforge bug tracker.
I think the problem is with int.__new__ being specialcased ONLY
when the class it receives as its argument is int itself -- e.g.:
class A(int):
def __new__(cls, x): return int.__new__(cls, x)
import sys
print A(sys.maxint+1)
class B(int):
def __new__(cls, x): return int.__new__(int, x)
import sys
print B(sys.maxint+1)
the first case exhibits the bug, the second one doesn't --
so int.__new__ does seem to be the culprit here. It may
be using (the C equivalent of) 'cls is int' to condition
its magic, perhaps (haven't checked this in the 2.3a1
Python C sources).
Alex
More information about the Python-list
mailing list