Error messages from format()

Steven D'Aprano steve+comp.lang.python at pearwood.info
Tue Nov 13 13:38:25 EST 2012


On Tue, 13 Nov 2012 10:08:59 -0500, Colin J. Williams wrote:

> Is there some way to get more informative error messages from the
> builtin format?

Yes -- post a feature request on the Python bug tracker, then wait until 
Python 3.4 comes out in about 16 months.

:(


> Most messages are such as:
> Traceback (most recent call last):
>    File "<interactive input>", line 1, in <module>
> ValueError: Invalid conversion specification
> 
> This example doesn't point to the first invalid case.

Better error messages would be valuable.


> [Dbg]>>> format((25, 31),'{0^9o} a(1:9x}')
> Traceback (most recent call last):
>    File "<interactive input>", line 1, in <module>
> ValueError: Invalid conversion specification

I see at least three problems.

(1) The first brace substitution is missing the colon between the 
argument selector "0" and the format spec "^9o": should be "{0:^9o}".

(2) The second format string has an opening round bracket instead of 
brace: (1:9x}

(3) But you are confusing the str.format method with the format function. 
The format function doesn't take brace substitutions!

The string format method takes a template including brace substitutions, 
plus multiple "objects to be substituted", like this:

py> '{0:^9o} a{1:9x}'.format(25, 31)
'   31     a       1f'

In this case, the template '{0:^9o} a{1:9x}' requires two arguments since 
it has two substitutions, {0} and {1}. Each substitution has a format 
spec following the colon: {0:^9o} and {1:9x}

But the format function only takes a single "object to be substituted", 
and so doesn't take a brace substitution. Instead, it just takes the 
format spec part:


py> format(25, '^9o')
'   31    '
py> format(31, '^9o')
'   37    '

format will not split a tuple into multiple arguments for you, since the 
tuple is considered a single object.



-- 
Steven



More information about the Python-list mailing list