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}]
有几种方法可以手动完成:
- 删除选择字段并手动验证代码中的第一个参数。
- 将它分成
--option count --value 3
,但这很尴尬,因为 --value 是选项所必需的,但没有它则无效。它实际上是一个具有两个值的选项
- make --option 有一个复合值,例如
--option count=3
然后解析值
我想要的部分内容是让自动生成的帮助字符串显示第一个参数的选项。我还希望 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
操作。
因此正常处理对每个字符串应用相同的 type
和 choices
测试。
我可以想象编写一个 type
函数来接受列表中的数字和字符串。但它无法区分第一个和第二个参数。自定义 Action
会看到两者,并且可以进行进一步测试。
但通常在解析后进行自己的值测试会更简单。 parser
不必做所有事情。它的主要功能是弄清楚用户想要什么。检查值并引发标准化错误是解析的重要组成部分,但不是其主要目的。
还要考虑如何为预期输入指定 usage/help。
我正在尝试创建一个带有两个参数的选项。第一个参数应该通过选择来验证,但第二个参数是用户提供的任意值。例如。
> 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}]
有几种方法可以手动完成:
- 删除选择字段并手动验证代码中的第一个参数。
- 将它分成
--option count --value 3
,但这很尴尬,因为 --value 是选项所必需的,但没有它则无效。它实际上是一个具有两个值的选项 - make --option 有一个复合值,例如
--option count=3
然后解析值
我想要的部分内容是让自动生成的帮助字符串显示第一个参数的选项。我还希望 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
操作。
因此正常处理对每个字符串应用相同的 type
和 choices
测试。
我可以想象编写一个 type
函数来接受列表中的数字和字符串。但它无法区分第一个和第二个参数。自定义 Action
会看到两者,并且可以进行进一步测试。
但通常在解析后进行自己的值测试会更简单。 parser
不必做所有事情。它的主要功能是弄清楚用户想要什么。检查值并引发标准化错误是解析的重要组成部分,但不是其主要目的。
还要考虑如何为预期输入指定 usage/help。