首页 文章

如何防止docopt吞下一个选项?

提问于
浏览
1

我正在尝试使用docopt创建命令行界面 . 这是我的文件的简化版本:

#!/usr/bin/env python
"""
Test program.

Usage:
  test.py [options]

Options:
  -a <input>    
  -b
  -c
  -d
"""
import docopt

print docopt.docopt(__doc__)

我基本上希望能够以任何顺序指定任何选项 . 但是,如果我忘记为 -a 标志指定参数,那么我得到一个这样的输出:

$ python test.py -a -b -c
{"-a": "-b",
 "-b": False,
 "-c": True,
 "-d": False}

Docopt将 -b 标志视为 -a 标志的参数,而不是将输入视为无效 . 是否有一些简单的方法可以检测到这一点,或者让docopt拒绝接受这种格式错误的输入?

2 回答

  • 2

    关于短选项有一些含糊之处:更好地使用--option = ARG long选项:

    -o --option以一个或两个破折号开头的单词(“ - ”,“ - ”除外)分别被解释为短(单字母)或长选项 . - 短选项可以“堆叠”,这意味着-abc相当于-a -b -c .

    • 长选项可以在空格或等于“=”符号后指定参数: - input = ARG等效于--input ARG .
      -Short选项可以在可选空格后指定参数:-f FILE等效于-fFILE .
      注意,写入 - 输入ARG(与--input = ARG相对)是不明确的,这意味着无法判断ARG是选项的参数还是位置参数 . 在使用模式中,只有在提供该选项的选项说明(如下所述)时,才会将此参数解释为带参数的选项 . 否则,它将被解释为单独的选项和位置参数 . 与-f FILE和-fFILE表示法相同的歧义 . 虽然在后一种情况下,不可能判断它是多个堆叠的短选项,还是带参数的选项 . 仅当提供选项的描述时,这些符号才会被解释为带参数的选项 .
  • 2

    这基本上是一个设计决策,该选项的参数可以是任意字符串 . 我们正在讨论这是否是一个好的决定 .

相关问题