重新排序Python argparse参数组

时间:2016-08-19 20:19:00

标签: python argparse

我使用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

的例子

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

解析器以2个参数组开始,通常为positionaloptionals-h帮助已添加到optionals。执行add_argument_group时,会创建一个组(并返回给您)。它还附加在parser._action_groups列表中。

当您寻求帮助时(-hparser.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$ 

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

答案 2 :(得分:2)

这无疑是一个黑客,并且依赖于可更改的内部实现,但在添加参数后,您可以简单地执行:

parser._action_groups.reverse()

这将有效地使必需的参数组显示在可选参数组的上方。请注意,此答案仅用于描述性而非规定性

信用:answer by hpaulj