Python argparse - mandatory argument - either positional or optional
我希望用户能够使用位置参数或可选参数将强制参数传递给"argparse"。
即。,以下两种表格均有效:
1 2 | my_prog arg my_prog -m arg |
我见过argparse可选位置参数吗?
但是这里的建议使得这两种形式都是可选的。我希望其中一个是强制性的。
当然,我可以在分析至少设置了其中一个之后添加手动检查。但我预感到一定有更好的解决办法。
(即使使用我的手动方法,"帮助"部分也将它们显示为可选)
对于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | In [146]: import argparse In [147]: parser = argparse.ArgumentParser() In [148]: gp = parser.add_mutually_exclusive_group(required=True) In [149]: gp.add_argument('pos', nargs='?', default='foo'); In [150]: gp.add_argument('-f','--foo', default='bar'); In [151]: parser.parse_args('arg'.split()) Out[151]: Namespace(foo='bar', pos='arg') In [152]: parser.parse_args('-f arg'.split()) Out[152]: Namespace(foo='arg', pos='foo') In [153]: parser.parse_args('arg -f arg'.split()) usage: ipython3 [-h] [-f FOO] [pos] ipython3: error: argument -f/--foo: not allowed with argument pos In [154]: parser.parse_args(''.split()) usage: ipython3 [-h] [-f FOO] [pos] ipython3: error: one of the arguments pos -f/--foo is required In [155]: parser.parse_args('-h'.split()) usage: ipython3 [-h] [-f FOO] [pos] positional arguments: pos optional arguments: -h, --help show this help message and exit -f FOO, --foo FOO |
哎呀,用法并没有显示
切换参数定义的顺序可以更好地使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | In [156]: parser = argparse.ArgumentParser() In [157]: gp = parser.add_mutually_exclusive_group(required=True) In [158]: gp.add_argument('-f','--foo', default='bar'); In [159]: gp.add_argument('pos', nargs='?', default='foo'); In [160]: In [160]: parser.parse_args('-h'.split()) usage: ipython3 [-h] (-f FOO | pos) positional arguments: pos optional arguments: -h, --help show this help message and exit -f FOO, --foo FOO |
使用用户定义的参数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | In [165]: parser = argparse.ArgumentParser() In [166]: gp = parser.add_argument_group('Mutually exclusive') In [167]: gpm = gp.add_mutually_exclusive_group(required=True) In [168]: gpm.add_argument('-f','--foo', default='bar'); In [169]: gpm.add_argument('pos', nargs='?', default='foo'); In [170]: In [170]: parser.parse_args('-h'.split()) usage: ipython3 [-h] (-f FOO | pos) optional arguments: -h, --help show this help message and exit Mutually exclusive: -f FOO, --foo FOO pos |
这是一般规则参数"组"和相互排斥的"组"的一个例外,它们不是为嵌套而设计的。
不需要m-x-group,使用将使用
1 | usage: ipython3 [-h] [-f FOO | pos] |