[Python-ideas] new format spec for iterable types

Wolfgang Maier wolfgang.maier at biologie.uni-freiburg.de
Tue Sep 8 16:20:43 CEST 2015


On 08.09.2015 15:41, Oscar Benjamin wrote:
>
> The *{sep} surprised me until I tried
>
>      >>> '{x:.{n}f}'.format(x=1.234567, n=2)
>      '1.23'
>
> So format uses a two-level pass over the string for nested curly
> brackets (I tried a third level of nesting but it didn't work).
>

Yes, this is documented behavior
(https://docs.python.org/3/library/string.html#format-string-syntax):

"A format_spec field can also include nested replacement fields within 
it. These nested replacement fields can contain only a field name; 
conversion flags and format specifications are not allowed. The 
replacement fields within the format_spec are substituted before the 
format_spec string is interpreted. This allows the formatting of a value 
to be dynamically specified."

> Unfortunately there's no way to also give a format string to the inner
> format call format(e) if I wanted to e.g. format those numbers in hex.

Right, that would require a much more complex format_spec definition. 
But the proposed simple version saves me from mistakenly writing:

'{}\t{}'.format(head, '\t'.join(data))

when some of the elements in data aren't strings and I should have written:

'{}\t{}'.format(head, '\t'.join(str(e) for e in data))

, a mistake that I seem to never learn to avoid :)





More information about the Python-ideas mailing list