On 20/07/2022 11:37, Chris Angelico wrote:
On Wed, 20 Jul 2022 at 18:34, Frank Millman <[email protected]> wrote:Hi all C:\Users\E7280>python Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> x = list(range(10)) >>> >>> '{x[1]}'.format(**vars()) '1' >>> >>> '{x[-1]}'.format(**vars()) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list indices must be integers or slices, not str >>> Can anyone explain this error? It seems that a negative index is deemed to be a string in this case.Yeah, that does seem a little odd. What you're seeing is the same as this phenomenon:"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})'42 ham'"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 1 But I can't find it documented anywhere that digits-only means numeric.
I found https://peps.python.org/pep-3101/ """ PEP 3101 – Advanced String Formatting ... An example of the ‘getitem’ syntax: "My name is {0[name]}".format(dict(name='Fred')) It should be noted that the use of ‘getitem’ within a format string is much more limited than its conventional usage. In the above example, the string ‘name’ really is the literal string ‘name’, not a variable named ‘name’. The rules for parsing an item key are very simple. If it starts with a digit, then it is treated as a number, otherwise it is used as a string. Because keys are not quote-delimited, it is not possible to specify arbitrary dictionary keys (e.g., the strings “10” or “:-]”) from within a format string. """ -- https://mail.python.org/mailman/listinfo/python-list
