Argparse帮助屏幕:在SUB分析器的可选参数上方显示必需的参数

时间:2018-10-11 18:12:57

标签: python-3.6 argparse

我正在尝试获取子解析器的帮助屏幕,以显示必需的参数(在可选参数之前)。

我遵循了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

是否可以获得预期的结果?需要做什么?

谢谢

-安德鲁

1 个答案:

答案 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]]

不保证。我只是根据我对代码的了解来探索选项。