如何根据 Python 中的位置参数与 argparse 的组合设置不同的选项?

如何解决如何根据 Python 中的位置参数与 argparse 的组合设置不同的选项?

我正在尝试学习如何使用 argparse。我正在编写一个带有两个位置参数的程序,比如 ARG1ARG2,我想根据这两个位置参数的组合添加一些选项。

界面如下所示:

          D
          C
          B     B
          A     A
          ^     ^
          |     |
app.py <ARG1> <ARG2> --opt1 --opt2 --opt3 --opt4

一个位置参数 ARG1 将有 4 个不同的选项,第二个位置参数 ARG2 将有两个不同的选项。 基于这两个位置参数的组合,我想指定不同的选项。

例如,当用户输入 app.py A B 时,我只需要 --opt1 --opt2。某些组合可能根本不使用某些选项。

我认为 subparsers 是要走的路,但我没能让它发挥作用。

我该怎么做?

解决方法

由于 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','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",required=False)
a_parser.add_argument("-3","--opt3",required=False)
a_parser.add_argument("-4","--opt4",required=False)

subparsers2 = a_parser.add_subparsers(help="ARG1-ARG2 sub-commands")

ab_parser = subparsers2.add_parser("ARG2")

ab_parser.add_argument("-1",required=False)
ab_parser.add_argument("-2",required=False)

b_parser = subparsers.add_parser("ARG2")

b_parser.add_argument("-3",required=False)
b_parser.add_argument("-4",required=False)

argument = parser.parse_args()

输出:

± % 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,--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,--opt4
(new-recovery-tools-env)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?