选项多样性与docopt

时间:2013-08-27 14:22:14

标签: python command-line argparse docopt

我想使用docopt来解析可以多次接收相同的选项的命令行。有人可以解释一下如何做到这一点吗?

测试示例:

#!/usr/bin/env python

"""
Test program.

Usage:
    test.py -v

Options:
    -v  Flag that should be counted
"""

import docopt
print docopt.docopt(__doc__)

如果我用test.py -v运行,我会得到:

{'-v': True}

如果我用test.py -vv运行它,它会显示用法消息(表示命令行无效)。

我想调整选项文档,以便docopt返回我:

{'-v': 1}

只传递了1 -v并且:

{'-v': 3}

如果用户通过了-vvv。这几乎是相同的功能the count action in argparse

2 个答案:

答案 0 :(得分:7)

在挖掘docopt(已关闭)问题列表后,I have found that the right way to represent this将是:

#!/usr/bin/env python

"""
Test program.

Usage:
    test.py (-v ...)

Options:
    -v  Flag that should be counted
"""

import docopt
print docopt.docopt(__doc__)

也就是说,必须使用符号“...”来表示选项可能会多次出现。在这种情况下,该选项将被正确计算。如果使用test.py -vvv调用上述程序,则会正确打印:

{'-v': 3}

符号“...”也可以与带有参数的参数和选项一起使用,只需点击上面的链接就可以得到一个例子。

答案 1 :(得分:2)

(这只是对上述内容的评论,但作为评论会很尴尬。)

这可以扩展为将列表作为参数传递:

"""
Usage:
program (--opt=OPT ...)

Options:
  --opt=OPT    An option that can be specified multiple times to form a list
"""

import docopt

print docopt.docopt(__doc__)

我们将其作为

运行
python test.py --opt=first_option
{'--opt': ['first_option']}

python test.py --opt=first_option --opt="second in line"
{'--opt': ['first_option', 'second in line']}

等等。