argparse:如何允许带有 nargs="*" 和选项的空列表

jha*_*sen 6 python argparse

在 中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()
Run Code Online (Sandbox Code Playgroud)
error: argument letters: invalid choice: [] (choose from 'a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)

更新:此后我发现这choices=['a', 'b', 'c', []]似乎可以完成这项工作。这让我感到不一致,因为它表明argparse检查[] in choiceswhich 将意味着它也['a']应该在choices(而不是'a')中。

blu*_*e10 1

我认为这个问题(要求一个空列表默认​​值)基本上是更一般问题的一个特例,要求其他默认值。

根据这个具体案例调整我的其他答案:typed_argparse

import argparse
from typed_argparse import Choices

parser = argparse.ArgumentParser()
parser.add_argument(
    "letters", 
    choices=Choices("a", "b", "c"),  # Wrap the choices in Choices
    default=[],  # Empty list possible as default
    nargs="*",
)
Run Code Online (Sandbox Code Playgroud)

如果您喜欢可复制/粘贴的内容,则实现Choices非常简单。