我正在尝试实现以下内容:
$ prog.py -h
usage: prog.py [-h] [-s | -m] [[-y [year]] | [[-1 | -3] [month] [year]]]
Run Code Online (Sandbox Code Playgroud)
但是,无论我如何玩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())
Run Code Online (Sandbox Code Playgroud)
我只能管理:
$ prog.py -h
usage: prog.py [-h] [-s | -m] [-y [year]] [-1 | -3] [month] [year]
Run Code Online (Sandbox Code Playgroud)
也就是说,我不能组[-y [year]]和[[-1 | -3] [month] [year]]成互斥组.我无法弄清楚为什么.有人可以帮忙吗?谢谢.
参数组只是帮助组织帮助显示.它们不能嵌套.互斥组测试参数并修改使用情况显示.它们可以嵌套,但最终结果与创建一个大组相同.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,...)
Run Code Online (Sandbox Code Playgroud)
这取代mutually_exclusive_group了usage_group可以嵌套的,并且可以测试除'xor'之外的其他逻辑关系.'any'类接受其论点的任何组合,就像你期望'argument_group'行动一样.
由此产生的用法是:
usage: prog.py [-h] [-s | -m] [-y [year] | [[-1 | -3] month year]] [month]
[year]
Run Code Online (Sandbox Code Playgroud)
主要错误是显示位置,'月'和'年'.它们位于"任意"组中的正确位置,但它们也显示在位置的通常尾随位置.
它接受如下输入:
''
'-y 1943 -s
'-1 12 1943'
'12 1943'
'12'
'-3'
'1943' gives an error, because it it is out of range for a month
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,扩展群体的概念并非易事.我认为我走在正确的轨道上,但仍然存在粗糙的边缘.
| 归档时间: |
|
| 查看次数: |
10959 次 |
| 最近记录: |