我要尝试的第一件事是使用parse_known_args 处理其他参数,并使用我的例程处理extras 的列表。将“--conf-”处理添加到argparse 会更有效。
argv = '--conf-key-1 value1 --conf-key-2 value2'.split()
p = argparse.ArgumentParser()
args, extras = p.parse_known_args(argv)
def foo(astr):
if astr.startswith('--conf-'):
astr = astr[7:]
astr = astr.replace('-','_')
return astr
d = {foo(k):v for k,v in zip(extras[::2],extras[1::2])}
# {'key_1': 'value1', 'key_2': 'value2'}
extras 解析可能更健壮 - 确保有正确的对,拒绝格式错误的密钥,处理 =。
另一种方法是扫描sys.argv 中的--conf- 字符串,并使用这些字符串构造add_argument 语句。
keys = [k for k in argv if k.startswith('--conf-')]
p = argparse.ArgumentParser()
for k in keys:
p.add_argument(k, dest=foo(k))
print vars(p.parse_args(argv))
如果您接受 '--conf key1 value1 --conf key2 value2 ...' 作为输入,您可以定义
parser.add_argument('--conf', nargs=2, action='append')
会产生:
namespace('conf': [['key1','value1'],['key2','value2']])
这很容易变成字典。或者自定义的Action 可以使用setattr(namespace, values[0], values[1]) 将键/值对直接输入到命名空间中。
我相信关于接受 '"key1:value" "key2:value2"' 输入存在一些问题。