如何在python argparse中向add_mutually_exclusive_group添加argument_group
我正在尝试实现以下内容:
$ prog.py -h
usage: prog.py [-h] [-s | -m] [[-y [year]] | [[-1 | -3] [month] [year]]]
但是,无论我怎么调整 add_argument_group
和 add_mutually_exclusive_group
,
#!/usr/bin/env python
import argparse
def main(opt):
print(opt)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
bar = parser.add_mutually_exclusive_group()
bar.add_argument('-s', action='store_true', default=True)
bar.add_argument('-m', action='store_true', default=False)
#bar = parser.add_argument_group()
bar = parser.add_mutually_exclusive_group()
bar.add_argument('-y', metavar='year', type=int,
dest='iy', nargs='?', default=0)
baz = bar.add_argument_group()
g_13 = baz.add_mutually_exclusive_group()
g_13.add_argument('-1', dest='i1',
help='Display single month output.',
action='store_true', default=True)
g_13.add_argument('-3', dest='i3',
help='Display prev/current/next month output.',
action='store_true', default=False)
#aaa = bar.add_argument_group()
baz.add_argument(metavar='month', type=int,
choices=range(1, 13),
dest='mo', nargs='?', default=1)
baz.add_argument(metavar='year', type=int,
dest='yr', nargs='?', default=2000)
main(parser.parse_args())
我只能做到:
$ prog.py -h
usage: prog.py [-h] [-s | -m] [-y [year]] [-1 | -3] [month] [year]
也就是说,我无法把 [-y [year]]
和 [[-1 | -3] [month] [year]]
这两个组合成一个互斥的组。我搞不明白为什么。有人能帮忙吗?谢谢。
1 个回答
13
参数组只是用来整理帮助信息的显示,它们不能嵌套。互斥组是用来测试参数并修改使用说明的。虽然互斥组可以嵌套,但最终的效果和把所有参数放在一个大组里是一样的。http://bugs.python.org/issue11588 这个链接在尝试创建一个更通用的 usage
组。
与此同时,如果互斥组不能满足你的需求,你可以自己写一行使用说明,并在解析后测试参数。
这里有一个解析器的代码,我正在为 http://bugs.python.org/issue11588 开发。
parser = argparse.ArgumentParser(formatter_class=argparse.UsageGroupHelpFormatter)
bar = parser.add_usage_group(kind='mxg', dest='s|m')
bar.add_argument('-s', action='store_true', default=True)
bar.add_argument('-m', action='store_true', default=False)
bar = parser.add_usage_group(kind='mxg', dest='year|more')
bar.add_argument('-y', metavar='year', type=int,...)
baz = bar.add_usage_group(kind='any', dest='', joiner=' ', parens='[]')
g_13 = baz.add_usage_group(kind='mxg', dest='1|3')
g_13.add_argument('-1', dest='i1',...)
g_13.add_argument('-3', dest='i3',...)
baz.add_argument(metavar='month', type=int,...)
baz.add_argument(metavar='year', type=int,...)
这个代码用 usage_group
替代了 mutually_exclusive_group
,它可以嵌套,并且可以测试除了“异或”以外的其他逻辑关系。'any' 组可以接受其参数的任何组合,这和你期待的 'argument_group' 的表现类似。
最终的使用说明是:
usage: prog.py [-h] [-s | -m] [-y [year] | [[-1 | -3] month year]] [month]
[year]
主要的问题在于位置参数 'month' 和 'year' 的显示。它们在 'any' 组中位置正确,但在位置参数的常规显示位置也会出现。
它接受的输入示例有:
''
'-y 1943 -s
'-1 12 1943'
'12 1943'
'12'
'-3'
'1943' gives an error, because it it is out of range for a month
正如你所看到的,扩展组的概念并不是一件简单的事。我觉得我在朝着正确的方向前进,但仍然有一些不完善的地方。