Changed some ValueError's to KeyError and IndexError.
Corrected code for invalid conversion specifier.
Added tests to verify.
Modified string.Formatter to correctly expand format_spec's,
and added a limit to recursion depth. Added _vformat()
method to support both of these.
diff --git a/Objects/stringlib/string_format.h b/Objects/stringlib/string_format.h
index de700f6..ea8b0e7 100644
--- a/Objects/stringlib/string_format.h
+++ b/Objects/stringlib/string_format.h
@@ -414,8 +414,7 @@
if (key == NULL)
goto error;
if ((kwargs == NULL) || (obj = PyDict_GetItem(kwargs, key)) == NULL) {
- PyErr_SetString(PyExc_ValueError, "Keyword argument not found "
- "in format string");
+ PyErr_SetObject(PyExc_KeyError, key);
Py_DECREF(key);
goto error;
}
@@ -425,12 +424,8 @@
else {
/* look up in args */
obj = PySequence_GetItem(args, index);
- if (obj == NULL) {
- /* translate IndexError to a ValueError */
- PyErr_SetString(PyExc_ValueError, "Not enough positional arguments "
- "in format string");
+ if (obj == NULL)
goto error;
- }
}
/* iterate over the rest of the field_name */