]> granicus.if.org Git - python/commitdiff
Add a custom __str__ method to KeyError that applies repr() to the
authorGuido van Rossum <guido@python.org>
Tue, 3 Sep 2002 20:24:09 +0000 (20:24 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 3 Sep 2002 20:24:09 +0000 (20:24 +0000)
missing key.  (Also added a guard to SyntaxError__str__ to prevent
calling PyString_Check(NULL).)

Lib/test/output/test_exceptions
Python/exceptions.c

index e1e146ab3610973be8dcbd15aeba1a22f49b7a71..28a7aa8390feff98361eb7af1fe1ca6906dd8ff1 100644 (file)
@@ -10,7 +10,7 @@ spam
 ImportError
 spam
 IndexError
-spam
+'spam'
 KeyError
 spam
 KeyboardInterrupt
index 24ea25ddee0b848ac26554bd2732c98b34b6ae45..3f07089641b1fd1e06736f4f2787b801a8db4668 100644 (file)
@@ -785,7 +785,7 @@ SyntaxError__str__(PyObject *self, PyObject *args)
     /* XXX -- do all the additional formatting with filename and
        lineno here */
 
-    if (PyString_Check(str)) {
+    if (str != NULL && PyString_Check(str)) {
        int have_filename = 0;
        int have_lineno = 0;
        char *buffer = NULL;
@@ -844,6 +844,44 @@ static PyMethodDef SyntaxError_methods[] = {
 };
 
 
+static PyObject *
+KeyError__str__(PyObject *self, PyObject *args)
+{
+    PyObject *argsattr;
+    PyObject *result;
+
+    if (!PyArg_ParseTuple(args, "O:__str__", &self))
+       return NULL;
+
+    if (!(argsattr = PyObject_GetAttrString(self, "args")))
+       return NULL;
+
+    /* If args is a tuple of exactly one item, apply repr to args[0].
+       This is done so that e.g. the exception raised by {}[''] prints
+         KeyError: ''
+       rather than the confusing
+         KeyError
+       alone.  The downside is that if KeyError is raised with an explanatory
+       string, that string will be displayed in quotes.  Too bad.
+       If args is anything else, use the default Exception__str__().
+    */
+    if (PyTuple_Check(argsattr) && PyTuple_GET_SIZE(argsattr) == 1) {
+       PyObject *key = PyTuple_GET_ITEM(argsattr, 0);
+       result = PyObject_Repr(key);
+    }
+    else
+       result = Exception__str__(self, args);
+
+    Py_DECREF(argsattr);
+    return result;
+}
+
+static PyMethodDef KeyError_methods[] = {
+    {"__str__",  KeyError__str__, METH_VARARGS},
+    {NULL, NULL}
+};
+
+
 static
 int get_int(PyObject *exc, const char *name, int *value)
 {
@@ -1617,7 +1655,7 @@ static struct {
  {"IndexError",         &PyExc_IndexError,     &PyExc_LookupError,
   IndexError__doc__},
  {"KeyError",           &PyExc_KeyError,       &PyExc_LookupError,
-  KeyError__doc__},
+  KeyError__doc__, KeyError_methods},
  {"ArithmeticError",    &PyExc_ArithmeticError, 0, ArithmeticError__doc__},
  {"OverflowError",      &PyExc_OverflowError,     &PyExc_ArithmeticError,
   OverflowError__doc__},