[Python-Dev] Numeric conversions

David Abrahams David Abrahams" <david.abrahams@rcn.com
Sun, 2 Jun 2002 10:36:12 -0400


The following small program is giving me some unexpected results with
Python 2.2.1:

class Int(object):
    def __int__(self): return 10

class Float(object):
    def __float__(self): return 10.0

class Long(object):
    def __long__(self): return 10L

class Complex(object):
    def __complex__(self): return (10+0j)

def attempt(f,arg):
    try:
        return f(arg)
    except Exception,e:
        return str(e.__class__.__name__)+': '+str(e)

for f in int,float,long,complex:
    for t in Int,Float,Long,Complex:
        print f.__name__ + '(' + t.__name__ + ')\t\t',
        print attempt(f,t())

----- results ------

int(Int)                10
int(Float)              TypeError: object can't be converted to int
int(Long)               TypeError: object can't be converted to int
int(Complex)            TypeError: object can't be converted to int

*** OK, int() seems to work as expected

float(Int)              TypeError: float() needs a string argument
float(Float)            10.0
float(Long)             TypeError: float() needs a string argument
float(Complex)          TypeError: float() needs a string argument

*** float() seems to work, but what's with the error message about strings?

long(Int)               TypeError: object can't be converted to long
long(Float)             TypeError: object can't be converted to long
long(Long)              10
long(Complex)           TypeError: object can't be converted to long

**** OK, long seems to work as expected

complex(Int)            TypeError: complex() arg can't be converted to
complex
complex(Float)          (10+0j)
complex(Long)           TypeError: complex() arg can't be converted to
complex
complex(Complex)        TypeError: complex() arg can't be converted to
complex

**** I can understand complex() handling Float implicitly, but only if it
also handles Complex! And if it does handle Float implicitly, shouldn't all
of these handle everything?

Comments?

-Dave

+---------------------------------------------------------------+
                  David Abrahams
      C++ Booster (http://www.boost.org)               O__  ==
      Pythonista (http://www.python.org)              c/ /'_ ==
  resume: http://users.rcn.com/abrahams/resume.html  (*) \(*) ==
          email: david.abrahams@rcn.com
+---------------------------------------------------------------+