Restrict format presentation types to those specified in the 'Standard Format Specifiers' section of PEP 3101.
This commit is contained in:
parent
412dc9c88f
commit
7b69c6c3af
|
@ -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):
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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':
|
||||
|
|
Loading…
Reference in New Issue