]> granicus.if.org Git - python/commitdiff
Issue #5247: Improve error message when unknown format codes are used when using...
authorEric Smith <eric@trueblade.com>
Fri, 20 Feb 2009 14:02:36 +0000 (14:02 +0000)
committerEric Smith <eric@trueblade.com>
Fri, 20 Feb 2009 14:02:36 +0000 (14:02 +0000)
Misc/NEWS
Objects/stringlib/formatter.h

index 6a65384b8e687eb4a0047c366a1051df222356a7..ab5f3edecc02f69b3cb792eb4460221a321e4757 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,10 @@ What's New in Python 2.7 alpha 1
 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
   for ints and longs.
 
index aa99123032a404d93a3632118d376c4e66e2857e..2e3e5a675854f923f2d8fbaa983db15e16ee68b7 100644 (file)
 
 #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
     input string, updates *result with the corresponding positive
@@ -854,19 +882,7 @@ FORMAT_STRING(PyObject *obj,
         break;
     default:
         /* unknown */
-       #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 (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
+        unknown_presentation_type(format.type, obj->ob_type->tp_name);
         goto done;
     }
 
@@ -928,8 +944,7 @@ format_int_or_long(PyObject* obj,
 
     default:
         /* unknown */
-        PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
-                     format.type);
+        unknown_presentation_type(format.type, obj->ob_type->tp_name);
         goto done;
     }
 
@@ -1031,8 +1046,7 @@ FORMAT_FLOAT(PyObject *obj,
 
     default:
         /* unknown */
-        PyErr_Format(PyExc_ValueError, "Unknown conversion type %c",
-                     format.type);
+        unknown_presentation_type(format.type, obj->ob_type->tp_name);
         goto done;
     }