所以我正在尝试使用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?
答案 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='?')
将获得默认值。默认value
为quality
。但是你可以定义一个有意义的替代方案default
表示整数值。
您还可以定义一个解析器:
None
这将指向3个'命令'字符串中的一个,并将其他任何内容放在'rest'属性中(作为字符串列表)。然后,您可以根据需要解释这些字符串。