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:-(.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…