]> granicus.if.org Git - python/commitdiff
Partially revert r60376: restore ability for ints to be automatically converted to...
authorEric Smith <eric@trueblade.com>
Mon, 28 Jan 2008 10:59:27 +0000 (10:59 +0000)
committerEric Smith <eric@trueblade.com>
Mon, 28 Jan 2008 10:59:27 +0000 (10:59 +0000)
Lib/test/test_long.py
Objects/stringlib/formatter.h

index 2c9e2d098a3a7ca2b0337d369d6ff03167843dcc..8eb09d155e569e298406851390b01cc4821b3eb2 100644 (file)
@@ -530,17 +530,23 @@ class LongTest(unittest.TestCase):
         self.assertRaises(ValueError, format, 3, "1.3")  # precision disallowed
         self.assertRaises(ValueError, format, 3, "+c")   # sign not allowed
                                                          # with 'c'
-        # other format specifiers shouldn't work on ints,
-        #  in particular float and string specifiers
+
+        # ensure that only int and float type specifiers work
         for format_spec in ([chr(x) for x in range(ord('a'), ord('z')+1)] +
                             [chr(x) for x in range(ord('A'), ord('Z')+1)]):
-            if not format_spec in 'bcdoxX':
+            if not format_spec in 'bcdoxXeEfFgGn%':
                 self.assertRaises(ValueError, format, 0, format_spec)
                 self.assertRaises(ValueError, format, 1, format_spec)
                 self.assertRaises(ValueError, format, -1, format_spec)
                 self.assertRaises(ValueError, format, 2**100, format_spec)
                 self.assertRaises(ValueError, format, -(2**100), format_spec)
 
+        # ensure that float type specifiers work; format converts
+        #  the int to a float
+        for format_spec in 'eEfFgGn%':
+            for value in [0, 1, -1, 100, -100, 1234567890, -1234567890]:
+                self.assertEqual(format(value, format_spec),
+                                 format(float(value), format_spec))
 
     def test_nan_inf(self):
         self.assertRaises(OverflowError, int, float('inf'))
index 49b3566796ea83344deb6e67f5773240c67815c5..2ff729026650b109c2f9d08f146f5bd0aafc1e01 100644 (file)
@@ -764,7 +764,6 @@ PyObject *
 FORMAT_STRING(PyObject* value, PyObject* args)
 {
     PyObject *format_spec;
-    PyObject *tmp = NULL;
     PyObject *result = NULL;
     InternalFormatSpec format;
 
@@ -796,7 +795,6 @@ FORMAT_STRING(PyObject* value, PyObject* args)
     }
 
 done:
-    Py_XDECREF(tmp);
     return result;
 }
 
@@ -834,6 +832,21 @@ FORMAT_LONG(PyObject* value, PyObject* args)
         result = format_long_internal(value, &format);
         break;
 
+    case 'e':
+    case 'E':
+    case 'f':
+    case 'F':
+    case 'g':
+    case 'G':
+    case 'n':
+    case '%':
+        /* convert to float */
+        tmp = PyNumber_Float(value);
+        if (tmp == NULL)
+            goto done;
+        result = format_float_internal(value, &format);
+        break;
+
     default:
         /* unknown */
         PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
@@ -851,7 +864,6 @@ FORMAT_FLOAT(PyObject *value, PyObject *args)
 {
     PyObject *format_spec;
     PyObject *result = NULL;
-    PyObject *tmp = NULL;
     InternalFormatSpec format;
 
     if (!PyArg_ParseTuple(args, STRINGLIB_PARSE_CODE ":__format__", &format_spec))
@@ -890,6 +902,5 @@ FORMAT_FLOAT(PyObject *value, PyObject *args)
     }
 
 done:
-    Py_XDECREF(tmp);
     return result;
 }