From: Antony Lee Date: Sun, 1 May 2022 06:04:50 +0000 (+0200) Subject: bpo-39716: Raise on conflicting subparser names. (GH-18605) X-Git-Tag: v3.11.0b1~152 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ad5e8520f3e117f45481513014548a39879d30d2;p=thirdparty%2FPython%2Fcpython.git bpo-39716: Raise on conflicting subparser names. (GH-18605) Raise an ArgumentError when the same subparser name is added twice to an ArgumentParser. This is consistent with the (default) behavior when the same option string is added twice to an ArgumentParser. (Support for `conflict_handler="resolve"` could be considered as a followup feature, although real use cases seem even rarer than "resolve"ing option-strings.) Automerge-Triggered-By: GH:rhettinger --- diff --git a/Lib/argparse.py b/Lib/argparse.py index 668e1d416231..c47aeffc2c3f 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1171,6 +1171,13 @@ class _SubParsersAction(Action): aliases = kwargs.pop('aliases', ()) + if name in self._name_parser_map: + raise ArgumentError(self, _('conflicting subparser: %s') % name) + for alias in aliases: + if alias in self._name_parser_map: + raise ArgumentError( + self, _('conflicting subparser alias: %s') % alias) + # create a pseudo-action to hold the choice help if 'help' in kwargs: help = kwargs.pop('help') diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 5777cb50f7e5..794b9df3796d 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -4804,6 +4804,19 @@ class TestConflictHandling(TestCase): --spam NEW_SPAM ''')) + def test_subparser_conflict(self): + parser = argparse.ArgumentParser() + sp = parser.add_subparsers() + sp.add_parser('fullname', aliases=['alias']) + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'fullname') + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'alias') + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'other', aliases=['fullname']) + self.assertRaises(argparse.ArgumentError, + sp.add_parser, 'other', aliases=['alias']) + # ============================= # Help and Version option tests diff --git a/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst b/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst new file mode 100644 index 000000000000..f122811e6bfe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-02-22-12-02-11.bpo-39716.z2WhDQ.rst @@ -0,0 +1,3 @@ +Raise an ArgumentError when the same subparser name is added twice to an +`argparse.ArgumentParser`. This is consistent with the (default) behavior +when the same option string is added twice to an ArgumentParser.