在重复组上使用python argparse

2024-09-25 16:31:05 发布

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

我正在编写一个脚本,它接受一个必需的参数,然后可以在此基础上更改以下参数的解释。大多数组合都很顺利,但有一种组合给我带来了麻烦。这是一个由三个参数组成的重复组,都是字符串。例如:

$ python script.py p1 p2_1 p2_2 p2_3 p3_1 p3_2 p3_3

或作为伪正则表达式:

$ python script.py p1 (px_1 px_2 px_3)+

我无法控制输入的格式。但是可以选择通过stdin接收,而不是通过命令行接收。使用regex将其作为字符串处理可能更容易,这也允许我通过加入argv来处理这两者。在

还有一些其他的SO答案与argparse类似。在

hpaulj有两个有用的回答:Argparse, handle repeatable set of items 这里:Python argparser repeat subparse

现在几个小时后,我还没有弄清楚如何在没有黑客攻击的情况下使用argparse来工作。首先,去掉第一个参数,然后迭代,直到剩下的参数消失。我希望将它保存在同一个名称空间对象中,就像如果我能找到正确的方法一样。一些基于上述答案之一的演示代码:

#!/usr/bin/env python
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('param1', type=str)
param1, remaining = parser.parse_known_args()

parser = argparse.ArgumentParser()
parser.add_argument('first', type=str, action='append')
parser.add_argument('second', type=str, action='append')
parser.add_argument('third', type=str, action='append')

repeating_args, remaining = parser.parse_known_args(remaining)
while remaining:
    another_set, remaining = parser.parse_known_args(remaining)
    repeating_args.first.append(another_set.first[0])
    repeating_args.second.append(another_set.second[0])
    repeating_args.third.append(another_set.third[0])

但这对我来说只是一种混乱,它迫使我以影响其他参数组合的方式修改代码。有没有更好的方法来处理argparse?或者,如果我对此不满意,我应该不使用argparse吗?不幸的是,这意味着我要重写很多代码。。。在

谢谢。在

更新代码:

根据hpaulj的回答,这是我所使用的代码的压缩版和工作版。它比上面的代码好得多,因为它在解析器配置方面相对通用。我希望有帮助。在

^{pr2}$

命令行输出:

$ ./example.py format_1 foo bar baz meh meh meh e pluribus unum
Namespace(arg1=['foo', 'meh', 'e'], arg2=['bar', 'meh', 'pluribus'], arg3=['baz', 'meh', 'unum'], arg_format='format_1')

Tags: 代码addparser参数typeanotherargparseargs
1条回答
网友
1楼 · 发布于 2024-09-25 16:31:05

下面是一个粗略的序列,可以简化重复部分:

In [10]: p=argparse.ArgumentParser()

In [11]: p.add_argument('p2',nargs=3,action='append')

In [12]: ns,rest=p.parse_known_args('p21 p22 p23 p31 p32 p33'.split())

In [13]: ns
Out[13]: Namespace(p2=[['p21', 'p22', 'p23']])

In [14]: rest
Out[14]: ['p31', 'p32', 'p33']

In [15]: ns,rest=p.parse_known_args(rest,ns)  # repeat as needed

In [16]: ns
Out[16]: Namespace(p2=[['p21', 'p22', 'p23'], ['p31', 'p32', 'p33']])

通常“append”对于位置没有意义,因为它们不能被重复。但在这里它可以方便地生成子列表列表。将先前的名称空间传递给下一个解析步骤可以让您在已经解析的值上构建。这应该和我的nargs=3中的一样适用于您的3个位置参数。在

相关问题 更多 >