Python argparse,有两个可选参数,至少有一个是必需的

时间:2014-09-26 14:04:00

标签: python argparse

我在我的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 =>不行

2 个答案:

答案 0 :(得分:6)

我建议你重构参数并将-o和-i组合成一个强制参数。 然后使用add_argument的{​​{3}}参数将o和i(或任何适当的)定义为允许值。

E.g:

   parser.add_argument('foo', choices=['i', 'o'])

现在用户必须指定其中一个,但不能同时指定两者。

答案 1 :(得分:2)

mutually_exclusive_group将为您提供所需的操作,但不是两种操作。

但首先,你不想要type=boolbool是一个将其输入转换为TrueFalse的函数,但不转换字符串' 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)的逻辑。