【问题标题】:Reorder Python argparse argument groups重新排序 Python argparse 参数组
【发布时间】:2016-12-27 02:08:10
【问题描述】:

我正在使用argparse,并且我有一个自定义参数组required arguments。有没有办法改变帮助信息中参数组的顺序?我认为在可选参数之前有必需的参数更合乎逻辑,但没有找到任何文档或问题可以提供帮助。

例如,改变这个:

usage: foo.py [-h] -i INPUT [-o OUTPUT]

Foo

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                      Output file name

required arguments:
  -i INPUT, --input INPUT
                      Input file name

对此:

usage: foo.py [-h] -i INPUT [-o OUTPUT]

Foo

required arguments:
  -i INPUT, --input INPUT
                      Input file name

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                      Output file name

(示例取自this question)

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    您可以考虑添加一个显式的可选参数组:

    import argparse
    
    parser = argparse.ArgumentParser(description='Foo', add_help=False)
    
    required = parser.add_argument_group('required arguments')
    required.add_argument('-i', '--input', help='Input file name', required=True)
    
    optional = parser.add_argument_group('optional arguments')
    optional.add_argument("-h", "--help", action="help", help="show this help message and exit")
    optional.add_argument('-o', '--output', help='Output file name', default='stdout')
    
    parser.parse_args(['-h'])
    

    您可以将帮助操作移动到您的可选组中 这里描述: Move "help" to a different Argument Group in python argparse

    如您所见,代码产生了所需的输出:

    usage: code.py -i INPUT [-h] [-o OUTPUT]
    
    Foo
    
    required arguments:
      -i INPUT, --input INPUT
                            Input file name
    
    optional arguments:
      -h, --help            show this help message and exit
      -o OUTPUT, --output OUTPUT
                            Output file name
    

    【讨论】:

      【解决方案2】:

      解析器以 2 个参数组开始,通常是 positional 和 optionals。 -h 帮助添加到 optionals。当您执行add_argument_group 时,将创建一个组(并返回给您)。它也被附加到parser._action_groups 列表中。

      当您寻求帮助时 (-h) 会调用 parser.format_help()(您也可以在测试中这样做)。在argparse.py 中查找该方法。这设置了帮助消息,一步是:

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

      因此,如果我们对parser._action_groups 列表中的项目重新排序,我们将对显示中的组重新排序。由于这是_action_groups 的唯一用途,它应该是安全且简单的。但是有些人不允许在幕后达到顶峰(查看或更改._ 属性)。

      建议的解决方案是按照您希望查看的顺序创建您自己的组,并确保默认组为空(add_help=False 参数)。如果您坚持使用公共 API,这是唯一的方法。

      演示:

      import argparse
      parser = argparse.ArgumentParser()
      parser.add_argument('foo')
      g1 = parser.add_argument_group('REQUIRED')
      g1.add_argument('--bar', required=True)
      g1.add_argument('baz', nargs=2)
      
      print(parser._action_groups)   
      print([group.title for group in parser._action_groups])
      print(parser.format_help())
      
      parser._action_groups.reverse()  # easy inplace change
      parser.print_help()
      

      运行结果:

      1504:~/mypy$ python stack39047075.py 
      

      _actions_group 列表和标题:

      [<argparse._ArgumentGroup object at 0xb7247fac>,
       <argparse._ArgumentGroup object at 0xb7247f6c>,
       <argparse._ArgumentGroup object at 0xb721de0c>]
      ['positional arguments', 'optional arguments', 'REQUIRED']
      

      默认帮助:

      usage: stack39047075.py [-h] --bar BAR foo baz baz
      
      positional arguments:
        foo
      
      optional arguments:
        -h, --help  show this help message and exit
      
      REQUIRED:
        --bar BAR
        baz
      

      反转后:

      usage: stack39047075.py [-h] --bar BAR foo baz baz
      
      REQUIRED:
        --bar BAR
        baz
      
      optional arguments:
        -h, --help  show this help message and exit
      
      positional arguments:
        foo
      1504:~/mypy$ 
      

      实现这一点的另一种方法是使用新的format_help 方法定义ArgumentParser 子类。在该方法中,重新排序 for action_group... 循环中使用的列表。

      【讨论】:

        【解决方案3】:

        这无疑是一种 hack,并且依赖于可变的内部实现,但是在添加参数之后,您可以简单地执行以下操作:

        parser._action_groups.reverse()
        

        这将有效地使所需参数组显示在可选参数组上方。请注意,此答案仅是描述性的,而非说明性的。


        信用:answer by hpaulj

        【讨论】:

          猜你喜欢
          • 2019-11-17
          • 2018-06-27
          • 1970-01-01
          • 2011-01-27
          • 2017-06-05
          • 2012-08-11
          • 2012-07-03
          • 2013-09-24
          相关资源
          最近更新 更多