summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/argparse.py3
-rw-r--r--Lib/test/test_argparse.py12
-rw-r--r--Misc/NEWS.d/next/Library/2024-09-27-15-16-04.gh-issue-116850.dBkR0-.rst2
3 files changed, 16 insertions, 1 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index a671c8b..5042891 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -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):
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
index 91f04fa..1580593 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -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
index 0000000..62639a1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-09-27-15-16-04.gh-issue-116850.dBkR0-.rst
@@ -0,0 +1,2 @@
+Fix :mod:`argparse` for namespaces with not directly writable dict (e.g.
+classes).