首页 文章

使用docopt的两个参数的选项

提问于
浏览
1

我想要一个带两个参数的选项 . 即我希望能够使用

$ ./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"

3 回答

  • 0

    这可以使用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
    

    要添加多个位置参数,需要使用parens“ ( ) ”使路径选项和参数的顺序正确 .

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

    Attention: docopt不会引发 SystemExit 以防用户混淆语法并输入 ./foo arg --path src dst 如果您使用具有多个参数的选项 . 您必须自己处理它或在它前面添加另一个(子)命令 .

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

    使用docopt无法实现这一点 .

    该项目的所有者gives原因如下:

    因为在调用像prog --foo bar baz qux这样的人没有办法告诉他们是否意味着编程--foo = bar baz qux或prog --foo = bar,baz qux或prog --foo = bar,baz ,qux .

    我觉得这很合理 .

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

    或者,您可以改为使用argparse,并设置nargs选项(例如 nargs=2 ) .

  • 1

    你可以点击lib http://click.pocoo.org/5/options/

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

相关问题