这听起来像是一个变化 - 我如何接受任意'key = value'对?多年来一直以各种不同的方式提出了各种答案。
在最近一个:
Parsing "python foo.py -DVAR1=9 -DVAR2=Off" with argparse
我的解决办法是-DVAR1=9
分成('VAR1',9)
和它添加到D
属性。这使用自定义type
。
Using variable arg names with argparse - 在将它传递给解析器之前,它会处理sys.argv
。
python argparse store --foo=bar as args.key='foo', args.value='bar'
表明自定义Action
类。
我认为我们还提出一个自定义Namespace
类。
分组值的内建机制是nargs
和append
操作。你可以一起得到列表清单的属性。
JSON字符串也可用于输入复杂的数据结构。
class MyAction(argparse._StoreAction):
def __call__(self, parser, namespace, values, option_string=None):
print('storing', option_string)
arg = getattr(namespace, self.dest)
if arg is None:
arg = {}
arg[option_string] = values
setattr(namespace, self.dest, arg)
In [135]: p=argparse.ArgumentParser()
In [136]: p.add_argument('--p1',action=MyAction,dest='p');
In [137]: p.add_argument('--p2',action=MyAction,dest='p');
In [138]: p.parse_args('--p1 one --p2 two'.split())
storing --p1
storing --p2
Out[138]: Namespace(p={'--p2': 'two', '--p1': 'one'})
In [139]: _.p
Out[139]: {'--p1': 'one', '--p2': 'two'}
显然,这可以通过各种方式来提炼 - 修剪键“P1”甚至“1”,保存到列表或嵌套命名或其他自定义结构等
这种方法仍然需要你定义每个“--pn`变化的add_argument
。
另一种方法是保持简单,产生了命名空间,如:
In [141]: argparse.Namespace(p1='one', p2='two', input1=1, input2=3)
Out[141]: Namespace(input1=1, input2=3, p1='one', p2='two')
,然后做自己的分组之后。
In [142]: args=argparse.Namespace(p1='one', p2='two', input1=1, input2=3)
In [143]: {key:getattr(args,key) for key in ['p1','p2']}
Out[143]: {'p1': 'one', 'p2': 'two'}
我不清楚你想做什么。你的意思是'-p1'和'-p2'只能出现在/作为子结构/“子选项”的“输入2”? – jwodder
参数组大多用于互斥选项。你的小组的本质是什么?例如。你可以只加前缀'dest'来帮助组参数吗? – 9000
你如何去dest前缀? @ 9000 –