2017-02-22 74 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

相关问题