Restrict format presentation types to those specified in the 'Standard Format Specifiers' section of PEP 3101.

This commit is contained in:
Eric Smith 2008-01-27 21:07:59 +00:00
parent 412dc9c88f
commit 7b69c6c3af
3 changed files with 23 additions and 86 deletions

View File

@ -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):

View File

@ -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'))

View File

@ -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':