[Python-ideas] [Python-Dev] User conversions in custom string.Formatter

Eric Smith eric at trueblade.com
Wed Mar 16 01:48:52 CET 2011


On 3/15/2011 8:41 PM, Andrew Svetlov wrote:
> Well, let's discuss in python-ideas.
>
> I mean my custom formatter like:
>
> class Formatter(string.Formatter):
>      def convert_field(self, value, conversion):
>          if 'q' == conversion:
>              return qname(value)
>          elif 't' == conversion:
>              return format_datetime(value)
>          else:
>              return super(Formatter, self).convert_field(value, conversion)
>
> I can use it like:
>
> s = "{0!q}, {1!t}".format(a, b)

That doesn't work. You need to do:

s = Formatter().format("{0!q}, {1!t}", a, b)

There's no way to extend the built in str.format to include user defined 
conversions.

> !q and !t are my extensions to formatter conversions. It's good enough
> but I prefer to see
>
> s = "{0!qname}, {1!time}".format(a, b)
>
> or something like that. It cannot break any existing rule (you still
> can use "{0!qname:<20}" for example) but you can
> use more readable names for converters.
>
> There are only changed file is Objects/stringlib/string_format.h as I
> can see (I don't count documentation and unitests).

Are you looking for those specific conversions, or some general purpose 
extension mechanism?

I don't think a general purpose mechanism is worth the hassle, and I 
don't think your specific conversions are worth adding (not that I 
understand what they'd do, maybe you can convince everyone they're 
worthwhile).

Note that you can get some of what you want by specifying a wrapper 
class that overrides __repr__ and doing:

s = "{0!r}, {1!r}".format(QnameWrapper(a), DatetimeFormatWrapper(b))



More information about the Python-ideas mailing list