diff options
author | R David Murray <rdmurray@bitdance.com> | 2012-08-19 21:26:34 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2012-08-19 21:26:34 (GMT) |
commit | e56bf97ef4283a877c459390516bb7385e8e4ec4 (patch) | |
tree | d175af7fff6eeacc8c58a7bdad0a0f546063b292 | |
parent | 828607170da3986af909defe99f956e5762e4dd0 (diff) | |
download | cpython-e56bf97ef4283a877c459390516bb7385e8e4ec4.zip cpython-e56bf97ef4283a877c459390516bb7385e8e4ec4.tar.gz cpython-e56bf97ef4283a877c459390516bb7385e8e4ec4.tar.bz2 |
#13579: teach string.Formatter about 'a'.
Patch by Francisco Martín Brugué.
-rw-r--r-- | Doc/library/string.rst | 11 | ||||
-rw-r--r-- | Lib/string.py | 10 | ||||
-rw-r--r-- | Lib/test/test_string.py | 12 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
4 files changed, 26 insertions, 9 deletions
diff --git a/Doc/library/string.rst b/Doc/library/string.rst index aed191b..79d4e3f 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -91,8 +91,8 @@ implementation as the built-in :meth:`format` method. .. method:: format(format_string, *args, **kwargs) - :meth:`format` is the primary API method. It takes a format template - string, and an arbitrary set of positional and keyword argument. + :meth:`format` is the primary API method. It takes a format string and + an arbitrary set of positional and keyword arguments. :meth:`format` is just a wrapper that calls :meth:`vformat`. .. method:: vformat(format_string, args, kwargs) @@ -101,8 +101,8 @@ implementation as the built-in :meth:`format` method. separate function for cases where you want to pass in a predefined dictionary of arguments, rather than unpacking and repacking the dictionary as individual arguments using the ``*args`` and ``**kwds`` - syntax. :meth:`vformat` does the work of breaking up the format template - string into character data and replacement fields. It calls the various + syntax. :meth:`vformat` does the work of breaking up the format string + into character data and replacement fields. It calls the various methods described below. In addition, the :class:`Formatter` defines a number of methods that are @@ -173,7 +173,8 @@ implementation as the built-in :meth:`format` method. Converts the value (returned by :meth:`get_field`) given a conversion type (as in the tuple returned by the :meth:`parse` method). The default - version understands 'r' (repr) and 's' (str) conversion types. + version understands 's' (str), 'r' (repr) and 'a' (ascii) conversion + types. .. _formatstrings: diff --git a/Lib/string.py b/Lib/string.py index ef0334c..0f4ede2 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -236,12 +236,14 @@ class Formatter: def convert_field(self, value, conversion): # do any conversion on the resulting object - if conversion == 'r': - return repr(value) + if conversion is None: + return value elif conversion == 's': return str(value) - elif conversion is None: - return value + elif conversion == 'r': + return repr(value) + elif conversion == 'a': + return ascii(value) raise ValueError("Unknown conversion specifier {0!s}".format(conversion)) diff --git a/Lib/test/test_string.py b/Lib/test/test_string.py index a352ee3..34d1dcf 100644 --- a/Lib/test/test_string.py +++ b/Lib/test/test_string.py @@ -26,6 +26,18 @@ class ModuleTest(unittest.TestCase): self.assertEqual(string.capwords('\taBc\tDeF\t'), 'Abc Def') self.assertEqual(string.capwords('\taBc\tDeF\t', '\t'), '\tAbc\tDef\t') + def test_conversion_specifiers(self): + fmt = string.Formatter() + self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-") + self.assertEqual(fmt.format("{0!s}", 'test'), 'test') + self.assertRaises(ValueError, fmt.format, "{0!h}", 'test') + # issue13579 + self.assertEqual(fmt.format("{0!a}", 42), '42') + self.assertEqual(fmt.format("{0!a}", string.ascii_letters), + "'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'") + self.assertEqual(fmt.format("{0!a}", chr(255)), "'\\xff'") + self.assertEqual(fmt.format("{0!a}", chr(256)), "'\\u0100'") + def test_formatter(self): fmt = string.Formatter() self.assertEqual(fmt.format("foo"), "foo") @@ -104,6 +104,8 @@ Core and Builtins Library ------- +- Issue #13579: string.Formatter now understands the 'a' conversion specifier. + - Issue #15595: Fix subprocess.Popen(universal_newlines=True) for certain locales (utf-16 and utf-32 family). Patch by Chris Jerdonek. |