[Python-Dev] summary of transitioning from % to {} formatting

Terry Reedy tjreedy at udel.edu
Sun Oct 4 01:31:01 CEST 2009

Steven Bethard wrote:
> I thought it might be useful for those who don't have time to read a
> million posts to have a summary of what's happened in the formatting
> discussion.


> The basic problem is that many APIs in the standard library and
> elsewhere support only %-formatting and not {}-formatting, e.g.
> logging.Formatter accepts::
>   logging.Formatter(fmt="%(asctime)s - %(name)s")
> but not::
>   logging.Formatter(fmt="{asctime} - {name}")
> There seems to be mostly agreement that these APIs should at least
> support both formatting styles, and a sizable group (including Guido)
> believe that %-formatting should eventually be phased out (e.g. by
> Python 4). There are a number of competing proposals on how to allow
> such APIs to start accepting {}-format strings:
> * Add a parameter which declares the type of format string::
>     logging.Formatter(fmt="{asctime} - {name}", format=BRACES)
>   The API code would then switch between %-format and {}-format
>   based on the value of that parameter. If %-formatting is to be
>   deprecated, this could be done by first deprecating
>   format=PERCENTS and requiring format=BRACES, and then changing the
>   default to format=BRACES.


> * Create translators between %-format and {}-format::
>     assert to_braces("%(asctime)s") == "{asctime}"
>     assert to_percents("{asctime}") == "%(asctime)s"
>   these could then either be used outside of the API::
>     logging.Formatter(fmt=to_percents("{asctime} - {name}"))
>   or they could be used within the API combined with some sort of
>   heuristic for guessing whether a {}-format string or a %-format
>   string was passed in::
>     logging.Formatter(fmt="{asctime} - {name}")

How about combining these two. Add an optional form or style=xxx 
parameter -- which could also allow DOLLARS for $-formats -- for 
resolving ambiguities. If not present, make a reasonable guess. IE, if 
string has no '%' and multiple {} pairs, or no {} pairs and multiple %s, 
the guess is at least .999 sure. which is to not, not hardly a guess. 
The extra arg can be supplied if and when needed.

The machinery for this should be not be logging specific, so it can be 
used through throughout the library, and exposed so that others can use it.

Terry Jan Reedy

More information about the Python-Dev mailing list