如果选择了一个选项,Argparse 禁用其他选项的官方方法

Argparse official way for disabling other option if one option is selected

如果-r是,我打算给出彼此不相关的不同行为 给予或不给予。所以,如果 -r 参数存在,它将只需要两个 二。如果不是,它将吃掉所有给定的参数。使用此设置:

parser = ArgumentParser(prog='frog')
parser.add_argument('integer',
                    metavar='integer(s)',
                    type=int,
                    nargs='*')
parser.add_argument('-r', '--range',
                    metavar=('start', 'end'),
                    type=int,
                    nargs=2)

如果我打电话:

frog -r 123 1231 121
# this will give Namespace(integer=[123], range=[1231, 121])

如果我将 integernargs 更改为 *,然后调用:

frog -r 123 1231
# complaints about 'integer' that is required

当然,创建简单的参数检查并不会太复杂。但是,我的问题是,如果另一个选项被激活,argparse 是否有官方方法来禁用一个选项?

if I change nargs for integer to *, and then call: - 我想你的意思是 change nargs for integer to +。在您的示例中,它已经是 *.

对于“+”,integer 期望找到至少一个参数。如果-r没有遗漏任何东西,那么它就会抱怨。

argparse 的基本理念是独立处理每个参数。它还试图独立于顺序,因此 frog 123 -r 1231 32frog -r 1231 32 123.

一样有效

可以强制使用自定义 Action 类 参数之间的交互,但这往往会破坏顺序独立性。

通常最好写参数接受最一般的情况,然后自己检查。因此,我会坚持使用 *,如果 args.integer 是错误的值数,我会反对。

argparse 的主要目的是弄清楚用户想要什么 - 它是一个解析器。事后你随时可以骂他们。