str.format(list) with negative index doesn't work in Python

formatting, python, string

Solution

It's what I would call a design glitch in the format string specs. Per the docs,

element_index     ::=  integer | index_string

but, alas, `-1` is not "an integer" -- it's an expression. The unary-minus operator doesn't even have particularly high priority, so that for example `print(-2**2)` emits `-4` -- another common issue and arguably a design glitch (the `**` operator has higher priority, so the raise-to-power happens first, then the change-sign requested by the lower priority unary `-`).

Anything in that position in the format string that's not an integer (but, for example, an expression) is treated as a string, to index a dict argument -- for example:

$ python3 -c "print('The last:{0[2+2]}'.format({'2+2': 23}))"
The last:23

Not sure whether this is worth raising an issue in the Python trac, but it's certainly a somewhat surprising behavior:-(.

Problem

I use a negative index in replacement fields to output a formatted list,but it raises a TypeError.The codes are as follows: ``` >>> a=[1,2,3] >>> a[2] 3 >>> a[-1] 3 >>> 'The last:{0[2]}'.format(a) 'The last:3' >>> 'The last:{0[-1]}'.format(a) Traceback (most recent call last): File "", line 1, in TypeError: list indices must be integers, not str ```

Original source