[Python-checkins] r66332 - in python/trunk: Lib/test/test_long.py Misc/NEWS Objects/floatobject.c

amaury.forgeotdarc python-checkins at python.org
Tue Sep 9 09:24:30 CEST 2008


Author: amaury.forgeotdarc
Date: Tue Sep  9 09:24:30 2008
New Revision: 66332

Log:
#3777: long(4.2) returned an int, and broke backward compatibility.
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


Modified:
   python/trunk/Lib/test/test_long.py
   python/trunk/Misc/NEWS
   python/trunk/Objects/floatobject.c

Modified: python/trunk/Lib/test/test_long.py
==============================================================================
--- python/trunk/Lib/test/test_long.py	(original)
+++ python/trunk/Lib/test/test_long.py	Tue Sep  9 09:24:30 2008
@@ -279,6 +279,10 @@
         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)

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Tue Sep  9 09:24:30 2008
@@ -12,6 +12,11 @@
 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.
 

Modified: python/trunk/Objects/floatobject.c
==============================================================================
--- python/trunk/Objects/floatobject.c	(original)
+++ python/trunk/Objects/floatobject.c	Tue Sep  9 09:24:30 2008
@@ -1105,6 +1105,13 @@
 }
 
 static PyObject *
+float_long(PyObject *v)
+{
+	double x = PyFloat_AsDouble(v);
+	return PyLong_FromDouble(x);
+}
+
+static PyObject *
 float_float(PyObject *v)
 {
 	if (PyFloat_CheckExact(v))
@@ -1897,7 +1904,7 @@
 	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 */


More information about the Python-checkins mailing list