如果我有参数'-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