带有 docopt 的两个参数的选项

Option with two arguments with docopt

我想要一个带有两个参数的选项。 IE。希望能够使用

$ ./foo --path "old" "new"

或者我真正想要的是:

$ ./foo --path "old" "new" --path "old" "new"

但是我不知道该怎么做? (其实我怕是不可能的。。。)


我不想要的,但是接近的

我知道如何使用重复选项(见下文),但这并不是我想要的。

#!/usr/bin/env python3
'''foo

Usage:
  foo [--path ARG]...

Options:
  --path=ARG  Repeating option.
'''

import docopt

args = docopt.docopt(__doc__)

print(args)

可以用

调用
$ ./foo --path "old" --path "new"

这是 docopt 无法实现的。

项目所有者gives原因如下:

Because in invocation like prog --foo bar baz qux there's no way for a person to tell if it means prog --foo=bar baz qux or prog --foo=bar,baz qux or prog --foo=bar,baz,qux.

我觉得挺合理的。

我建议改用两个选项,可能是 --from--to,或者 --old-path--new-path

或者,您可以使用 argparse instead, and set the nargs 选项(例如 nargs=2)。

你可以使用click lib http://click.pocoo.org/5/options/

@click.command()
@click.option('--path', '-m', multiple=True)
def run(path):
    print('\n'.join(path))

这可以使用 docopt 轻松存档。

语法:Usage: ./foo [--path <src> <dst>]...

输入:./foo --path src1 dst1 --path src2 dst2

代码:

>>> from docopt import docopt
>>> doc = "Usage: ./foo [--path <src> <dst>]..."
>>> argv = "--path old1 new1 --path old2 new2".split()
>>> args = docopt(doc, argv)

结果:

{
  "--path": 2, 
  "<dst>": [
    "dst1", 
    "dst2"
  ], 
  "<src>": [
    "src1", 
    "src2"
  ]
}

现在用它做点什么:

>>> if bool(args["--path"]):
>>>     n = 1 if args["--path"] is True else if args["--path"]
>>>     for i in range(0, n)]:
>>>         print("{}, {}".format(args["<old>"][i], args["<new>"][i]))
src1, dst1
src2, dst2

要添加多个位置参数,要求路径选项和参数的顺序正确,括号为“( )”。

Usage: ./foo [(--path <src> <dst>)]... <arg>...

注意: docopt 不会引发 SystemExit 以防用户混淆语法和输入 ./foo arg --path src dst 如果您使用带有多个参数的选项像那样。您将不得不自己处理它或在它前面添加另一个(子)命令。

Usage: ./foo [(--path <src> <dst>)]... bar <arg>...