On Tue, Jan 26, 2016 at 3:51 AM, Ian Kelly <ian.g.ke...@gmail.com> wrote: > On Sun, Jan 24, 2016 at 2:20 PM, MRAB <pyt...@mrabarnett.plus.com> wrote: >> The format method, on the other hand, belongs to the format string it's >> attached to. In this example: >> >> 'The new price is {}' .format(newPrice, '.2f') >> >> the format string is 'The new price is {}' and you're calling its 'format' >> method with 2 values for that string, the first being 4.0 (used) and the >> second on being '.2f' (unused). >> >> What you want is: >> >> print('The new price is {:.2f}'.format(newPrice)) > > Why doesn't str.format raise an exception when passed extra positional > arguments?
That's a very good question. I suspect the answer will have to do with i18n and the way you can reorder arguments; if some translations don't use a token at all, it shouldn't be a fatal error that you have to hack around by formatting something into zero characters. It may be worth adding a special case: if no positional selectors are used, the number of arguments must match the number of placeholders. For comparison, here's how Pike does things (%O is roughly equivalent to Python's {!r}): > sprintf("%O", 1); (1) Result: "1" > sprintf("%O %O", 1, 2); (2) Result: "1 2" > sprintf("%O", 1, 2); Compiler Error: 1: Too many arguments to sprintf (expected 2 arguments). Compiler Error: 1: Got : int(2..2). > sprintf("%[0]O", 1, 2); (3) Result: "1" > sprintf("%[1]O", 1, 2); (4) Result: "2" If you're doing i18n, you probably want to use {0} {1} anyway; and if you're deliberately ignoring some of the parameters, it's not too much hassle to be explicit about which parameters you're not ignoring. IMO this would be a useful protection. You get it with percent formatting, but currently not with .format(). ChrisA -- https://mail.python.org/mailman/listinfo/python-list