如何在python中最有效地解析这些参数?

时间:2015-04-22 20:37:08

标签: python argparse

所以我正在尝试使用argparse库来制定策略。

以下是我想要与我的程序进行交互的方式:

$ program list [<number>] 
$ program check <name>
$ program watch <name> [<quality>]

现在我有一个参数解析器,如下所示:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('list')
group.add_argument('check')
group.add_argument('watch')

但是如何在现有参数中添加一个可选参数,比如一个整数?

这意味着用户可以通过以下方式调用list命令:

program list 

使用默认值调用列表操作,或者:

program list 10

使用参数10调用列表操作。

我在文档中看到了子命令选项,但我遇到了问题,我会为列表参数设置一个子解析器,但是我必须添加一个标志,例如-n然后提供数字。也许这是一个更好的方法吗?但是我喜欢只想提供数字的想法,或者如果你不想提供数字的话就省略它。

我正在努力实现良好的做法吗?是否可以使用argparse?

1 个答案:

答案 0 :(得分:2)

这个样本让我走错了方向。我在最后描绘了一个subsparser实现,我认为这样做。

cv::Mat outerProduct = cv::repeat(tmp, 1, 9);
for (int i = 0; i < 9; i++)
{
    outerProduct.col(i) *= tmp.at<int>(i, 0);
}

它需要3个字符串,并将它们分配给3个属性。

但是,您不能将3'位置`参数放在互斥组中。一个可选的位置(是的术语令人困惑)可以在这样一个组中,但其余的必须是“可选的”(标记)。

回到初始列表。这些不同的模式是您想要接受的吗?

[myButton setTitle:forState:]

其中'list','check','watch'是文字字符串,而'integer','name','quality'是变量名。

如果是这种情况,那么subparsers可能是最好的选择。 parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument('list') group.add_argument('check') group.add_argument('watch') 可用于使位置参数“可选”。

program list [integer]
program check name
program watch name [quality]
如果没有明确指定,

nargs='?'parser = argparse.ArgumentParser() sp = parser.add_subparsers(dest='cmd') # put the command string in `cmd` attribute p1 = sp.add_parser('list') p2 = sp.add_parser('check') p3 = sp.add_parser('watch') p1.add_argument('value',dtype=int, nargs='?') # ok with 0 or 1 values p2.add_argument('name') p3.add_argument('name') p3.add_argument('quality',nargs='?') 将获得默认值。默认valuequality。但是你可以定义一个有意义的替代方案default表示整数值。

您还可以定义一个解析器:

None

这将指向3个'命令'字符串中的一个,并将其他任何内容放在'rest'属性中(作为字符串列表)。然后,您可以根据需要解释这些字符串。