当前位置: 首页 > 面试题库 >

argparse(python)是否支持互斥的参数组?

步弘和
2023-03-14
问题内容

如果我有参数'-a', '-b', '-c', '-d',那么add_mutually_exclusive_group()我的程序只需使用函数中的一个即可。有没有一种方法可以组合起来,以便程序仅接受'-a 999 -b 999''-c 999 -d 999'

编辑: 添加一个简单的程序以更清楚:

>>> parser = argparse.ArgumentParser()
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('-a')
>>> group.add_argument('-b')
>>> group.add_argument('-c')
>>> group.add_argument('-d')

然后只能./app.py -a | ./app.py -b | ./app.py -c | ./app.py -d被调用。是否可以将argparse组排除在组之外,以便仅./app.py -a .. -b .. | ./app.py -c .. -d ..被调用?


问题答案:

编辑
:没关系。因为argparse调用时必须创建一个选项,这是一个可怕的选择group.add_argument。那不是我的设计选择。如果您迫切需要此功能,可以尝试使用ConflictsOptionParser来实现:

# exclusivegroups.py
import conflictsparse

parser = conflictsparse.ConflictsOptionParser()
a_opt = parser.add_option('-a')
b_opt = parser.add_option('-b')
c_opt = parser.add_option('-c')
d_opt = parser.add_option('-d')

import itertools
compatible_opts1 = (a_opt, b_opt)
compatible_opts2 = (c_opt, d_opt)
exclusives = itertools.product(compatible_opts1, compatible_opts2)
for exclusive_grp in exclusives:
    parser.register_conflict(exclusive_grp)


opts, args = parser.parse_args()
print "opts: ", opts
print "args: ", args

因此,当我们调用它时,我们可以看到我们获得了预期的效果。

$ python exclusivegroups.py -a 1 -b 2
opts:  {'a': '1', 'c': None, 'b': '2', 'd': None}
args:  []
$ python exclusivegroups.py -c 3 -d 2
opts:  {'a': None, 'c': '3', 'b': None, 'd': '2'}
args:  []
$ python exclusivegroups.py -a 1 -b 2 -c 3
Usage: exclusivegroups.py [options]

exclusivegroups.py: error: -b, -c are incompatible options.

警告消息不会告知您两者,'-a'并且与'-b'不兼容'-c',但是可以制作更合适的错误消息。以下是较旧的错误答案。

较旧的编辑:
_[此编辑是错误的,尽管如果以argparse这种方式进行工作,这不是一个完美的世界吗?]_我以前的回答实际上是不正确的,您应该可以通过为argparse每个互斥选项指定一个组来做到这一点。我们甚至可以itertools用来概括该过程。并确保我们不必显式地键入所有组合:

import itertools
compatible_opts1 = ('-a', '-b')
compatible_opts2 = ('-c', '-d')
exclusives = itertools.product(compatible_opts1, compatible_opts2)
for exclusive_grp in exclusives:
    group = parser.add_mutually_exclusive_group()
    group.add_argument(exclusive_grp[0])
    group.add_argument(exclusive_grp[1])


 类似资料:
  • 问题内容: 我需要的是: 我尝试了这个,但是没有用。有人可以帮我吗? 谢谢! 问题答案: 不会使整个组互斥。它使组内的选项互斥。 您正在寻找的是子命令。而不是编[-a xxxx | [-b yyy -c zzz]],您将拥有: 要使用第一组参数进行调用: 要使用第二组参数进行调用: 您还可以将子命令参数设置为位置。 有点像git或svn: 工作范例 测试一下 祝好运。

  • 问题内容: Python2.7 argparse仅在互斥组中接受可选参数(前缀): $ mydaemon -h 有没有一种方法可以使argparse参数的行为类似于传统的unix守护程序控件: 问题答案: 对于其中的所有功能和选项,我认为您永远不会获得看起来像您想要的“罐头”用法字符串。 也就是说,自您的原始帖子起,您是否查看过子解析器? 这是一个准系统的实现: 使用选项运行此命令将产生: 这种方

  • 问题内容: 我遇到了一些具有以下结构的Java代码: 我知道在C ++中,我可以为参数分配一个默认值。例如: Java是否支持这种语法?有什么理由使两步语法更可取? 问题答案: 我遇到了一些具有以下结构的Java代码: 我知道在C ++中,我可以为参数分配一个默认值。例如: Java是否支持这种语法?有什么理由使两步语法更可取?

  • 问题内容: Python是否支持短路? 问题答案: 是的操作员都短路了-请参阅docs。

  • 问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为

  • 根据 Java 教程,Double Wrapper 类支持 String 和 Double 作为参数。 但是我可以使用浮点参数。检查下面的代码。有人能澄清一下吗? 类测试 { } 10.5 10.5