From: Guido van Rossum Date: Wed, 9 Oct 2002 19:07:53 +0000 (+0000) Subject: The string formatting code has a test to switch to Unicode when %s X-Git-Tag: v2.3c1~3846 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b00c07f038b3fdc567eaf7ae3d6f5006dd66a5dd;p=python The string formatting code has a test to switch to Unicode when %s 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. --- diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 932ef51a96..52f96ff07f 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -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; }