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

Vinay Sajip vinay_sajip at yahoo.co.uk
Thu Oct 1 23:33:41 CEST 2009

> So I created this last night:

> import collections
> class braces_fmt(str):
>     def __mod__(self, stuff):
>         if isinstance(stuff, tuple):
>             return self.__class__(self.format(*stuff))
>         elif isinstance(stuff, collections.Mapping):
>             return self.__class__(self.format(**stuff))
>         else:
>             return self.__class__(self.format(stuff))
> The biggest issue is that ``"%s" % {'a': 42}`` substitutes the dict
> instead of throwing an error that str.format() would do with the code
> above. But what's nice about this is I think I can use this now w/ any
> library that expects % interpolation and it should basically work.

So there's no need to change modules like logging to explicitly provide support for {}-formatting? What's not to like? ;-) Something like this perhaps should have been added in at the same time as str.format went in.

> I don't think Paul's suggestion requires much more work to support
> string.Template, simply a subclass that implements __mod__


> I guess my question is what's the point of the class if you are simply
> converting it before you pass it in to the logger? To be lazy about
> the formatting call? Otherwise you could simply call str.format() with
> your arguments before you pass the string into the logger and not have
> to wrap anything.

That's exactly the reason - to defer the formatting until it's needed. Otherwise you can always format the string yourself,as you say, and pass it as the single argument in the logging call - logging won't know or care if it was passed in as a literal, or was computed by %-, {}-, $- or any other formatting approach.


Vinay Sajip


More information about the Python-Dev mailing list