format() not behaving as expected

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Jun 29 13:08:20 EDT 2012


On Fri, 29 Jun 2012 09:31:53 -0700, Josh English wrote:

> I have a list of tuples, and usually print them using:
> 
> print c, " ".join(map(str, list_of_tuples))
> 
> This is beginning to feel clunky (but gives me essentially what I want),
> and I thought there was a better, more concise, way to achieve this, so
> I explored the new string format and format() function:
> 
>>>> c = (1,3)
>>>> s = "{0[0]}"
>>>> print s.format(c)
> '1'

That's not actually the output copied and pasted. You have quotes around 
the string, which you don't get if you pass it to the print command.


>>>> print format(c,s)
> Traceback (most recent call last):
>   File "<interactive input>", line 1, in <module>
> ValueError: Invalid conversion specification
[...]
> Any idea why one form works and the other doesn't?

Because the format built-in function is not the same as the format string 
method.

The string method takes brace substitutions, like "{0[0]}" which returns 
the first item of the first argument.

The format function takes a format spec, not a brace substitution. For 
example:

>>> format(c, '<10s')
'(1, 3)    '
>>> format(c, '>10s')
'    (1, 3)'
>>> format(c, '*>10s')
'****(1, 3)'

The details of the format spec are in the Fine Manual:

http://docs.python.org/library/string.html#formatspec

although sadly all the examples are about using brace substitutions, not 
format specs.

(Personally, I find the documentation about format to be less than 
helpful.)

You can also read the PEP that introduced the new formatting, but keep in 
mind that there have been some changes since the PEP was written, so it 
may not quite match the current status quo.

http://www.python.org/dev/peps/pep-3101/


-- 
Steven




More information about the Python-list mailing list