如何使用Python中的argparse使至少一个参数为必需并接受所有参数?
这个程序有两个参数需要处理:状态和键。
我需要能够输入以下选项:
- prog -state state_value
- prog -key key_value
- prog -state state_value -key key_value
最接近的做法是使用互斥组,但这样就不能同时输入这两个参数了。
3 个回答
0
在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成一种特定的格式。
比如说,如果你有一个数字字符串“123”,但程序需要的是数字类型的123,那么你就需要把这个字符串转换成数字。这种转换的过程在编程中是非常常见的。
另外,有些时候我们会遇到一些复杂的数据结构,比如列表、字典等。这些结构可以帮助我们更好地组织和管理数据。理解这些数据结构的使用方法,可以让我们的程序更加高效和易于维护。
总之,处理数据和转换数据格式是编程中非常重要的部分,掌握这些基本概念会让你在编程的路上走得更顺利。
#!/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
1
正如在这个链接中提到的,当前没有内置的机制来测试这个,但在解析之后很容易就能做这样的测试。假设参数的默认值是None
,那么可以这样进行测试:
if args.state is None and args.key is None:
parser.error('At least one of the arguments is required ')
将来argparse
可能会有这样的机制。现在有一个关于增强组内测试能力的bug请求,链接在这里: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
和错误信息都可以自定义。
0
我觉得这超出了argparse的能力范围。不过,你可以在返回的命名空间之后进行简单的验证。你应该在帮助信息中说明,至少需要提供state或key中的一个。
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)