New Python 3.0 string formatting - really necessary?
Duncan Booth
duncan.booth at invalid.invalid
Sun Dec 21 07:45:32 EST 2008
Steven D'Aprano <steve at REMOVE-THIS-cybersource.com.au> wrote:
> Errors should never pass silently, unless explicitly silenced. You
> have implicitly silenced the TypeError you get from not having enough
> arguments for the first format operation. That means that you will
> introduce ambiguity and bugs.
>
> "%i %i %i %i" % 5 % 3 %7
>
> Here I have four slots and only three numbers. Which output did I
> expect?
>
> '%i 5 3 7'
> '5 %i 3 7'
> '5 3 %i 7'
> '5 3 7 %i'
>
> Or more likely, the three numbers is a mistake, there is supposed to
> be a fourth number there somewhere, only now instead of the error
> being caught immediately, it won't be discovered until much later.
>
You seem to have made an unwarranted assumption, namely that a binary
operator has to compile to a function with two operands. There is no
particular reason why this has to always be the case: for example, I
believe that C# when given several strings to add together optimises this
into a single call to a concatenation method.
Python *could* do something similar if the appropriate opcodes/methods
supported more than two arguments:
a+b+c+d might execute a.__add__(b,c,d) allowing more efficient string
concatenations or matrix operations, and a%b%c%d might execute as
a.__mod__(b,c,d).
In that alternate universe your example:
"%i %i %i %i" % 5 % 3 %7
simply throws "TypeError: not enough arguments for format string", and
"%s" % (1,2,3)
just converts the tuple as a single argument. It also provides the answer
to how you put a percent in the format string (double it) and what happens
if a substitution inserts a percent (it doesn't interact with the
formatting operators).
More information about the Python-list
mailing list