aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2015-07-29 23:51:47 +0300
committerBerker Peksag <berker.peksag@gmail.com>2015-07-29 23:51:47 +0300
commit76b1714be84ab6e73b9b0716cbb233f044318516 (patch)
tree08a691da7726a3039f641197a4b190c73018633f
parentada5578f95bcd4b402e0e3111bb65cb70ee0daae (diff)
downloadcpython-76b1714be84ab6e73b9b0716cbb233f044318516.tar.gz
cpython-76b1714be84ab6e73b9b0716cbb233f044318516.zip
Issue #24360: Improve __repr__ of argparse.Namespace() for invalid identifiers.
Patch by Matthias Bussonnier.
-rw-r--r--Lib/argparse.py8
-rw-r--r--Lib/test/test_argparse.py15
-rw-r--r--Misc/NEWS3
3 files changed, 25 insertions, 1 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 9a067196dac..cc538415d23 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -118,10 +118,16 @@ class _AttributeHolder(object):
def __repr__(self):
type_name = type(self).__name__
arg_strings = []
+ star_args = {}
for arg in self._get_args():
arg_strings.append(repr(arg))
for name, value in self._get_kwargs():
- arg_strings.append('%s=%r' % (name, value))
+ if name.isidentifier():
+ arg_strings.append('%s=%r' % (name, value))
+ else:
+ star_args[name] = value
+ if star_args:
+ arg_strings.append('**%s' % repr(star_args))
return '%s(%s)' % (type_name, ', '.join(arg_strings))
def _get_kwargs(self):
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 27bfad5fb61..893ec394f64 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -4512,6 +4512,21 @@ class TestStrings(TestCase):
string = "Namespace(bar='spam', foo=42)"
self.assertStringEqual(ns, string)
+ def test_namespace_starkwargs_notidentifier(self):
+ ns = argparse.Namespace(**{'"': 'quote'})
+ string = """Namespace(**{'"': 'quote'})"""
+ self.assertStringEqual(ns, string)
+
+ def test_namespace_kwargs_and_starkwargs_notidentifier(self):
+ ns = argparse.Namespace(a=1, **{'"': 'quote'})
+ string = """Namespace(a=1, **{'"': 'quote'})"""
+ self.assertStringEqual(ns, string)
+
+ def test_namespace_starkwargs_identifier(self):
+ ns = argparse.Namespace(**{'valid': True})
+ string = "Namespace(valid=True)"
+ self.assertStringEqual(ns, string)
+
def test_parser(self):
parser = argparse.ArgumentParser(prog='PROG')
string = (
diff --git a/Misc/NEWS b/Misc/NEWS
index 2c5d17a4de3..a3ada976021 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@ Core and Builtins
Library
-------
+- Issue #24360: Improve __repr__ of argparse.Namespace() for invalid
+ identifiers. Patch by Matthias Bussonnier.
+
- Issue #23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch
written by Matthieu Gautier.