如何根据其他位置自变量来使位置自变量为必需/不允许?

问题描述 投票:0回答:1

我想要表格上的程序:

program {a|b|c <foo>} [--config <file>]

必须提供a,b和c中的一个,如果使用c,则必须提供foo参数,否则不可以。

所以这些应该被接受的呼叫:

program a
program c hello
program a --config file.conf
program b --config file.conf
program --config file.conf b
program c haha --config file.conf

但是我想禁止这些]

program a haha
program b haha --config file.conf

最好,我也想禁止这个,但这不是很重要

program c --config file.conf hello

即,不允许将config参数放在两者之间。

这是我当前的代码:

import argparse
parser=argparse.ArgumentParser(description='My prog')
parser.add_argument('command', type=str, choices=['a', 'b', 'c'])
parser.add_argument('foo', type=str)
parser.add_argument('--config', type=str)

此“工作方式”很好,但是如果foo,我希望command='c'参数是必需的,否则则不允许,并且我找不到解决方法。现在,我需要为foo提供一些虚拟参数。

我想要一个程序,形式为:程序{a | b | c } [--config ]必须提供a,b和c中的一个,如果使用c,则必须使用foo参数。并且不允许...

python python-3.x argparse
1个回答
1
投票

使abc子命令而不是普通的位置参数。在这里,不是将--config显式添加到每个子解析器中,而是使用parents关键字参数在一个单独的解析器中为要继承的每个子解析器定义了它。

import argparse

parser=argparse.ArgumentParser(description='My prog')
subparsers = parser.add_subparsers(dest='command')
config_parser = argparse.ArgumentParser(add_help=False)
config_parser.add_argument('--config')

ap = subparsers.add_parser('a', parents=[config_parser])
bp = subparsers.add_parser('b', parents=[config_parser])
cp = subparsers.add_parser('c', parents=[config_parser])
cp.add_argument("foo")

print(parser.parse_args())
© www.soinside.com 2019 - 2024. All rights reserved.