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

2024-05-01 21:53:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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=>;不正常


Tags: pygt程序addfalsetruedefaultparser
2条回答

我建议您重构参数,并将-o和-I组合成一个强制参数。 然后使用add_argumentchoices参数将o和i(或任何合适的)定义为允许的值。在

例如:

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

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

一个mutually_exclusive_group将为您提供所需的操作,但不能同时提供这两个操作。在

但首先,您不希望type=boolbool是一个函数,它将其输入转换为TrueFalse,但不将字符串'False'转换为booleanFalse。我建议改用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或{},或者两者都不使用,则会引发错误。如果使用其中一个或另一个,它会将适当的属性设置为True。注意,usage行用(-i | -o)表示这个“exclusive or”逻辑。在

相关问题 更多 >