Python 3.x Python3 argparse:仅当未提供可选参数时才需要条件参数?
[Python 3/argparse] 假设我的应用程序需要一个位置参数:Python 3.x Python3 argparse:仅当未提供可选参数时才需要条件参数?,python-3.x,argparse,Python 3.x,Argparse,[Python 3/argparse] 假设我的应用程序需要一个位置参数: myApp.py[所需的功能] 但是,如果用户提供某个可选功能,则不需要所需的功能 myApp.py——列出函数 在本例中,如果传递了--list functions,我希望应用程序继续运行,将我设置的所需的\u function变量保留为空,因为我的代码将看到用户传递了--list functions,并相应地执行操作 但是,如果用户没有提供--list functions选项,则参数解析器应该产生错误,因为用户没有提
myApp.py[所需的功能]
但是,如果用户提供某个可选功能,则不需要所需的功能
myApp.py——列出函数
在本例中,如果传递了--list functions
,我希望应用程序继续运行,将我设置的所需的\u function
变量保留为空,因为我的代码将看到用户传递了--list functions
,并相应地执行操作
但是,如果用户没有提供--list functions
选项,则参数解析器应该产生错误,因为用户没有提供所需的位置参数
如果用户未提供可选功能,我如何让argparse仅设置所需的功能
位置
到目前为止,我掌握的代码是:
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函数将失败,原因如下:
usage: myApp.py [-h] [--list-functions] desired_function
myApp.py: error: the following arguments are required: desired_function
下面是一个简单的解析器,它使位置参数成为可选的(nargs=?)
不要给位置参数指定dest
参数;它已经在第一个字符串中得到了一个store\u true
操作不需要默认值;它会自动获取False
通过此设置,您可以检查args.list
;它True
,然后忽略args.func
值。如果False
,请使用args.func
。如果您给了func
一个有意义的默认值,那么无论用户是否给您一个值,If都不重要。换句话说,它确实不是必需的。(如果需要,定义默认值是没有意义的)。或者你可以反对,如果他们给你两个:
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 ...
我们可以进一步将这两个参数放入一个互斥组
,并使该组成为必需的
。这样的组接受这样一个可选的位置。我认为文档已经足够清楚了,但是如果需要,我可以扩展我的答案。让--列表函数
简单地生成帮助
输出是否有意义,因此--列表函数
使用操作class='help'
,相当于-h
,然后将函数列表合并到帮助
输出中?或者,为所需的_函数提供选项
,并让argparse
显示它们?这是否仍然只允许一个位置参数?i、 e.如果我出于某种原因想在它后面添加另一个参数,那么nargs=“?”
会干扰吗?假设示例:myApp.py processsomething来自文件theFileToProcess.dat
,其中文件名是第二个位置参数。而且,即使我没有这样做,传递多个位置参数仍然是一个错误…?尝试不同的组合。这比冗长的解释更容易理解。你可以有多个位置。但是,如果分配参数的方法不止一种,那么使多个“可选”(?++*)成为一个棘手的问题。互斥分组只允许一个位置。
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 ...