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 拒绝接受这种格式错误的输入?

4

2 回答 2

2

关于短选项有一些歧义:最好使用 --option=ARG 长选项:

-o --选项

以一个或两个破折号开头的单词(“-”、“--”本身除外)分别被解释为短(一个字母)或长选项。

- Short options can be "stacked" meaning that -abc is equivalent to -a -b -c.
- Long options can have arguments specified after space or equal "=" sign: --input=ARG is equivalent to --input ARG.
-Short options can have arguments specified after optional space: -f FILE is equivalent to -fFILE.

注意,写--input ARG(与--input=ARG相对)是模棱两可的,这意味着不可能判断ARG是选项的参数还是位置参数。在使用模式中,仅当提供该选项的选项描述(如下所述)时,才会将其解释为带有参数的选项。否则它将被解释为单独的选项和位置参数。

-f FILE 和 -fFILE 表示法也有同样的歧义。尽管在后一种情况下,无法判断它是多个堆叠的空头期权,还是带有参数的期权。仅当提供了选项的描述时,这些符号才会被解释为带有参数的选项。

于 2013-04-05T07:14:42.457 回答
2

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

于 2013-04-05T07:42:53.300 回答