這聽起來像是一個變化 - 我如何接受任意'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 –