'1'
x = list(range(10))
'{x[1]}'.format(**vars())
Traceback (most recent call last):
'{x[-1]}'.format(**vars())
Can anyone explain this error? It seems that a negative index is
deemed to be a string in this case.
'{x[-1]}'.format(**vars())
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.
'1'
x = list(range(10))
'{x[1]}'.format(**vars())
Traceback (most recent call last):
'{x[-1]}'.format(**vars())
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.
'42 ham'"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})
Traceback (most recent call last):"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})
On Wed, 20 Jul 2022 at 18:34, Frank Millman <frank@chagford.com> 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:
'42 ham'"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})
Traceback (most recent call last):"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})
File "<stdin>", line 1, in <module>
KeyError: 1
But I can't find it documented anywhere that digits-only means
numeric. The best I can find is:
https://docs.python.org/3/library/string.html#formatstrings
"""The arg_name can be followed by any number of index or attribute expressions. An expression of the form '.name' selects the named
attribute using getattr(), while an expression of the form '[index]'
does an index lookup using __getitem__()."""
and in the corresponding grammar:
field_name ::= arg_name ("." attribute_name | "[" element_index "]")* index_string ::= <any source character except "]"> +
In other words, any sequence of characters counts as an argument, as
long as it's not ambiguous. It doesn't seem to say that "all digits is interpreted as an integer, everything else is interpreted as a
string". ISTM that a negative number should be interpreted as an
integer too, but that might be a backward compatibility break.
On 2022-07-20 11:37 AM, Chris Angelico wrote:
On Wed, 20 Jul 2022 at 18:34, Frank Millman <frank@chagford.com> 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:
'42 ham'"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})
Traceback (most recent call last):"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})
File "<stdin>", line 1, in <module>
KeyError: 1
But I can't find it documented anywhere that digits-only means
numeric. The best I can find is:
https://docs.python.org/3/library/string.html#formatstrings
"""The arg_name can be followed by any number of index or attribute
expressions. An expression of the form '.name' selects the named
attribute using getattr(), while an expression of the form '[index]'
does an index lookup using __getitem__()."""
and in the corresponding grammar:
field_name ::= arg_name ("." attribute_name | "["
element_index "]")*
index_string ::= <any source character except "]"> +
In other words, any sequence of characters counts as an argument, as
long as it's not ambiguous. It doesn't seem to say that "all digits is
interpreted as an integer, everything else is interpreted as a
string". ISTM that a negative number should be interpreted as an
integer too, but that might be a backward compatibility break.
Thanks for investigating this further. I agree it seems odd.
As quoted above, an expression of the form '[index]' does an index
lookup using __getitem()__.
The only __getitem__() that I can find is in the operator module, and
that handles negative numbers just fine.
Do you think it is worth me raising an issue, if only to find out the rationale if there is one?
Frank
On 2022-07-20 11:37 AM, Chris Angelico wrote:
On Wed, 20 Jul 2022 at 18:34, Frank Millman <frank@chagford.com> 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:
'42 ham'"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})
Traceback (most recent call last):"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})
File "<stdin>", line 1, in <module>
KeyError: 1
But I can't find it documented anywhere that digits-only means
numeric. The best I can find is:
https://docs.python.org/3/library/string.html#formatstrings
"""The arg_name can be followed by any number of index or attribute expressions. An expression of the form '.name' selects the named
attribute using getattr(), while an expression of the form '[index]'
does an index lookup using __getitem__()."""
and in the corresponding grammar:
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
index_string ::= <any source character except "]"> +
In other words, any sequence of characters counts as an argument, as
long as it's not ambiguous. It doesn't seem to say that "all digits is interpreted as an integer, everything else is interpreted as a
string". ISTM that a negative number should be interpreted as an
integer too, but that might be a backward compatibility break.
Thanks for investigating this further. I agree it seems odd.
As quoted above, an expression of the form '[index]' does an index
lookup using __getitem()__.
The only __getitem__() that I can find is in the operator module, and
that handles negative numbers just fine.
Do you think it is worth me raising an issue, if only to find out the rationale if there is one?
I saw this from Paul Rubin - for some reason his posts appear in google groups, but not python-list.
"It seems to only want integer constants. x[2+2] and x[k] where k=2
don't work either.
I think the preferred style these days is f'{x[-1]}' which works."
Unfortunately the 'f' option does not work for me in this case, as I am
using a string object, not a string literal.
On Wed, 20 Jul 2022 at 18:34, Frank Millman <frank@chagford.com> 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:
'42 ham'"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})
Traceback (most recent call last):"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})
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.
On Wed, 20 Jul 2022 at 20:55, Frank Millman <frank@chagford.com> wrote:
On 2022-07-20 11:37 AM, Chris Angelico wrote:
On Wed, 20 Jul 2022 at 18:34, Frank Millman <frank@chagford.com> 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:
'42 ham'"{x[1]} {x[spam]}".format(x={1: 42, "spam": "ham"})
Traceback (most recent call last):"{x[1]} {x[spam]}".format(x={"1": 42, "spam": "ham"})
File "<stdin>", line 1, in <module>
KeyError: 1
But I can't find it documented anywhere that digits-only means
numeric. The best I can find is:
https://docs.python.org/3/library/string.html#formatstrings
"""The arg_name can be followed by any number of index or attribute
expressions. An expression of the form '.name' selects the named
attribute using getattr(), while an expression of the form '[index]'
does an index lookup using __getitem__()."""
and in the corresponding grammar:
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
index_string ::= <any source character except "]"> +
In other words, any sequence of characters counts as an argument, as
long as it's not ambiguous. It doesn't seem to say that "all digits is
interpreted as an integer, everything else is interpreted as a
string". ISTM that a negative number should be interpreted as an
integer too, but that might be a backward compatibility break.
Thanks for investigating this further. I agree it seems odd.
As quoted above, an expression of the form '[index]' does an index
lookup using __getitem()__.
The only __getitem__() that I can find is in the operator module, and
that handles negative numbers just fine.
In general, __getitem__ is the method used to handle those sorts of lookups:
class X:
def __getitem__(self, item):
print("Get item", type(item), item)
"{x[0]} {x[1]} {x[-1]} {x[spam]} {x[1.0]}".format(x=X())
Outside of a format directive, you'd need to quote those:
x[0], x[1], x["spam"]
The distinction is that unquoted bare numbers are interpreted as
integers, not as strings. I'm unable to find the exact definition of
that documented.
Do you think it is worth me raising an issue, if only to find out the
rationale if there is one?
I'd wait for other people's responses first, there may be a better
insight to be found than what I was able to come across.
I think the preferred style these days is f'{x[-1]}' which works."
Unfortunately the 'f' option does not work for me in this case, as I am
using a string object, not a string literal.
On 7/20/22 05:04, Frank Millman wrote:
I think the preferred style these days is f'{x[-1]}' which works."
Unfortunately the 'f' option does not work for me in this case, as I am
using a string object, not a string literal.
For that you could consider
https://pypi.org/project/f-yeah/
(straying a bit off thread subject by now, admittedly)
--
https://mail.python.org/mailman/listinfo/python-list
On Wed, 20 Jul 2022 at 18:34, Frank Millman <frank@chagford.com> wrote: >>> >>>
>>> 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.
[...]
"It seems to only want integer constants. x[2+2] and x[k] where k=2
don't work either.
I think the preferred style these days is f'{x[-1]}' which works."
Unfortunately the 'f' option does not work for me in this case, as I am
using a string object, not a string literal.
On Wed, 20 Jul 2022 at 23:50, Peter Otten <__peter__@web.de> wrote:
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.
Cool. I think this is a good justification for a docs patch, since
that really should be mentioned somewhere other than a historical
document.
ChrisA
Unfortunately the 'f' option does not work for me in this case, as I
am using a string object, not a string literal.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 296 |
Nodes: | 16 (2 / 14) |
Uptime: | 62:15:49 |
Calls: | 6,654 |
Files: | 12,200 |
Messages: | 5,331,626 |