mirror of https://github.com/python/cpython.git
Fix PyString_Format() so that '%c' % u'a' returns u'a'
instead of raising a TypeError. (From SF patch #710127) Add tests to verify this is fixed. Add various tests for '%c' % int.
This commit is contained in:
parent
2a04623ddd
commit
43440a621e
|
@ -543,6 +543,7 @@ def test_formatting(self):
|
||||||
self.checkequal('"', "%c", '__mod__', 34)
|
self.checkequal('"', "%c", '__mod__', 34)
|
||||||
self.checkequal('$', "%c", '__mod__', 36)
|
self.checkequal('$', "%c", '__mod__', 36)
|
||||||
self.checkequal('10', "%d", '__mod__', 10)
|
self.checkequal('10', "%d", '__mod__', 10)
|
||||||
|
self.checkequal('\x7f', "%c", '__mod__', 0x7f)
|
||||||
|
|
||||||
for ordinal in (-100, 0x200000):
|
for ordinal in (-100, 0x200000):
|
||||||
# unicode raises ValueError, str raises OverflowError
|
# unicode raises ValueError, str raises OverflowError
|
||||||
|
|
|
@ -14,6 +14,10 @@ class StrTest(
|
||||||
def fixtype(self, obj):
|
def fixtype(self, obj):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
def test_formatting(self):
|
||||||
|
string_tests.MixinStrUnicodeUserStringTest.test_formatting(self)
|
||||||
|
self.assertRaises(OverflowError, '%c'.__mod__, 0x1234)
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
suite = unittest.TestSuite()
|
suite = unittest.TestSuite()
|
||||||
suite.addTest(unittest.makeSuite(StrTest))
|
suite.addTest(unittest.makeSuite(StrTest))
|
||||||
|
|
|
@ -358,6 +358,8 @@ def test_formatting(self):
|
||||||
self.assertEqual(u"%r, %r" % (u"abc", "abc"), u"u'abc', 'abc'")
|
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, %(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"%(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:
|
# formatting jobs delegated from the string implementation:
|
||||||
self.assertEqual('...%(foo)s...' % {'foo':u"abc"}, u'...abc...')
|
self.assertEqual('...%(foo)s...' % {'foo':u"abc"}, u'...abc...')
|
||||||
|
@ -375,6 +377,7 @@ def test_formatting(self):
|
||||||
self.assertEqual('%*.*s' % (5,3,u'abc',), u' abc')
|
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' % (10, 5,3,u'abc',), u'10 abc')
|
||||||
self.assertEqual('%i%s %*.*s' % (10, 3, 5, 3, u'abc',), u'103 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,))
|
self.assertRaises(ValueError, u"%c".__mod__, (sys.maxunicode+1,))
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,9 @@ Core and builtins
|
||||||
unicode system with multiple active interpreters, or successive
|
unicode system with multiple active interpreters, or successive
|
||||||
interpreter executions, would fail.
|
interpreter executions, would fail.
|
||||||
|
|
||||||
|
- "%c" % u"a" now returns a unicode string instead of raising a
|
||||||
|
TypeError. See SF patch #710127.
|
||||||
|
|
||||||
Extension modules
|
Extension modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
|
@ -3933,6 +3933,13 @@ PyString_Format(PyObject *format, PyObject *args)
|
||||||
fill = '0';
|
fill = '0';
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
|
#ifdef Py_USING_UNICODE
|
||||||
|
if (PyUnicode_Check(v)) {
|
||||||
|
fmt = fmt_start;
|
||||||
|
argidx = argidx_start;
|
||||||
|
goto unicode;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
pbuf = formatbuf;
|
pbuf = formatbuf;
|
||||||
len = formatchar(pbuf, sizeof(formatbuf), v);
|
len = formatchar(pbuf, sizeof(formatbuf), v);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
|
|
Loading…
Reference in New Issue