我正在尝试使用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拒绝接受这种格式错误的输入?
答案 0 :(得分:2)
关于短期选项存在一些含糊之处:更好地使用--option = ARG long选项:
-o - 选项
以一个或两个破折号开头的单词(“ - ”除外,“ - ”by 自己)被解释为短(一个字母)或长选项, 分别
- 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.
注意,写入 - 输入ARG(与--input = ARG相对)是不明确的, 这意味着它无法判断ARG是选项的论点还是 位置论证。在使用模式中,这将被解释为 带参数的选项仅当选项的描述(如下所述)时 提供该选项。否则它将被解释为单独的 选项和位置参数。
与-f FILE和-fFILE表示法相同的歧义。虽然在 后一种情况不可能判断它是否是一个数字 堆叠的短选项,或带参数的选项。这些符号 只有在选项的情况下才会被解释为带参数的选项 提供说明。
答案 1 :(得分:2)
这基本上是一个设计决策,该选项的参数可以是任意字符串。我们正在讨论这是否是一个好的决定。