]> granicus.if.org Git - python/commitdiff
Added code to correct combining str and unicode in ''.format(). Added test case.
authorEric Smith <eric@trueblade.com>
Mon, 18 Feb 2008 18:02:34 +0000 (18:02 +0000)
committerEric Smith <eric@trueblade.com>
Mon, 18 Feb 2008 18:02:34 +0000 (18:02 +0000)
Lib/test/test_unicode.py
Objects/stringlib/string_format.h

index 26a57cc45cc02e13331e5f4d051695bb76f79d72..ccb9411f5514f4dcd41a47891262bbbc9cb8a8c0 100644 (file)
@@ -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__)
 
index 70f8f13aea22006236435412dec6b4655a130835..e7762429a772ecf9f557af8928161bedaa703ece 100644 (file)
@@ -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: