Python argparse互斥组
我需要的是:Python argparse互斥组,python,argparse,Python,Argparse,我需要的是: pro [-a xxx | [-b yyy -c zzz]] 我试过了,但没用。有人能帮我吗 group= parser.add_argument_group('Model 2') group_ex = group.add_mutually_exclusive_group() group_ex.add_argument("-a", type=str, action = "store", default = "", help="test") group_ex_2 = group_e
pro [-a xxx | [-b yyy -c zzz]]
我试过了,但没用。有人能帮我吗
group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")
谢谢
添加互斥组
不会使整个组互斥。它使组内的选项相互排斥
你要找的是。代替prog[-a xxxx |[-b yyy-c zzz]],您将有:
prog
command 1
-a: ...
command 2
-b: ...
-c: ...
要使用第一组参数调用,请执行以下操作:
prog command_1 -a xxxx
prog command_2 -b yyyy -c zzzz
要使用第二组参数调用:
prog command_1 -a xxxx
prog command_2 -b yyyy -c zzzz
还可以将子命令参数设置为位置参数
prog command_1 xxxx
有点像git或svn:
git commit -am
git merge develop
工作示例
测试一下
祝你好运。有一个python补丁(正在开发中)可以让你做到这一点。其想法是允许相互排斥的组重叠。因此,
用法
可能看起来像:
pro [-a xxx | -b yyy] [-a xxx | -c zzz]
更改argparse代码以便可以像这样创建两个组是最简单的部分。更改用法
格式化代码需要编写自定义帮助格式化程序
在argparse
中,操作组不会影响解析。它们只是一个帮助
格式化工具。在帮助
中,相互排斥的组仅影响用法
行。解析时,解析器
使用相互排斥的组来构造潜在冲突的字典(a
不能与b
或c
,b
不能与a
等一起出现),然后如果出现冲突,就会引发错误
如果没有argparse补丁,我认为最好的选择是测试parse_args
自己生成的名称空间(例如,如果a
和b
都有非默认值),并提出自己的错误。您甚至可以使用解析器自己的错误机制
parser.error('custom error message')
虽然对于复杂的选项来说非常好,但是有一个非常简单的解决方案可以用于简单的情况,例如,1个选项排除了2个其他选项,如
command [- a xxx | [ -b yyy | -c zzz ]]
甚至像原来的问题一样:
pro [-a xxx | [-b yyy -c zzz]]
我会这样做:
parser = argparse.ArgumentParser()
# group 1
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)
# group 2
parser.add_argument("-a", "--aggregation", help="aggregation",
required=False)
我在这里使用提供给命令行包装器的选项来查询mongodb。collection
实例可以调用方法aggregate
或方法find
,使用可选参数query
和字段
,因此您可以看到前两个参数兼容而后一个不兼容的原因
现在我运行parser.parse_args()
并检查它的内容:
args = parser().parse_args()
print args.aggregation
if args.aggregation and (args.query or args.fields):
print "-a and -q|-f are mutually exclusive ..."
sys.exit(2)
当然,这个小技巧只适用于简单的情况,如果你有许多相互排斥的选项和组,那么检查所有可能的选项将成为一场噩梦。在这种情况下,您应该像Jonathan建议的那样将您的选项插入命令组。可能重复插入,但我想提及我的库。让你做这个问题想要做的事情,例如,不需要你使用子命令(如在接受的答案中)或自己验证一切(如在第二高投票率的回答中)。我已经把它们放在一个参数组下。在这种情况下,如何添加子命令?谢谢用示例代码更新。你不会使用分组,而是子分组。但是你会怎么做OP最初要求的事情呢?我目前有一组子命令,但其中一个子命令确实需要能够在
[-a].[-b-c]]
之间进行选择。这并不能回答问题,因为它不允许您发出“noname”命令并实现OP要求的[-a xxx |[-b yyy-c zzz]]
Python问题:正在探索让您编写自定义独占/包含测试的方法。对于这种情况,我不会将其称为“黑客”,因为它看起来更具可读性和可管理性-感谢您指出!更好的方法是使用parser.error(“-a和-q…”)
。通过这种方式,将自动打印完整的使用帮助。请注意,在这种情况下,您还需要验证以下情况:(1)在第一组is用户中,q
和f
都是必需的,(2)这两个组中的任何一个都是必需的。这使得“简单”解决方案不再那么简单。所以我同意这是对手工脚本的更多攻击,但不是真正的解决方案