diff options
| author | Eric Smith <eric@trueblade.com> | 2009-03-14 11:57:26 (GMT) |
|---|---|---|
| committer | Eric Smith <eric@trueblade.com> | 2009-03-14 11:57:26 (GMT) |
| commit | 6f42edb6821462c9ce02c6c4e2f57731b43956ad (patch) | |
| tree | 22a648f118e175d637901f3575d3549e975eb445 /Lib/test/test_unicode.py | |
| parent | feeafff0529c8fa0b5ab6a3086464cce8fd1b3fc (diff) | |
| download | cpython-6f42edb6821462c9ce02c6c4e2f57731b43956ad.zip cpython-6f42edb6821462c9ce02c6c4e2f57731b43956ad.tar.gz cpython-6f42edb6821462c9ce02c6c4e2f57731b43956ad.tar.bz2 | |
Issue 5237, Allow auto-numbered replacement fields in str.format() strings.
For simple uses for str.format(), this makes the typing easier. Hopfully this
will help in the adoption of str.format().
For example:
'The {} is {}'.format('sky', 'blue')
You can mix and matcth auto-numbering and named replacement fields:
'The {} is {color}'.format('sky', color='blue')
But you can't mix and match auto-numbering and specified numbering:
'The {0} is {}'.format('sky', 'blue')
ValueError: cannot switch from manual field specification to automatic field numbering
Will port to 3.1.
Diffstat (limited to 'Lib/test/test_unicode.py')
| -rw-r--r-- | Lib/test/test_unicode.py | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 70e4787..356f570 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1087,9 +1087,9 @@ class UnicodeTest( self.assertRaises(ValueError, "{0!}".format, 0) self.assertRaises(ValueError, "{0!rs}".format, 0) self.assertRaises(ValueError, "{!}".format) - self.assertRaises(ValueError, "{:}".format) - self.assertRaises(ValueError, "{:s}".format) - self.assertRaises(ValueError, "{}".format) + self.assertRaises(IndexError, "{:}".format) + self.assertRaises(IndexError, "{:s}".format) + self.assertRaises(IndexError, "{}".format) # can't have a replacement on the field name portion self.assertRaises(TypeError, '{0[{1}]}'.format, 'abcdefg', 4) @@ -1113,6 +1113,36 @@ class UnicodeTest( # will fail self.assertRaises(UnicodeEncodeError, "foo{0}".format, u'\u1000bar') + def test_format_auto_numbering(self): + class C: + def __init__(self, x=100): + self._x = x + def __format__(self, spec): + return spec + + self.assertEqual(u'{}'.format(10), u'10') + self.assertEqual(u'{:5}'.format('s'), u's ') + self.assertEqual(u'{!r}'.format('s'), u"'s'") + self.assertEqual(u'{._x}'.format(C(10)), u'10') + self.assertEqual(u'{[1]}'.format([1, 2]), u'2') + self.assertEqual(u'{[a]}'.format({'a':4, 'b':2}), u'4') + self.assertEqual(u'a{}b{}c'.format(0, 1), u'a0b1c') + + self.assertEqual(u'a{:{}}b'.format('x', '^10'), u'a x b') + self.assertEqual(u'a{:{}x}b'.format(20, '#'), u'a0x14b') + + # can't mix and match numbering and auto-numbering + self.assertRaises(ValueError, u'{}{1}'.format, 1, 2) + self.assertRaises(ValueError, u'{1}{}'.format, 1, 2) + self.assertRaises(ValueError, u'{:{1}}'.format, 1, 2) + self.assertRaises(ValueError, u'{0:{}}'.format, 1, 2) + + # can mix and match auto-numbering and named + self.assertEqual(u'{f}{}'.format(4, f='test'), u'test4') + self.assertEqual(u'{}{f}'.format(4, f='test'), u'4test') + self.assertEqual(u'{:{f}}{g}{}'.format(1, 3, g='g', f=2), u' 1g3') + self.assertEqual(u'{f:{}}{}{g}'.format(2, 4, f=1, g='g'), u' 14g') + def test_raiseMemError(self): # Ensure that the freelist contains a consistent object, even # when a string allocation fails with a MemoryError. |
