[Python-Dev] transitioning from % to {} formatting (original) (raw)

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 bracesfmt(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

True.

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.

Regards,

Vinay Sajip



More information about the Python-Dev mailing list