【问题标题】:Argparse help screen: show required arguments above optional arguments for SUB-parsersArgparse 帮助屏幕:在 SUB 解析器的可选参数上方显示所需参数
【发布时间】:2019-03-16 22:00:55
【问题描述】:

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

我按照Argparse: Required arguments listed under "optional arguments"? 给出的最后一个答案,但无法让所需的参数出现在可选参数的上方。

这是我的代码 sn-p:

## 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

但是,我希望输出看起来像:

$ ./myProg abcd -h
usage: myProg abcd [-h] -p P [-x X] foo

positional arguments:
  foo

required arguments:
  -p P        help for -p

optional arguments:
  -h, --help  show this help message and exit
  -x X        help for -x

是否有可能得到想要的结果?需要做什么?

谢谢

--安德鲁

【问题讨论】:

    标签: python-3.6 argparse


    【解决方案1】:

    这不是子解析器独有的。添加的组总是列在默认组之后。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2013-02-01
      • 2021-09-04
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多