![](/img/trans.png)
[英]How to set optional arguments to positional arguments in Python's Argparse?
[英]How to set different options based on combination of positional arguments in Python with argparse?
我正在尝试学习如何使用 argparse。 我正在编写一个带有两个位置 arguments 的程序,比如说ARG1
和ARG2
,我想根据这两个位置 arguments 的组合添加一些选项。
界面如下所示:
D
C
B B
A A
^ ^
| |
app.py <ARG1> <ARG2> --opt1 --opt2 --opt3 --opt4
第一个位置参数ARG1
将有 4 个不同的选项,第二个位置参数ARG2
将有两个不同的选项。 基于这两个位置 arguments 的组合,我想指定不同的选项。
例如,当用户输入app.py AB
时,我只需要--opt1 --opt2
。 某些组合可能根本不使用某些选项。
我认为subparsers
是通往 go 的方法,但我没有设法让它工作。
我怎样才能做到这一点?
由于argparse
旨在以任何顺序处理optionals
,因此强制交互很尴尬。 子解析器提供一些控制,但只能有一个(除非您定义子解析器的子解析器)。
我认为最简单的方法是使用choices
定义 2 个位置,以及所有选项,并在解析后进行任何“必需”检查:
In [20]: parser = argparse.ArgumentParser()
In [21]: parser.add_argument('arg1', choices=['A','B','C','D']);
In [22]: parser.add_argument('arg2', choices=['A','B']);
In [23]: parser.add_argument('--opt1');
In [24]: parser.add_argument('--opt2');
In [26]: args = parser.parse_args('--opt2 foo C A'.split())
In [27]: print(args)
Namespace(arg1='C', arg2='A', opt1=None, opt2='foo')
一个可能的测试:
In [29]: if args.arg1=='C' and args.arg2=='A' and args.opt1 is None:
...: parser.error('--opt1 is required with C and A')
...:
usage: ipython3 [-h] [--opt1 OPT1] [--opt2 OPT2] {A,B,C,D} {A,B}
ipython3: error: --opt1 is required with C and A
请记住,在使用和帮助中很难描述条件交互。 要求optional
的替代方法是给它一个合理的默认值。 这样,用户是否给出值都无关紧要。 但是在上面的测试中,我依赖于默认的default
None
。
用法首先显示optionals
,并且在命令行中optionals
可以按顺序出现,相对于它们自身和positionals
。
不确定我是否完全理解您的要求,但看看这个例子是否对您有帮助:
from argparse import ArgumentParser
parser = ArgumentParser()
subparsers = parser.add_subparsers(help="sub-commands")
a_parser = subparsers.add_parser("ARG1")
a_parser.add_argument("-1", "--opt1", action="store_true", required=False)
a_parser.add_argument("-2", "--opt2", action="store_true", required=False)
a_parser.add_argument("-3", "--opt3", action="store_true", required=False)
a_parser.add_argument("-4", "--opt4", action="store_true", required=False)
subparsers2 = a_parser.add_subparsers(help="ARG1-ARG2 sub-commands")
ab_parser = subparsers2.add_parser("ARG2")
ab_parser.add_argument("-1", "--opt1", action="store_true", required=False)
ab_parser.add_argument("-2", "--opt2", action="store_true", required=False)
b_parser = subparsers.add_parser("ARG2")
b_parser.add_argument("-3", "--opt3", action="store_true", required=False)
b_parser.add_argument("-4", "--opt4", action="store_true", required=False)
argument = parser.parse_args()
Output:
± % python recovery_tools/test.py ARG1 --help usage: test.py ARG1 [-h] [-1] [-2] [-3] [-4] {ARG2}... positional arguments: {ARG2} ARG1-ARG2 sub-commands optional arguments: -h, --help show this help message and exit -1, --opt1 -2, --opt2 -3, --opt3 -4, --opt4
± % python recovery_tools/test.py ARG1 ARG2 --help usage: test.py ARG1 ARG2 [-h] [-1] [-2] optional arguments: -h, --help show this help message and exit -1, --opt1 -2, --opt2
± % python recovery_tools/test.py ARG2 --help usage: test.py ARG2 [-h] [-3] [-4] optional arguments: -h, --help show this help message and exit -3, --opt3 -4, --opt4 (new-recovery-tools-env)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.