Python 3 argparse:只有在未提供可选参数的情况下才需要条件参数?

时间:2016-03-16 20:07:24

标签: python-3.x argparse

[Python 3 / argparse]

假设我的应用需要一个位置参数:

myApp.py [desired_function]

但是,如果用户提供某个可选项,则不需要desired_function

myApp.py --list-functions

在这种情况下,如果传递--list-functions,我希望应用程序继续,将我设置的变量desired_function保留为空,因为我的代码将看到用户通过{{1并相应地采取行动。

但是,如果用户提供--list-functions选项,则参数解析器应该产生错误,因为用户没有提供必需的位置参数。

如果用户未提供可选项,我如何让argparse使--list-functions位置仅

我到目前为止的代码:

desired_function

在此状态下,调用parser = argparse.ArgumentParser(description="test app") parser.add_argument("desired_function", help="The function desired", action="store", default="", dest="func") parser.add_argument("--list-functions",help="List the available functions", action="store_true", default=False, dest="list_mode") 将失败并显示:

myApp.py --list-functions

1 个答案:

答案 0 :(得分:0)

这是一个简单的解析器,使位置参数可选(nargs =?)。

In [171]: parser=argparse.ArgumentParser()
In [172]: parser.add_argument('func', nargs='?',default='foo')
In [173]: parser.add_argument('--list',action='store_true')
In [174]: args=parser.parse_args(['--list'])
In [175]: args
Out[175]: Namespace(func='foo', list=True)
In [176]: args=parser.parse_args(['bar'])
In [177]: args
Out[177]: Namespace(func='bar', list=False)
In [178]: parser.parse_args(['--list','bar'])
Out[178]: Namespace(func='bar', list=True)
In [179]: parser.parse_args([])
Out[179]: Namespace(func='foo', list=False)

不要给位置参数dest参数;它已经在第一个字符串中获得一个。 store_true操作不需要默认值;它会自动获得False

通过此设置,您可以检查args.list;它True,然后忽略args.func值。如果False,请使用args.func。如果您给func一个有意义的默认值,那么用户是否给您一个值并不重要。换句话说,它确实不是必需的。 (如果需要,定义默认值没有意义)。或者你可以反对,如果他们给你们两个:

In [184]: args=parser.parse_args(['--list','bar'])
In [185]: if args.list and args.func!='foo':
       parser.error('you stupid user ...')
   .....:     
usage: ipython3 [-h] [--list] [func]
ipython3: error: you stupid user ...

我们可以进一步将这两个参数放在mutually_exclusive_group中,并使该组required。这样的组接受这样的一个可选位置。我认为文档很清楚,但如果需要,我可以扩展我的答案。