Barry Alan Scott <[EMAIL PROTECTED]> added the comment:

O.k. I know what is going on.

Here is the description from abstracts.h for PyNumber_Long:

     PyAPI_FUNC(PyObject *) PyNumber_Long(PyObject *o);

       /*
         Returns the o converted to a long integer object on success,
         or NULL on failure.  This is the equivalent of the Python
         expression: long(o).

       */

Its says that I can expect a long integer. However PyNumber_long
can return an int or a long.

PyCXX checks for a long, but an int is not a long and I raise
a type error.

This is a contract break on the Python API.

The change that causes this break is in floatobject.c
>From 2.5.2 code:

static PyNumberMethods float_as_number = {
...
        float_int,      /*nb_int*/
        float_long,     /*nb_long*/

>From 2.6b3 code:

static PyNumberMethods float_as_number = {
...
        float_trunc,    /*nb_int*/
        float_trunc,    /*nb_long*/

float_trunc returns either an int or a long.
Which is not what is required for the API.

Here is the same bug at the pure python level.

 $ python2.6
Python 2.6b3 (r26b3:65922, Aug 25 2008, 15:44:46) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> long(4)
4L
>>> long(4.3)
4
>>> long("6")
6L
>>> type(long(4.3))
<type 'int'>
>>> 

Barry

_______________________________________
Python tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue3777>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to