如何在docopt中构建无序参数?

时间:2018-02-28 13:44:53

标签: go docopt

我正在尝试构建一个接受一组选项的docopt用法。

Naval Fate.

Usage:
  naval_fate.py ship
  [-b <b_command>]
  [-e <e_command>]

Runnable示例: http://try.docopt.org/?doc=Naval+Fate.%0D%0A%0D%0AUsage%3A%0D%0A++naval_fate.py+ship%0D%0A++%5B-b+%3Cb_command%3E%5D%0D%0A++%5B-e+%3Ce_command%3E%5D&argv=ship+-e+c+

如果我使用它,它可以正常工作:

ship -b barg -e earg

输出结果为:

{
  "-b": true, 
  "-e": true, 
  "<b_command>": "barg", 
  "<e_command>": "earg", 
  "ship": true
}

但是如果使用它,它仍然给相应的参数赋予相同的值:

ship -e earg -b barg 

输出:

{
  "-b": true, 
  "-e": true, 
  "<b_command>": "earg", 
  "<e_command>": "barg", 
  "ship": true
}

请注意,我将earg传递给-e,但它在输出中被分配给b_command。

我在golang的docopt-go包中看到了相同的行为。我的用法字符串错了吗?如果是这样,我应该如何构建docopt用法字符串,以便它为正确的参数分配正确的值并尊重指定的参数?

1 个答案:

答案 0 :(得分:0)

naval_fate.py ship
[-b <b_command>]
[-e <e_command>]

您撰写的docopt的解释如下:

  • 子命令ship
  • 按任意顺序执行以下零个或多个:
    • 布尔标志-b
    • 位置参数<b_command>
    • 布尔标志-e
    • 位置参数<e_command>

因此,以下所有内容都将被视为合法输入命令:

naval_fate.py ship -e
naval_fate.py ship BB -e
naval_fate.py ship -eb
naval_fate.py ship BB EE

表达-b <b_command>-e <e_command>等标记的正确方法是通过名为Options的部分。

Naval Fate.

Usage:
  naval_fate.py ship [options]

Options:
  -b <b_command>   Description of -b
  -e <e_command>   Description of -e