Issue #5247: Improve error message when unknown format codes are used when using str.format() with str, unicode, long, int, and float arguments.

This commit is contained in:
Eric Smith 2009-02-20 14:02:36 +00:00
parent 8b8c2df9b1
commit e9fb6863da
2 changed files with 35 additions and 17 deletions

View File

@ -12,6 +12,10 @@ What's New in Python 2.7 alpha 1
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #5247: Improve error message when unknown format codes are
used when using str.format() with str, unicode, long, int, and
float arguments.
- Running Python with the -3 option now also warns about classic division - Running Python with the -3 option now also warns about classic division
for ints and longs. for ints and longs.

View File

@ -15,6 +15,34 @@
#define ALLOW_PARENS_FOR_SIGN 0 #define ALLOW_PARENS_FOR_SIGN 0
/* Raises an exception about an unknown presentation type for this
* type. */
static void
unknown_presentation_type(STRINGLIB_CHAR presentation_type,
const char* type_name)
{
#if STRINGLIB_IS_UNICODE
/* If STRINGLIB_CHAR is Py_UNICODE, %c might be out-of-range,
hence the two cases. If it is char, gcc complains that the
condition below is always true, hence the ifdef. */
if (presentation_type > 32 && presentation_type < 128)
#endif
PyErr_Format(PyExc_ValueError,
"Unknown format code '%c' "
"for object of type '%.200s'",
presentation_type,
type_name);
#if STRINGLIB_IS_UNICODE
else
PyErr_Format(PyExc_ValueError,
"Unknown format code '\\x%x' "
"for object of type '%.200s'",
(unsigned int)presentation_type,
type_name);
#endif
}
/* /*
get_integer consumes 0 or more decimal digit characters from an get_integer consumes 0 or more decimal digit characters from an
input string, updates *result with the corresponding positive input string, updates *result with the corresponding positive
@ -854,19 +882,7 @@ FORMAT_STRING(PyObject *obj,
break; break;
default: default:
/* unknown */ /* unknown */
#if STRINGLIB_IS_UNICODE unknown_presentation_type(format.type, obj->ob_type->tp_name);
/* If STRINGLIB_CHAR is Py_UNICODE, %c might be out-of-range,
hence the two cases. If it is char, gcc complains that the
condition below is always true, hence the ifdef. */
if (format.type > 32 && format.type <128)
#endif
PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
(char)format.type);
#if STRINGLIB_IS_UNICODE
else
PyErr_Format(PyExc_ValueError, "Unknown conversion type '\\x%x'",
(unsigned int)format.type);
#endif
goto done; goto done;
} }
@ -928,8 +944,7 @@ format_int_or_long(PyObject* obj,
default: default:
/* unknown */ /* unknown */
PyErr_Format(PyExc_ValueError, "Unknown conversion type %c", unknown_presentation_type(format.type, obj->ob_type->tp_name);
format.type);
goto done; goto done;
} }
@ -1031,8 +1046,7 @@ FORMAT_FLOAT(PyObject *obj,
default: default:
/* unknown */ /* unknown */
PyErr_Format(PyExc_ValueError, "Unknown conversion type %c", unknown_presentation_type(format.type, obj->ob_type->tp_name);
format.type);
goto done; goto done;
} }