2017-02-15 84 views
2

看着this answer,我可以這樣做:解析 「蟒蛇foo.py -DVAR1 = 9 -DVAR2 =關」 與argparse

parser=argparse.ArgumentParser() 
parser.add_argument('-D',action='append',help='FOO=BAR') 
options = parser.parse_args('-DVAR1=9 -DVAR2=Off'.split()) 

我也得到:

Namespace(D=['VAR1=9', 'VAR2=Off']) 

所以後來說:

[o.split('=') for o in options.D] 

結果:

[['VAR1', '9'], ['VAR2', 'Off']] 

這基本上是我所需要的,但我覺得這是一個可能已經在ArgParse包中實現的常見操作。 Pythonesque是否有這樣的方式?

+0

使用'sys.argv',哪個選項運行第一或哪個選項包括其他?我從來沒有使用過這個模塊,也許我基本上不使用這個。 – dsgdfg

+1

不要這樣想。但是,一個字典的變量可能比列表更有用:'vars = dict([o.split('=')for o in options.D]' – nigel222

+0

Figura項目中實現了類似的東西。 ee [this](https://github.com/shx2/figura/blob/master/figura/cli.py#L57) – shx2

回答

1

我認爲​​開發人員(和其他POSIX風格的解析器)期望您定義--dvar1--dvar2參數,而不是這種開放式方法。

其他人詢問了某種通用的key=value輸入。​​沒有任何東西可以直接處理。因此,像你一樣收集字符串,並在解析後拆分它們看起來很好。你所做的和我見過的一樣乾淨清晰。

你可以做的是分裂與type功能上即時:

In [38]: import argparse 
In [39]: def foo(astr): 
    ...:  return astr.split('=') 
    ...: 
In [40]: parser=argparse.ArgumentParser() 
In [41]: parser.add_argument('-D',action='append',type=foo) 
Out[41]: _AppendAction(option_strings=['-D'], dest='D', nargs=None, const=None, default=None, type=<function foo at 0xab0c765c>, choices=None, help=None, metavar=None) 
In [42]: options = parser.parse_args('-DVAR1=9 -DVAR2=Off'.split()) 
In [43]: options 
Out[43]: Namespace(D=[['VAR1', '9'], ['VAR2', 'Off']]) 

python argparse store --foo=bar as args.key='foo', args.value='bar'

採用不同的方法 - 繼承Action。這將需要如果你想

namespace(VAR1='9', VAR2='Off') 

(您的後處理循環可以寫這樣的屬性到namespace。另一個定製技巧是定義一個自定義Namespace類,一個是可以採取VAR1=9字符串和分裂它根據需要。