New Python 3.0 string formatting - really necessary?

Arnaud Delobelle arnodel at
Mon Dec 22 23:36:15 CET 2008

Steven D'Aprano <steve at> writes:

> Instead of just whinging, how about making a suggestion to fix it? Go on, 
> sit down for an hour or ten and try to work out how a BINARY OPERATOR 
> like % (that means it can only take TWO arguments) can deal with an 
> arbitrary number of arguments, *without* having any special cases.
> Go on. Take your time. I'll be waiting.

Well that's easy.  I see 'r' didn't answer so I will: only accept tuples
on the right hand side of the %, so all arguments have to be put inside
a tuple.

>>> "%s" % 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for %: 'str' and 'int'
>>> "%s" % (42,)

Of course there would still be the possibility of uncaught bugs when
people forget to put the argument in a tuple if the argument itself is a
tuple of length 1.

>>> def foo(x):
...     print "foo(%s)" % x
...     # should be     % (x,)
>>> foo('a')
TypeError: unsupported operand type(s) for %: 'str' and 'str'
>>> # But if x is a tuple of length 1 the error is not reported
>>> foo((1,))

That's why .format() is a better option IMHO.


More information about the Python-list mailing list