Python 3.x Python3 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选项,则参数解析器应该产生错误,因为用户没有提

[Python 3/argparse]

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

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 ...