Python argparse有选择和nargs = 2

时间:2018-01-19 20:04:13

标签: python argparse

我正在尝试创建一个带有两个参数的选项。第一个参数应该通过选项验证,但第二个参数是任意用户提供的值。例如。

> 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,但没有它则无效。它实际上是一个带有两个值的选项
  • make --option有一个复合值,例如--option count=3,然后解析值

我想要的部分是让自动生成的帮助字符串显示第一个参数的选项。我还希望argparse能够尽可能地使用最少的自定义代码来检测和报告错误。原因是我们有一个非常复杂的CLI,这有助于保持一致性。

有没有办法用argparse做到这一点?

1 个答案:

答案 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操作。

因此,正常处理对每个字符串应用相同的typechoices测试。

我可以想象编写一个type函数,它接受列表中的数字和字符串。但它无法区分第一和第二个论点。自定义Action会看到两者,并且可以进行进一步测试。

但解析后进行自己的价值测试往往更简单。 parser不必做任何事情。它的主要功能是弄清楚用户想要什么。检查值和引发标准化错误是解析的一个很好的部分,但不是它的主要目的。

还要考虑如何指定预期输入的使用/帮助。