]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-116850: Fix argparse for namespaces with not directly writable dict (GH-124667)
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 29 Sep 2024 08:01:10 +0000 (11:01 +0300)
committerGitHub <noreply@github.com>
Sun, 29 Sep 2024 08:01:10 +0000 (11:01 +0300)
It now always uses setattr() instead of setting the dict item to modify
the namespace. This allows to use a class as a namespace.

Lib/argparse.py
Lib/test/test_argparse.py
Misc/NEWS.d/next/Library/2024-09-27-15-16-04.gh-issue-116850.dBkR0-.rst [new file with mode: 0644]

index a671c8b56b55bbfcd569cb2178afa24b1e09826a..504289192f3f96621c62686967f41cb87d4d24c1 100644 (file)
@@ -1224,7 +1224,8 @@ class _SubParsersAction(Action):
             setattr(namespace, key, value)
 
         if arg_strings:
-            vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
+            if not hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
+                setattr(namespace, _UNRECOGNIZED_ARGS_ATTR, [])
             getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
 
 class _ExtendAction(_AppendAction):
index 91f04fa1358a9d81808f847a60f8b28c9ab85985..15805937baaa9727edd30dc5b5d75bd26ef3adf7 100644 (file)
@@ -2344,6 +2344,18 @@ class TestAddSubparsers(TestCase):
             (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']),
         )
 
+    def test_parse_known_args_to_class_namespace(self):
+        class C:
+            pass
+        self.assertEqual(
+            self.parser.parse_known_args('0.5 1 b -w 7 -p'.split(), namespace=C),
+            (C, ['-p']),
+        )
+        self.assertIs(C.foo, False)
+        self.assertEqual(C.bar, 0.5)
+        self.assertEqual(C.w, 7)
+        self.assertEqual(C.x, 'b')
+
     def test_parse_known_args_with_single_dash_option(self):
         parser = ErrorRaisingArgumentParser()
         parser.add_argument('-k', '--known', action='count', default=0)
diff --git a/Misc/NEWS.d/next/Library/2024-09-27-15-16-04.gh-issue-116850.dBkR0-.rst b/Misc/NEWS.d/next/Library/2024-09-27-15-16-04.gh-issue-116850.dBkR0-.rst
new file mode 100644 (file)
index 0000000..62639a1
--- /dev/null
@@ -0,0 +1,2 @@
+Fix :mod:`argparse` for namespaces with not directly writable dict (e.g.
+classes).