From d25c650461b6010ad66768e4495e780683745ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lemburg?= Date: Fri, 23 Jul 2004 16:13:25 +0000 Subject: [PATCH] Let u'%s' % obj try obj.__unicode__() first and fallback to obj.__str__(). --- Lib/test/test_unicode.py | 8 ++++++++ Objects/unicodeobject.c | 22 ++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index e2db2077ccc..17c82ab338c 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -438,6 +438,14 @@ class UnicodeTest( self.assertEqual(unicode(o), u'unicode(obj) is compatible to str()') self.assertEqual(str(o), 'unicode(obj) is compatible to str()') + # %-formatting and .__unicode__() + self.assertEqual(u'%s' % + UnicodeCompat(u"u'%s' % obj uses obj.__unicode__()"), + u"u'%s' % obj uses obj.__unicode__()") + self.assertEqual(u'%s' % + UnicodeCompat(u"u'%s' % obj falls back to obj.__str__()"), + u"u'%s' % obj falls back to obj.__str__()") + for obj in (123, 123.45, 123L): self.assertEqual(unicode(obj), unicode(str(obj))) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 6c73df48d36..c1550720735 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6883,20 +6883,15 @@ PyObject *PyUnicode_Format(PyObject *format, else { PyObject *unicode; if (c == 's') - temp = PyObject_Str(v); + temp = PyObject_Unicode(v); else temp = PyObject_Repr(v); if (temp == NULL) goto onError; - if (!PyString_Check(temp)) { - /* XXX Note: this should never happen, since - PyObject_Repr() and PyObject_Str() assure - this */ - Py_DECREF(temp); - PyErr_SetString(PyExc_TypeError, - "%s argument has non-string str()"); - goto onError; - } + if (PyUnicode_Check(temp)) + /* nothing to do */; + else if (PyString_Check(temp)) { + /* convert to string to Unicode */ unicode = PyUnicode_Decode(PyString_AS_STRING(temp), PyString_GET_SIZE(temp), NULL, @@ -6905,6 +6900,13 @@ PyObject *PyUnicode_Format(PyObject *format, temp = unicode; if (temp == NULL) goto onError; + } + else { + Py_DECREF(temp); + PyErr_SetString(PyExc_TypeError, + "%s argument has non-string str()"); + goto onError; + } } pbuf = PyUnicode_AS_UNICODE(temp); len = PyUnicode_GET_SIZE(temp);