Merge #13579: teach string.Formatter about 'a'.

Patch by Francisco Martín Brugué.
This commit is contained in:
R David Murray 2012-08-19 17:45:40 -04:00
commit 749bd42072
4 changed files with 20 additions and 9 deletions

View File

@ -91,8 +91,8 @@ implementation as the built-in :meth:`format` method.
.. method:: format(format_string, *args, **kwargs) .. method:: format(format_string, *args, **kwargs)
:meth:`format` is the primary API method. It takes a format template :meth:`format` is the primary API method. It takes a format string and
string, and an arbitrary set of positional and keyword argument. an arbitrary set of positional and keyword arguments.
:meth:`format` is just a wrapper that calls :meth:`vformat`. :meth:`format` is just a wrapper that calls :meth:`vformat`.
.. method:: vformat(format_string, args, kwargs) .. 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 separate function for cases where you want to pass in a predefined
dictionary of arguments, rather than unpacking and repacking the dictionary of arguments, rather than unpacking and repacking the
dictionary as individual arguments using the ``*args`` and ``**kwds`` dictionary as individual arguments using the ``*args`` and ``**kwds``
syntax. :meth:`vformat` does the work of breaking up the format template syntax. :meth:`vformat` does the work of breaking up the format string
string into character data and replacement fields. It calls the various into character data and replacement fields. It calls the various
methods described below. methods described below.
In addition, the :class:`Formatter` defines a number of methods that are 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 Converts the value (returned by :meth:`get_field`) given a conversion type
(as in the tuple returned by the :meth:`parse` method). The default (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: .. _formatstrings:

View File

@ -220,12 +220,14 @@ class Formatter:
def convert_field(self, value, conversion): def convert_field(self, value, conversion):
# do any conversion on the resulting object # do any conversion on the resulting object
if conversion == 'r': if conversion is None:
return repr(value) return value
elif conversion == 's': elif conversion == 's':
return str(value) return str(value)
elif conversion is None: elif conversion == 'r':
return value return repr(value)
elif conversion == 'a':
return ascii(value)
raise ValueError("Unknown conversion specifier {0!s}".format(conversion)) raise ValueError("Unknown conversion specifier {0!s}".format(conversion))

View File

@ -37,6 +37,12 @@ class ModuleTest(unittest.TestCase):
self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-") self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-")
self.assertEqual(fmt.format("{0!s}", 'test'), 'test') self.assertEqual(fmt.format("{0!s}", 'test'), 'test')
self.assertRaises(ValueError, fmt.format, "{0!h}", '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_name_lookup(self): def test_name_lookup(self):
fmt = string.Formatter() fmt = string.Formatter()

View File

@ -16,6 +16,8 @@ Core and Builtins
Library Library
------- -------
- Issue #13579: string.Formatter now understands the 'a' conversion specifier.
- Issue #15595: Fix subprocess.Popen(universal_newlines=True) - Issue #15595: Fix subprocess.Popen(universal_newlines=True)
for certain locales (utf-16 and utf-32 family). Patch by Chris Jerdonek. for certain locales (utf-16 and utf-32 family). Patch by Chris Jerdonek.