2017-02-22 50 views
0

我有一個argparser,有兩個參數,輸入和參數的子集。我的命令看起來像是否可以表示一些argparse參數集而不使用子分析器?

program -input1 <input1> -input2 <input2> -p1 <param1> -p2 <param2> 

我很想

args = parser.parse_args() 
params = vars(args.params) 

,而不是

params = {"p1": args.p1, "p2": args.p2, etc...} 

有一種優雅的方式做這樣的事情:

parser.add_argument("-p1", dest='p1', part_of=params) 

Subparsers似乎不是l他們是爲此而製作的。或者他們?

Argparse有argument groups,但他們看起來像只是幫助文本。

謝謝!

+1

我不清楚你想做什麼。你的意思是'-p1'和'-p2'只能出現在/作爲子結構/「子選項」的「輸入2」? – jwodder

+1

參數組大多用於互斥選項。你的小組的本質是什麼?例如。你可以只加前綴'dest'來幫助組參數嗎? – 9000

+0

你如何去dest前綴? @ 9000 –

回答

0

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

分組值的內建機制是nargsappend操作。你可以一起得到列表清單的屬性。

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'} 
+0

你能做得更好嗎?重新閱讀我的問題 - 這又變得相關了 - 我覺得這個功能應該由python提供。我不太瞭解python的治理,但我很樂意貢獻這一點。在我看來,這會建立[參數組](https://docs.python.org/3.6/library/argparse.html#argument-groups),它已經存在,但僅用於幫助文本。 –

+0

歡迎您在'http:// bugs.python.org /'上搜索'argparse'問題。研究其中的一些,無論是開放還是封閉的,看看有哪些變化。有兩個挑戰1)證明這是一個緊急和普遍的問題,2)寫一個完整的補丁(包含測試和文檔)。 – hpaulj

相關問題