Docopt - 可选参数的多个值

Docopt - Multiple values for an optional argument

我想用 docopt 解析具有多个值的可选参数。下面是示例用法。

my_program.py --loc pcg acc
# or anything that achieve similar result

在解析之后,我希望有一个像这样的 python 列表

arguments["--loc"] = ["pcg", "acc"]

我四处浏览,通过传递 nargs 参数,发现这在 argparse 中是否可行。

我在 docopt 中找不到任何类似的方法,这在 docopt 中可行吗?如果没有,还有什么选择?

我能想到的另一种方法是要求用户指定以逗号分隔的值,并在解析过程中手动拆分它,如下所示。

my_program.py [--loc=<comma_separated_str>]

python代码中

locs = arguments["--loc"].split(",") if arguments["--loc"] else []

但是,这看起来很丑陋,所以我正在寻找使用 docopt 的正确方法。

一种方法是使用省略号 (...) 运算符,这样一个选项可以用方括号重复零次或多次,或者用圆括号重复一次或多次。例如

"""Usage: my_program.py --help
       my_program.py [--loc=<loc>]...
"""

from docopt import docopt
print(docopt(__doc__))

将给出以下输出

$ python my_program.py --loc=pcg --loc=acc
{'--help': False,
 '--loc': ['pcg', 'acc']}

您要查找的定义大概是

"""
Usage: my_program.py --help
   my_program.py [(--loc <loc>) [<loc>...]]
"""

from docopt import docopt
print(docopt(__doc__))

多个 --loc 值之间有空格

python3 my_program.py --loc pcg acc hah
{'--help': False,
 '--loc': True,
 '<loc>': ['pcg', 'acc', 'hah']}

--loc参数确实是可选的

$ python3 my_program.py
{'--help': False,
 '--loc': False,
 '<loc>': []}

不为 --loc 提供任何值会导致错误

$ python3 my_program.py --loc
Usage: my_program.py --help
       my_program.py [(--loc <loc>) [<loc>...]]

如果 --loc 可以在没有任何值的情况下使用,这个更简单的定义就可以了

"""
Usage: my_program.py --help
       my_program.py [--loc <loc> ...]
"""

from docopt import docopt
print(docopt(__doc__))

导致

$ python3 my_program.py --loc
{'--help': False,
 '--loc': True,
 '<loc>': []}

除此之外等同于第一个定义