ArgumentParser:可选参数,带有可选值

时间:2015-08-04 17:29:37

标签: python argparse

如果我有一个带可选参数值的可选参数,有没有办法验证在没有给出值时是否设置了参数?

例如:

parser = argparse.ArgumentParser()
parser.add_argument('--abc', nargs='?')
args = parser.parse_args()

会正确地给我:

optional arguments:
    --abc [ABC]

如何区分下面的1和2?

  1. ''=> args.abc是无
  2. ' - abc'=> args.abc仍为无
  3. ' - abc something'=> args.abc是
  4. ...

    更新

    找到解决此问题的技巧:你可以使用“nargs ='*'”代替“nargs ='?'”。这种方式#1将返回None,而#2将返回空列表。缺点是这将允许接受参数的多个值;因此,如果合适,您需要为其添加一个检查。

    或者,您也可以为参数设置默认值;看看chepner和Anand S Kumar的回答。

3 个答案:

答案 0 :(得分:3)

为选项使用不同的默认值。比较

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--abc', nargs='?', default="default")
>>> parser.parse_args()
Namespace(abc='default')
>>> parser.parse_args(['--abc'])
Namespace(abc=None)
>>> parser.parse_args(['--abc', 'value'])
Namespace(abc='value')

我不确定如何在没有参数的情况下使用--abc时提供不同的值,而不是使用自定义操作而不是nargs参数。

答案 1 :(得分:3)

使用nargs='?',您可以同时提供defaultconst

In [791]: parser=argparse.ArgumentParser()    
In [792]: parser.add_argument('--abc', nargs='?', default='default', const='const')

如果未给出参数,则使用默认值:

In [793]: parser.parse_args([])
Out[793]: Namespace(abc='default')

如果给定但没有参数字符串,则使用const:

In [794]: parser.parse_args(['--abc'])
Out[794]: Namespace(abc='const')

否则它使用参数字符串:

In [795]: parser.parse_args(['--abc','test'])
Out[795]: Namespace(abc='test')

In [796]: parser.print_help()
usage: ipython3 [-h] [--abc [ABC]]

optional arguments:
  -h, --help   show this help message and exit
  --abc [ABC]

答案 2 :(得分:2)

不确定这是否是标准方式,但您可以将default参数设置为某个值,然后在--abc不在参数列表中的情况下使用该值。

示例代码 -

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--abc', nargs='?', default="-1")
args = parser.parse_args()
print(args)

结果 -

>python a.py
Namespace(abc='-1')

>python a.py --abc
Namespace(abc=None)

>python a.py --abc something
Namespace(abc='something')