]> granicus.if.org Git - python/commitdiff
Fix PyString_Format() so that '%c' % u'a' returns u'a'
authorWalter Dörwald <walter@livinglogic.de>
Mon, 31 Mar 2003 18:07:50 +0000 (18:07 +0000)
committerWalter Dörwald <walter@livinglogic.de>
Mon, 31 Mar 2003 18:07:50 +0000 (18:07 +0000)
instead of raising a TypeError. (From SF patch #710127)

Add tests to verify this is fixed.

Add various tests for '%c' % int.

Lib/test/string_tests.py
Lib/test/test_str.py
Lib/test/test_unicode.py
Misc/NEWS
Objects/stringobject.c

index 4bcd121a5dfc7f71a7ada3d477cd85f69c9ec617..dcf961d1ff0387056157a51eb1355b1f626b2743 100644 (file)
@@ -543,6 +543,7 @@ class MixinStrUnicodeUserStringTest:
         self.checkequal('"', "%c", '__mod__', 34)
         self.checkequal('$', "%c", '__mod__', 36)
         self.checkequal('10', "%d", '__mod__', 10)
+        self.checkequal('\x7f', "%c", '__mod__', 0x7f)
 
         for ordinal in (-100, 0x200000):
             # unicode raises ValueError, str raises OverflowError
index 1b261068c4d0a9d9c3b644a602208f1280f17762..b9f48459bb6a5c52335dfaf207bc16d650498f55 100644 (file)
@@ -14,6 +14,10 @@ class StrTest(
     def fixtype(self, obj):
         return obj
 
+    def test_formatting(self):
+        string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
+        self.assertRaises(OverflowError, '%c'.__mod__, 0x1234)
+
 def test_main():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(StrTest))
index 43e2eba60a56fe6447f3c0797e49604c77e36b74..69f308e43c63c1786ddc65842c69e143913fd272 100644 (file)
@@ -358,6 +358,8 @@ class UnicodeTest(
             self.assertEqual(u"%r, %r" % (u"abc", "abc"), u"u'abc', 'abc'")
         self.assertEqual(u"%(x)s, %(y)s" % {'x':u"abc", 'y':"def"}, u'abc, def')
         self.assertEqual(u"%(x)s, %(\xfc)s" % {'x':u"abc", u'\xfc':"def"}, u'abc, def')
+        self.assertEqual(u'%c' % 0x1234, u'\u1234')
+        self.assertRaises(ValueError, u'%c'.__mod__, sys.maxunicode+1)
 
         # formatting jobs delegated from the string implementation:
         self.assertEqual('...%(foo)s...' % {'foo':u"abc"}, u'...abc...')
@@ -375,6 +377,7 @@ class UnicodeTest(
         self.assertEqual('%*.*s' % (5,3,u'abc',), u'  abc')
         self.assertEqual('%i %*.*s' % (10, 5,3,u'abc',), u'10   abc')
         self.assertEqual('%i%s %*.*s' % (10, 3, 5, 3, u'abc',), u'103   abc')
+        self.assertEqual('%c' % u'a', u'a')
 
         self.assertRaises(ValueError, u"%c".__mod__, (sys.maxunicode+1,))
 
index 41cb88711fd63b6e7d897bf2dc92f18c0e06ab33..4a0e33057db41329fc8b141360aaf88ff0820fe6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -34,6 +34,9 @@ Core and builtins
   unicode system with multiple active interpreters, or successive
   interpreter executions, would fail.
 
+- "%c" % u"a" now returns a unicode string instead of raising a
+  TypeError. See SF patch #710127.
+
 Extension modules
 -----------------
 
index 9598ffb3cfdeb6278cf6e3c8faaa8bb8fd93cf12..2613c626e2193efc99b64d00b12fe9595a2b59a5 100644 (file)
@@ -3933,6 +3933,13 @@ PyString_Format(PyObject *format, PyObject *args)
                                        fill = '0';
                                break;
                        case 'c':
+#ifdef Py_USING_UNICODE
+                               if (PyUnicode_Check(v)) {
+                                       fmt = fmt_start;
+                                       argidx = argidx_start;
+                                       goto unicode;
+                               }
+#endif
                                pbuf = formatbuf;
                                len = formatchar(pbuf, sizeof(formatbuf), v);
                                if (len < 0)