我在我的python程序中遇到问题,我有两个可选参数,问题是必须至少有一个这两个参数必须使用,但这两个参数不能一起传递,有没有办法用argparse做到这一点?
以下是我目前正在使用的代码:
parser = argparse.ArgumentParser(description='worker')
arser.add_argument('-i', "--item", type=bool, default=False, required=False)
parser.add_argument('-o', "--offer", type=bool, default=False, required=False)
以下是我希望如何工作的一些示例:
./main.py -i True
=>确定
./main.py -o True
=>确定
./main.py -o True -i True
=>不行
答案 0 :(得分:6)
我建议你重构参数并将-o和-i组合成一个强制参数。
然后使用add_argument
的{{3}}参数将o和i(或任何适当的)定义为允许值。
E.g:
parser.add_argument('foo', choices=['i', 'o'])
现在用户必须指定其中一个,但不能同时指定两者。
答案 1 :(得分:2)
mutually_exclusive_group
将为您提供所需的操作,但不是两种操作。
但首先,你不想要type=bool
。 bool
是一个将其输入转换为True
或False
的函数,但不转换字符串' False'到布尔False
。我建议改为使用action='store_true'
。
In [1]: import argparse
In [2]: parser=argparse.ArgumentParser()
In [3]: g = parser.add_mutually_exclusive_group(required=True)
In [4]: g.add_argument('-i', '--item', action='store_true')
In [5]: g.add_argument('-o', '--offer', action='store_true')
In [6]: parser.parse_args('-i'.split())
Out[6]: Namespace(item=True, offer=False)
In [7]: parser.parse_args('-o'.split())
Out[7]: Namespace(item=False, offer=True)
In [8]: parser.parse_args('-o -i'.split())
usage: ipython [-h] (-i | -o)
ipython: error: argument -i/--item: not allowed with argument -o/--offer
In [11]: parser.parse_args(''.split())
usage: ipython [-h] (-i | -o)
ipython: error: one of the arguments -i/--item -o/--offer is required
它引发的错误是-i
或-o
都没有使用,或两者兼而有之。如果使用了一个或另一个,它会将适当的属性设置为True
。请注意,使用行表示此排除或' (-i | -o)
的逻辑。