Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8a6a198

Browse files
committed
Issue #9026: Fix order of argparse sub-commands in help messages.
1 parent a6e0b4f commit 8a6a198

3 files changed

Lines changed: 84 additions & 4 deletions

File tree

Lib/argparse.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
]
8383

8484

85+
import collections as _collections
8586
import copy as _copy
8687
import os as _os
8788
import re as _re
@@ -1041,7 +1042,7 @@ def __init__(self,
10411042

10421043
self._prog_prefix = prog
10431044
self._parser_class = parser_class
1044-
self._name_parser_map = {}
1045+
self._name_parser_map = _collections.OrderedDict()
10451046
self._choices_actions = []
10461047

10471048
super(_SubParsersAction, self).__init__(

Lib/test/test_argparse.py

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2837,16 +2837,22 @@ def _get_parser(self, tester):
28372837
parser = argparse.ArgumentParser(
28382838
*tester.parser_signature.args,
28392839
**tester.parser_signature.kwargs)
2840-
for argument_sig in tester.argument_signatures:
2840+
for argument_sig in getattr(tester, 'argument_signatures', []):
28412841
parser.add_argument(*argument_sig.args,
28422842
**argument_sig.kwargs)
2843-
group_signatures = tester.argument_group_signatures
2844-
for group_sig, argument_sigs in group_signatures:
2843+
group_sigs = getattr(tester, 'argument_group_signatures', [])
2844+
for group_sig, argument_sigs in group_sigs:
28452845
group = parser.add_argument_group(*group_sig.args,
28462846
**group_sig.kwargs)
28472847
for argument_sig in argument_sigs:
28482848
group.add_argument(*argument_sig.args,
28492849
**argument_sig.kwargs)
2850+
subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
2851+
if subparsers_sigs:
2852+
subparsers = parser.add_subparsers()
2853+
for subparser_sig in subparsers_sigs:
2854+
subparsers.add_parser(*subparser_sig.args,
2855+
**subparser_sig.kwargs)
28502856
return parser
28512857

28522858
def _test(self, tester, parser_text):
@@ -3940,6 +3946,77 @@ class TestHelpVersionAction(HelpTestCase):
39403946
'''
39413947
version = ''
39423948

3949+
class TestHelpSubparsersOrdering(HelpTestCase):
3950+
"""Test ordering of subcommands in help matches the code"""
3951+
parser_signature = Sig(prog='PROG',
3952+
description='display some subcommands',
3953+
version='0.1')
3954+
3955+
subparsers_signatures = [Sig(name=name)
3956+
for name in ('a', 'b', 'c', 'd', 'e')]
3957+
3958+
usage = '''\
3959+
usage: PROG [-h] [-v] {a,b,c,d,e} ...
3960+
'''
3961+
3962+
help = usage + '''\
3963+
3964+
display some subcommands
3965+
3966+
positional arguments:
3967+
{a,b,c,d,e}
3968+
3969+
optional arguments:
3970+
-h, --help show this help message and exit
3971+
-v, --version show program's version number and exit
3972+
'''
3973+
3974+
version = '''\
3975+
0.1
3976+
'''
3977+
3978+
class TestHelpSubparsersWithHelpOrdering(HelpTestCase):
3979+
"""Test ordering of subcommands in help matches the code"""
3980+
parser_signature = Sig(prog='PROG',
3981+
description='display some subcommands',
3982+
version='0.1')
3983+
3984+
subcommand_data = (('a', 'a subcommand help'),
3985+
('b', 'b subcommand help'),
3986+
('c', 'c subcommand help'),
3987+
('d', 'd subcommand help'),
3988+
('e', 'e subcommand help'),
3989+
)
3990+
3991+
subparsers_signatures = [Sig(name=name, help=help)
3992+
for name, help in subcommand_data]
3993+
3994+
usage = '''\
3995+
usage: PROG [-h] [-v] {a,b,c,d,e} ...
3996+
'''
3997+
3998+
help = usage + '''\
3999+
4000+
display some subcommands
4001+
4002+
positional arguments:
4003+
{a,b,c,d,e}
4004+
a a subcommand help
4005+
b b subcommand help
4006+
c c subcommand help
4007+
d d subcommand help
4008+
e e subcommand help
4009+
4010+
optional arguments:
4011+
-h, --help show this help message and exit
4012+
-v, --version show program's version number and exit
4013+
'''
4014+
4015+
version = '''\
4016+
0.1
4017+
'''
4018+
4019+
39434020
# =====================================
39444021
# Optional/Positional constructor tests
39454022
# =====================================

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ Library
167167
- Issue #9343: Document that argparse parent parsers must be configured before
168168
their children.
169169

170+
- Issue #9026: Fix order of argparse sub-commands in help messages.
171+
170172
Build
171173
-----
172174

0 commit comments

Comments
 (0)