【发布时间】:2018-06-29 03:26:43
【问题描述】:
我正在尝试创建一个带有两个参数的选项。第一个参数应该通过选择进行验证,但第二个参数是用户提供的任意值。例如。
> 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,但如果没有它则无效。它实际上是一个具有两个值的单一选项 - 使 --option 有一个复合值,例如
--option count=3然后解析该值
我想要的部分是让自动生成的帮助字符串显示第一个参数的选择。我还希望 argparse 尽可能使用最少的自定义代码来检测和报告错误。原因是我们有一个非常复杂的 CLI,这有助于保持一致性。
有没有办法用 argparse 做到这一点?
【问题讨论】:
-
这个 SO 问题很好地讨论了如何做到这一点,以及为什么单个选项有多个值可能不好:stackoverflow.com/questions/4109436/…
-
您可以编写一个自定义的
type函数和/或Action类来处理这个问题。或者您可以在解析后进行值测试。但正如您发现的那样,argparse通常对所有nargs值应用相同的测试。