我一直在检查,但找不到此功能。
这是我正在编写的脚本的帮助功能的摘录,例如:
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
脚本,它已经有一个值。因此,这将是另一个要面对的问题。
答案 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
自变量。