【发布时间】:2020-01-04 10:48:04
【问题描述】:
在argparse 中,如何创建一个可选的位置命令行选项,该选项接受多个参数,这些参数都需要成为选项列表的一部分?
在下面的示例中,我想允许列表 ['a', 'b', 'c'] 的任何子集——即 ['a']、['a', 'c']、...以及至关重要的空列表 []。我期待以下实现这一点,但如果参数被省略,它会失败。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('letters', nargs='*', choices=['a', 'b', 'c'])
args = parser.parse_args()
error: argument letters: invalid choice: [] (choose from 'a', 'b', 'c')
更新:我发现choices=['a', 'b', 'c', []] 似乎可以完成这项工作。这让我感到矛盾,因为它表明argparse 检查[] in choices,这意味着['a'] 也应该在choices 中(而不是'a')。
【问题讨论】:
-
任何支持
in运算符的对象都可以传递给选择。奇怪的是,您需要使用空列表而不是空字符串或None来完成空选择。 -
同意。
None和''是我收到错误时尝试的第一件事。虽然我希望检查与all([_ in choices for _ in args])一致,但这不应该要求在选择中明确包含。 -
*位置满足[]空输入列表。但它不应该通过选择测试。我将不得不查看代码以了解发生了什么。它将在_get_values和_get_value方法中。我很惊讶我不记得看到有关此的错误/问题。 -
是否应该允许重复?我的意思是
parser.parse_args(['a', 'a'])不会引发错误。