该程序有两个要处理的参数:state和key。 我需要有可能提供以下选项作为输入:
最接近的是使用相互排除的群体,但它无法给予 这两个论点都是一次输入的。
答案 0 :(得分:1)
正如https://stackoverflow.com/a/24911007/901925中所述,没有内置的机制来测试它,但解析后很容易进行这样的测试。假设参数的默认default
为None
,那么这样的测试可能是:
if args.state is None and args.key is None:
parser.error('At least one of the arguments is required ')
最终argparse
可能有这样的机制。群组中有更多测试权力的错误请求http://bugs.python.org/issue11588
一个想法是添加UsageGroups,以互斥组为模型,但具有更通用的逻辑。该代码无法下载,但我有兴趣了解此示例是否清晰。
parser = argparse.ArgumentParser(prog='prog')
group = parser.add_usage_group(kind='any', required=True)
group.add_argument('-s', '--state', metavar='state_value')
group.add_argument('-k', '--key', metavar='key_value')
args = parser.parse_args()
print(args)
带有错误消息:
usage: prog [-h] (-s state_value | -k key_value)
prog: error: group any(): some of the arguments [state, key] is required
使用行中的替代方法是(-s state_value, -k key_value)
,因为|
已用于互斥xor
关系。可以自定义usage
和错误消息。
答案 1 :(得分:0)
#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
paras = sys.argv.pop(0)
state_value = None
key_value = None
i=0
while i < len(paras):
if paras[i] == '-state':
state_value = paras[i]
elif paras[i] == '-key':
key_value = paras[i]
i += 2
if state_value:
# do something
pass
if key_value:
# do something
pass
答案 2 :(得分:0)
我认为这超出了argparse的能力。您可以在之后对返回的命名空间执行简单验证。您应该在您的帮助中包含至少一次状态或密钥。
def validate(namespace, parser):
if not any(arg in {"state", "key"} for arg in vars(namespace).keys()):
parser.print_help()
parser.exit(2)
namespace = parser.parse_args()
validate(namespace, parser)