我使用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)
的例子答案 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个参数组开始,通常为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$
实现此目的的另一种方法是使用新的ArgumentParser
方法定义format_help
子类。在该方法中重新排序该for action_group...
循环中使用的列表。
答案 2 :(得分:2)
这无疑是一个黑客,并且依赖于可更改的内部实现,但在添加参数后,您可以简单地执行:
parser._action_groups.reverse()
这将有效地使必需的参数组显示在可选参数组的上方。请注意,此答案仅用于描述性而非规定性。