From: Eric Smith Date: Mon, 18 Feb 2008 18:02:34 +0000 (+0000) Subject: Added code to correct combining str and unicode in ''.format(). Added test case. X-Git-Tag: v2.6a1~136 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc32fee0291cc8ff4085ad805c0f4dca97345863;p=python Added code to correct combining str and unicode in ''.format(). Added test case. --- diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 26a57cc45c..ccb9411f55 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1088,6 +1088,15 @@ class UnicodeTest( self.assertRaises(ValueError, format, "", "-") self.assertRaises(ValueError, "{0:=s}".format, '') + # test combining string and unicode + self.assertEqual(u"foo{0}".format('bar'), u'foobar') + # This will try to convert the argument from unicode to str, which + # will succeed + self.assertEqual("foo{0}".format(u'bar'), 'foobar') + # This will try to convert the argument from unicode to str, which + # will fail + self.assertRaises(UnicodeEncodeError, "foo{0}".format, u'\u1000bar') + def test_main(): test_support.run_unittest(__name__) diff --git a/Objects/stringlib/string_format.h b/Objects/stringlib/string_format.h index 70f8f13aea..e7762429a7 100644 --- a/Objects/stringlib/string_format.h +++ b/Objects/stringlib/string_format.h @@ -493,6 +493,22 @@ render_field(PyObject *fieldobj, SubString *format_spec, OutputString *output) if (result == NULL) goto done; +#if PY_VERSION_HEX >= 0x03000000 + assert(PyString_Check(result)); +#else + assert(PyString_Check(result) || PyUnicode_Check(result)); + + /* Convert result to our type. We could be str, and result could + be unicode */ + { + PyObject *tmp = STRINGLIB_TOSTR(result); + if (tmp == NULL) + goto done; + Py_DECREF(result); + result = tmp; + } +#endif + ok = output_data(output, STRINGLIB_STR(result), STRINGLIB_LEN(result)); done: