有没有可能不使用子parser来表示argparse的参数集?

2024-05-21 08:37:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个argparser,有两个参数子集,输入和参数。我的命令看起来像

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看起来它们不是为这个而生的。还是他们?你知道吗

Argparse有argument groups,但它们似乎只是为了帮助文本。你知道吗

谢谢!你知道吗


Tags: 命令parser参数argsparamsprogramargument子集
1条回答
网友
1楼 · 发布于 2024-05-21 08:37:30

这听起来像是-如何接受任意“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。你知道吗

另一种方法是保持argparse简单,生成如下名称空间:

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

相关问题 更多 >