如何使至少一个参数成为必需,并有可能在Python中使用argparse的所有参数?

时间:2014-07-23 09:15:10

标签: python argparse

该程序有两个要处理的参数:state和key。 我需要有可能提供以下选项作为输入:

  • prog -state state_value
  • prog -key key_value
  • prog -state state_value -key key_value

最接近的是使用相互排除的群体,但它无法给予 这两个论点都是一次输入的。

3 个答案:

答案 0 :(得分:1)

正如https://stackoverflow.com/a/24911007/901925中所述,没有内置的机制来测试它,但解析后很容易进行这样的测试。假设参数的默认defaultNone,那么这样的测试可能是:

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)