使用argparse的一个flag参数或两个位置参数

时间:2016-03-29 00:57:56

标签: python python-3.x argparse

我遇到了一个任务,如果启用了标志,则需要2个位置args或1个(文件):

parser.add_argument('pos_arg1', help='desc')
parser.add_argument('pos_arg2', help='desc')
parser.add_argument('--add_arg1', help='desc', type=argparse.FileType('r'), nargs='?')

因此,使用script.py arg1 arg2script.py --add_arg1 file的脚本都是有效的。我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果你定义:

In [422]: parser=argparse.ArgumentParser()    
In [423]: g=parser.add_mutually_exclusive_group()
In [424]: g.add_argument('--foo')
In [426]: g.add_argument('bar',nargs='*',default='test')

In [427]: parser.print_help()
usage: ipython2.7 [-h] [--foo FOO | bar [bar ...]]

positional arguments:
  bar

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO

In [429]: parser.parse_args([])
Out[429]: Namespace(bar='test', foo=None)

In [430]: parser.parse_args(['one','two'])
Out[430]: Namespace(bar=['one', 'two'], foo=None)

In [431]: parser.parse_args(['--foo','two'])
Out[431]: Namespace(bar='test', foo='two')

使用此功能,您可以指定两个(实际上是任意数量)未标记的值,或一个标记为--foo的值。如果我尝试两者,它会反对。我本可以将该组标记为required

几点说明:

--foo标记为nargs='?'相对毫无意义,除非我同时指定defaultconst

我只能在专属组中指定一个位置,并且该参数必须具有'?'或者' *',以及'默认'。换句话说,它必须是真正可选的。

如果没有mutual_exclusive_group,我可以同时定位?,但我无法说出零或两个参数'。