在互斥组中使用argparse区分调用唯一参数和提供字符串的区别

时间:2018-07-13 09:49:41

标签: python-3.x argparse

我一直在检查,但找不到此功能。

这是我正在编写的脚本的帮助功能的摘录,例如:

usage: my_parser.py [-h] (-s SERIAL_NUMBER | -e EVENT)

例如,我希望我的脚本接受:

$ my_parser.py -s
$ my_parser.py -s 1234
$ my_parser.py -e
$ my_parser.py -e 9876

逻辑是,如果没有参数传递给-s-e,则软件必须返回所有条目。如果传递了参数,例如-s 1234-e 9876,则仅必须返回具有该ID的条目。

部分代码如下:

parser = ArgumentParser()
group_input = parser.add_mutually_exclusive_group(required=True)
group_input.add_argument("-s","--serial-number", default=1) # also, default=None
group_input.add_argument("-e","--event", default=1) # also, default=None

但是,当我运行它时,如果未提供任何参数,则软件会出错并退出。例如:$ my_parser.py -s

我还尝试在action='store_true'函数中添加类似add_argument的方法,但没有成功。为什么?我以为它不希望有任何传入的参数。

无论如何,即使我们可以使其工作,如何区分它? 例如,如果我可以让软件继续运行,那么可以想象一下,我将介绍以下内容:

$ my_parser.py -s 1234

如果我们解析它并将其保存到变量a,则a.serial_number为1234,而a.event为1。我什至没有在其中提到-e脚本,它已经有一个值。因此,这将是另一个要面对的问题。

1 个答案:

答案 0 :(得分:0)

我认为您只需要添加`nargs ='?争论。这允许进行三向输入-默认值,常量和用户值。

您在互斥组中使用它们的事实无关紧要。

In [3]: parser = argparse.ArgumentParser()
   ...: group_input = parser.add_mutually_exclusive_group(required=True)
   ...: group_input.add_argument("-s","--serial-number", default=1,nargs='?',const=2,type=int); 
   ...: group_input.add_argument("-e","--event", default=1,nargs='?',const=3,type=int);
   ...: 
   ...: 
In [4]: parser.parse_args('-s'.split())
Out[4]: Namespace(event=1, serial_number=2)

In [5]: parser.parse_args('-s 1234'.split())
Out[5]: Namespace(event=1, serial_number=1234)

In [6]: parser.parse_args('-e'.split())
Out[6]: Namespace(event=3, serial_number=1)

In [7]: parser.parse_args('-e 1232'.split())
Out[7]: Namespace(event=1232, serial_number=1)

In [8]: parser.parse_args('-e 1232 -s'.split())
usage: ipython3 [-h] (-s [SERIAL_NUMBER] | -e [EVENT])
ipython3: error: argument -s/--serial-number: not allowed with argument -e/--event
....

由于该组为required,因此您必须提供-s-e之一

In [9]: parser.parse_args(''.split())
usage: ipython3 [-h] (-s [SERIAL_NUMBER] | -e [EVENT])
ipython3: error: one of the arguments -s/--serial-number -e/--event is required
....

也可以使用store_true自变量。