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:
parent
8b8c2df9b1
commit
e9fb6863da
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue