]> granicus.if.org Git - python/commitdiff
Issue #24360: Improve __repr__ of argparse.Namespace() for invalid identifiers.
authorBerker Peksag <berker.peksag@gmail.com>
Wed, 29 Jul 2015 20:51:47 +0000 (23:51 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Wed, 29 Jul 2015 20:51:47 +0000 (23:51 +0300)
Patch by Matthias Bussonnier.

Lib/argparse.py
Lib/test/test_argparse.py
Misc/NEWS

index 9a067196dac3ffb6c413a1f144a5180fd2c6ccdc..cc538415d23465586b4784cc5ecfcf63466c63bd 100644 (file)
@@ -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):
index 27bfad5fb61496fddbc26f87e8f9d12c1e186a7b..893ec394f643536adabf224875e9d6e38409a6d2 100644 (file)
@@ -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 = (
index 2c5d17a4de3148deff4a76512336dba94fc19c50..a3ada976021085682d7b6f730f4738a9bacec432 100644 (file)
--- 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.