2017-02-15 41 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字符串和分裂它根据需要。