New Python 3.0 string formatting - really necessary?

rdmurray at rdmurray at
Sat Dec 20 05:27:46 CET 2008

Quoth Steven D'Aprano <steve at>:
> Whether using % or format(), I don't see the need to change the code, 
> only the strings.
> Using positional arguments is not really that different:
> "{0} {1}".format("dead", "parrot")
> "{0} {1}".format("perroquet", "mort")

This should be something like:

_("{0} {1}").format(_("dead"), _("parrot"))

where il8n would substitute the template "{1} {0}" when doing French.

> versus:
> "%s %s" % ("dead", "parrot")
> "%s %s" % ("perroquet", "mort")
> In this case, the template on the left remains the same, you just have to 
> reorder the string arguments on the right. Clearly less satisfactory than 
> the solution using keyword substitution, but whatever solution you pick, 
> I don't see any advantage to format() over % formatting. Can you show an 
> example?

Not less satisfactory, but rather unworkable.  You can't do proper il8n
with %s formatting, since there is no way for the il8n machinery to
reorder the argument tuple.  It can only translate the template string.
So when doing il8n, the {} syntax wins out for brevity over the equivalent
% syntax (%s(somename)s).

Not that brevity is that important an argument.  The new system is just
so much more flexible than the old.  As someone else said, the design
is beautiful :)  I have a couple thousand lines of python code I wrote
a while back to layer on a system with this kind of flexibility...I was
shocked and pleased when I saw the PEP, since it echoed so many of the
ideas I had implemented in that code, plus more.  And all done better
of course :)


More information about the Python-list mailing list