]> granicus.if.org Git - python/commitdiff
#3777: long(4.2) returned an int, and broke backward compatibility.
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 9 Sep 2008 07:24:30 +0000 (07:24 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 9 Sep 2008 07:24:30 +0000 (07:24 +0000)
the __long__ slot is allowed to return either int or long, but the behaviour of
float objects should not change between 2.5 and 2.6.

Reviewed by Benjamin Peterson

Lib/test/test_long.py
Misc/NEWS
Objects/floatobject.c

index e53fd058cf36953d4a410d1586fc632d30e3da2c..5addd2e87584d004ec6e65eec6fb165bf0794a66 100644 (file)
@@ -279,6 +279,10 @@ class LongTest(unittest.TestCase):
         self.assertEqual(long(314), 314L)
         self.assertEqual(long(3.14), 3L)
         self.assertEqual(long(314L), 314L)
+        # Check that long() of basic types actually returns a long
+        self.assertEqual(type(long(314)), long)
+        self.assertEqual(type(long(3.14)), long)
+        self.assertEqual(type(long(314L)), long)
         # Check that conversion from float truncates towards zero
         self.assertEqual(long(-3.14), -3L)
         self.assertEqual(long(3.9), 3L)
index b7da5f1b89040e6c79df007a3825ca225f876c1c..662452177177a522b1a540a16f56fe3fb87dd49a 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,11 @@ What's New in Python 2.6 release candidate 1?
 Core and Builtins
 -----------------
 
+- Issue #3777: long() applied to a float object now always return a long
+  object; previously an int would be returned for small values. the __long__
+  method is allowed to return either an int or a long, but the behaviour of
+  float objects should not change to respect backward compatibility.
+
 - Issue #3751: str.rpartition would perform a left-partition when called with
   a unicode argument.
 
index 0b067eb37c4b367ea33aa048f2a9cff819713e35..cb388009b4526d58119c8c196bc9752958eae8a2 100644 (file)
@@ -1104,6 +1104,13 @@ float_trunc(PyObject *v)
        return PyLong_FromDouble(wholepart);
 }
 
+static PyObject *
+float_long(PyObject *v)
+{
+       double x = PyFloat_AsDouble(v);
+       return PyLong_FromDouble(x);
+}
+
 static PyObject *
 float_float(PyObject *v)
 {
@@ -1897,7 +1904,7 @@ static PyNumberMethods float_as_number = {
        0,              /*nb_or*/
        float_coerce,   /*nb_coerce*/
        float_trunc,    /*nb_int*/
-       float_trunc,    /*nb_long*/
+       float_long,     /*nb_long*/
        float_float,    /*nb_float*/
        0,              /* nb_oct */
        0,              /* nb_hex */