From 7b69c6c3afba79518865313e1b41845a6b534fb6 Mon Sep 17 00:00:00 2001 From: Eric Smith Date: Sun, 27 Jan 2008 21:07:59 +0000 Subject: Restrict format presentation types to those specified in the 'Standard Format Specifiers' section of PEP 3101. --- Lib/test/test_float.py | 15 +++++++-- Lib/test/test_long.py | 17 ++++++---- Objects/stringlib/formatter.h | 77 ------------------------------------------- 3 files changed, 23 insertions(+), 86 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 0de65cb..b9ad8c5 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -133,13 +133,10 @@ class FormatTestCase(unittest.TestCase): self.assertEqual(format(0.01, ''), '0.01') self.assertEqual(format(0.01, 'g'), '0.01') - self.assertEqual(format(0, 'f'), '0.000000') self.assertEqual(format(1.0, 'f'), '1.000000') - self.assertEqual(format(1, 'f'), '1.000000') self.assertEqual(format(-1.0, 'f'), '-1.000000') - self.assertEqual(format(-1, 'f'), '-1.000000') self.assertEqual(format( 1.0, ' f'), ' 1.000000') self.assertEqual(format(-1.0, ' f'), '-1.000000') @@ -152,6 +149,18 @@ class FormatTestCase(unittest.TestCase): # conversion to string should fail self.assertRaises(ValueError, format, 3.0, "s") + # other format specifiers shouldn't work on floats, + # in particular int specifiers + 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 'eEfFgGn%': + self.assertRaises(ValueError, format, 0.0, format_spec) + self.assertRaises(ValueError, format, 1.0, format_spec) + self.assertRaises(ValueError, format, -1.0, format_spec) + self.assertRaises(ValueError, format, 1e100, format_spec) + self.assertRaises(ValueError, format, -1e100, format_spec) + self.assertRaises(ValueError, format, 1e-100, format_spec) + self.assertRaises(ValueError, format, -1e-100, format_spec) class ReprTestCase(unittest.TestCase): def test_repr(self): diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 18bb7a4..2c9e2d0 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -526,16 +526,21 @@ class LongTest(unittest.TestCase): self.assertEqual(format(1234, "+b"), "+10011010010") self.assertEqual(format(-1234, "+b"), "-10011010010") - # conversion to float - self.assertEqual(format(0, 'f'), '0.000000') - # make sure these are errors self.assertRaises(ValueError, format, 3, "1.3") # precision disallowed self.assertRaises(ValueError, format, 3, "+c") # sign not allowed # with 'c' - self.assertRaises(ValueError, format, 3, "R") # bogus format type - # conversion to string should fail - self.assertRaises(ValueError, format, 3, "s") + # other format specifiers shouldn't work on ints, + # in particular float and string specifiers + 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': + 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) + def test_nan_inf(self): self.assertRaises(OverflowError, int, float('inf')) diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h index b4f6e3c..49b3566 100644 --- a/Objects/stringlib/formatter.h +++ b/Objects/stringlib/formatter.h @@ -788,37 +788,6 @@ FORMAT_STRING(PyObject* value, PyObject* args) /* no type conversion needed, already a string. do the formatting */ result = format_string_internal(value, &format); break; -#if 0 - case 'b': - case 'c': - case 'd': - case 'o': - case 'x': - case 'X': - /* convert to integer */ - /* XXX: make a stringlib function to do this when backporting, - since FromUnicode differs from FromString */ - tmp = PyLong_FromUnicode(STRINGLIB_STR(value), STRINGLIB_LEN(value), 0); - if (tmp == NULL) - goto done; - result = format_long_internal(tmp, &format); - break; - - case 'e': - case 'E': - case 'f': - case 'F': - case 'g': - case 'G': - case 'n': - case '%': - /* convert to float */ - tmp = PyFloat_FromString(value); - if (tmp == NULL) - goto done; - result = format_float_internal(tmp, &format); - break; -#endif default: /* unknown */ PyErr_Format(PyExc_ValueError, "Unknown conversion type %c", @@ -855,15 +824,6 @@ FORMAT_LONG(PyObject* value, PyObject* args) /* type conversion? */ switch (format.type) { -#if 0 - case 's': - /* convert to string/unicode */ - tmp = STRINGLIB_TOSTR(value); - if (tmp == NULL) - goto done; - result = format_string_internal(tmp, &format); - break; -#endif case 'b': case 'c': case 'd': @@ -874,21 +834,6 @@ 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", @@ -925,28 +870,6 @@ FORMAT_FLOAT(PyObject *value, PyObject *args) /* type conversion? */ switch (format.type) { -#if 0 - case 's': - /* convert to string/unicode */ - tmp = STRINGLIB_TOSTR(value); - if (tmp == NULL) - goto done; - result = format_string_internal(tmp, &format); - break; -#endif - case 'b': - case 'c': - case 'd': - case 'o': - case 'x': - case 'X': - /* convert to integer */ - tmp = PyNumber_Long(value); - if (tmp == NULL) - goto done; - result = format_long_internal(tmp, &format); - break; - case 'e': case 'E': case 'f': -- cgit v0.12