New submission from Saiyang Gou <[email protected]>:
It is generally a convention to design the repr string such that
`eval(repr(obj))` can reproduce the object. Issue 24360 handles the special
situation when arg name passed to `argparse.Namespace` is not a valid
identifier:
>>> from argparse import Namespace
>>> Namespace(**{')': 3})
Namespace(**{')': 3})
However there is one more corner case to handle: the arg name could be a
reserved keyword.
>>> Namespace(**{'return': 3})
Namespace(return=3)
>>> Namespace(return=3)
File "<stdin>", line 1
Namespace(return=3)
^
SyntaxError: invalid syntax
I noticed that the documentation of `str.isidentifier` tells me to also check
for keywords with `keyword.iskeyword`. However `__debug__` is not considered a
keyword by `keyword.iskeyword`, but cannot be assigned to:
>>> keyword.iskeyword('__debug__')
False
>>> Namespace(**{'__debug__':3})
Namespace(__debug__=3)
>>> Namespace(__debug__=3)
File "<stdin>", line 1
SyntaxError: cannot assign to __debug__
I propose to enhance the arg name check in `argparse._AttributeHolder` from `if
name.isidentifier():` to `if name.isidentifier() and not
keyword.iskeyword(name) and name != '__debug__:'` to fix this. However this may
slow down the argparse library since it will need to `import keyword` at the
beginning, and `__repr__` will also be slower due to the added arg name checks.
By the way, when I came across issue 39076, I noticed that
`types.SimpleNamespace` is not considering this problem at all:
>>> types.SimpleNamespace(**{')': 1, 'return': 2})
namespace()=1, return=2)
----------
components: Library (Lib)
messages: 366265
nosy: gousaiyang
priority: normal
severity: normal
status: open
title: argparse.Namespace __repr__ does not handle reserved keywords
type: enhancement
versions: Python 3.9
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue40265>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com