我正在尝试获取子解析器的帮助屏幕,以显示必需的参数(在可选参数之前)。
我遵循了Argparse: Required arguments listed under "optional arguments"?给出的最后一个答案,但是无法获得必需的参数,使其出现在可选参数的上方。
这是我的代码段:
rend()
输出为:
## using Python 3.6.3
import argparse
from argparse import RawTextHelpFormatter
main_parser = argparse.ArgumentParser(prog="myProg")
subparsers = main_parser.add_subparsers()
## common to all sub-parsers
common_parser = argparse.ArgumentParser(add_help=False)
common_parser.add_argument('foo')
optional = common_parser._action_groups.pop()
required = common_parser.add_argument_group('required arguments')
required.add_argument("-p", type=int, required=True, help='help for -p')
optional.add_argument('-x', help='help for -x')
common_parser._action_groups.append(optional)
abcd_parser = subparsers.add_parser("abcd", parents=[common_parser])
wxyz_parser = subparsers.add_parser("wxyz", parents=[common_parser])
args = main_parser.parse_args()
但是,我希望输出看起来像这样:
$ ./myProg abcd -h
usage: myProg abcd [-h] -p P [-x X] foo
positional arguments:
foo
optional arguments:
-h, --help show this help message and exit
-x X help for -x
required arguments:
-p P help for -p
是否可以获得预期的结果?需要做什么?
谢谢
-安德鲁
答案 0 :(得分:0)
这不是次级解析器所独有的。添加的组总是在默认组之后列出。
In [2]: parser = argparse.ArgumentParser()
帮助是通过format_help
方法产生的:
In [3]: parser.format_help??
Signature: parser.format_help()
Docstring: <no docstring>
Source:
def format_help(self):
formatter = self._get_formatter()
# usage
formatter.add_usage(self.usage, self._actions,
self._mutually_exclusive_groups)
# description
formatter.add_text(self.description)
# positionals, optionals and user-defined groups
for action_group in self._action_groups:
formatter.start_section(action_group.title)
formatter.add_text(action_group.description)
formatter.add_arguments(action_group._group_actions)
formatter.end_section()
# epilog
formatter.add_text(self.epilog)
# determine help from format above
return formatter.format_help()
它循环遍历_action_groups
,并将它们添加到格式化程序对象中。
对于新启动的解析器,有2组:
In [4]: parser._action_groups
Out[4]:
[<argparse._ArgumentGroup at 0x7f4dfc2a22e8>,
<argparse._ArgumentGroup at 0x7f4dfc2a2400>]
In [5]: [g.title for g in parser._action_groups]
Out[5]: ['positional arguments', 'optional arguments']
help
操作也已添加到“可选参数”组中。
添加组,列表现在为:
In [6]: g1 = parser.add_argument_group('required arguments')
In [7]: [g.title for g in parser._action_groups]
Out[7]: ['positional arguments', 'optional arguments', 'required arguments']
所以:
In [8]: parser.add_argument('foo');
In [9]: parser.add_argument('--bar');
In [10]: g1.add_argument('--baz',required=True);
In [11]: parser.print_help()
usage: ipython3 [-h] [--bar BAR] --baz BAZ foo
positional arguments:
foo
optional arguments:
-h, --help show this help message and exit
--bar BAR
required arguments:
--baz BAZ
更改顺序需要更改format_help
方法或(可能)更改_action_groups
列表中元素的顺序。
例如,我们可以反转该列表IN_PLACE:
In [18]: parser._action_groups.reverse()
In [19]: [g.title for g in parser._action_groups]
Out[19]: ['required arguments', 'optional arguments', 'positional arguments']
In [20]: parser.print_help()
usage: ipython3 [-h] [--bar BAR] --baz BAZ foo
required arguments:
--baz BAZ
optional arguments:
-h, --help show this help message and exit
--bar BAR
positional arguments:
foo
这样的自定义重新排序似乎也可以正常工作:
In [22]: alist = parser._action_groups
In [23]: alist[:] = [alist[0], alist[2], alist[1]]
不保证。我只是根据我对代码的了解来探索选项。