Python 带有选择和 nargs=2 的 argparse

Python argparse with choices and nargs=2

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

> 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)

这不起作用,因为它会尝试使用选项来验证两个参数。帮助字符串显示如下:

usage: app [--option {count,label} {count,label}]

有几种方法可以手动完成:

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

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

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 不必做所有事情。它的主要功能是弄清楚用户想要什么。检查值并引发标准化错误是解析的重要组成部分,但不是其主要目的。

还要考虑如何为预期输入指定 usage/help。