]> granicus.if.org Git - python/commitdiff
The string formatting code has a test to switch to Unicode when %s
authorGuido van Rossum <guido@python.org>
Wed, 9 Oct 2002 19:07:53 +0000 (19:07 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 9 Oct 2002 19:07:53 +0000 (19:07 +0000)
sees a Unicode argument.  Unfortunately this test was also executed
for %r, because %s and %r share almost all of their code.  This meant
that, if u is a unicode object while repr(u) is an 8-bit string
containing ASCII characters, '%r' % u is a *unicode* string containing
only ASCII characters!

Fixed by executing the test only for %s.

Also fixed an error message -- %s argument has non-string str()
doesn't make sense for %r, so the error message now differentiates
between %s and %r.

Objects/stringobject.c

index 932ef51a96eafdd587b5b0d44337534a53ae8fea..52f96ff07f82e01e3e1d0ec2022e609a1ee279e0 100644 (file)
@@ -3858,7 +3858,6 @@ PyString_Format(PyObject *format, PyObject *args)
                                len = 1;
                                break;
                        case 's':
-                       case 'r':
 #ifdef Py_USING_UNICODE
                                if (PyUnicode_Check(v)) {
                                        fmt = fmt_start;
@@ -3866,6 +3865,8 @@ PyString_Format(PyObject *format, PyObject *args)
                                        goto unicode;
                                }
 #endif
+                               /* Fall through */
+                       case 'r':
                                if (c == 's')
                                        temp = PyObject_Str(v);
                                else
@@ -3874,7 +3875,9 @@ PyString_Format(PyObject *format, PyObject *args)
                                        goto error;
                                if (!PyString_Check(temp)) {
                                        PyErr_SetString(PyExc_TypeError,
-                                         "%s argument has non-string str()");
+                                         c == 's' ?
+                                         "%s argument has non-string str()" :
+                                         "%r argument has non-string repr()");
                                        Py_DECREF(temp);
                                        goto error;
                                }