我正在尝试创建一个带有两个参数的选项。第一个参数应该通过选项验证,但第二个参数是任意用户提供的值。例如。
> app -h
usage: app [--option {count,label} arg]
正确的用法示例:
> app --option count 1
> app --option count 912
> app --option label userfoo
我尝试像这样设置:
parser.add_argument('--option', choices=['count','label'], nargs=2)
这不起作用,因为它尝试使用选项验证BOTH参数。帮助字符串显示:
usage: app [--option {count,label} {count,label}]
我有几种方法可以手动完成:
--option count --value 3
,但这很尴尬,因为选项需要--value,但没有它则无效。它实际上是一个带有两个值的选项--option count=3
,然后解析值我想要的部分是让自动生成的帮助字符串显示第一个参数的选项。我还希望argparse能够尽可能地使用最少的自定义代码来检测和报告错误。原因是我们有一个非常复杂的CLI,这有助于保持一致性。
有没有办法用argparse做到这一点?
答案 0 :(得分:1)
parser._get_values
为数字时, nargs
会这样做:
value = [self._get_value(action, v) for v in arg_strings]
for v in value:
self._check_value(action, v)
_get_value
应用type
函数,而_check_value
测试choices
。在此之后,values
列表将传递给store
操作。
因此,正常处理对每个字符串应用相同的type
和choices
测试。
我可以想象编写一个type
函数,它接受列表中的数字和字符串。但它无法区分第一和第二个论点。自定义Action
会看到两者,并且可以进行进一步测试。
但解析后进行自己的价值测试往往更简单。 parser
不必做任何事情。它的主要功能是弄清楚用户想要什么。检查值和引发标准化错误是解析的一个很好的部分,但不是它的主要目的。
还要考虑如何指定预期输入的使用/帮助。