“ docopt.DocoptLanguageError:--replicas不能有参数”只能与“ replicas”一起使用,不能与“ replication”一起使用

时间:2019-08-12 22:03:43

标签: python docopt

这是DocOpt的工作版本(部分取自海军命运):

"""
Instance Manager

Usage:
  instance_manager cluster create <name> <manager> <worker>... [--google|--virtualbox]
  instance_manager cluster delete <name>
  instance_manager cluster <name> add <worker> [--size=<size>]
  instance_manager cluster <name> remove <worker>
  instance_manager cluster <name> service add <service> [--replication=<replication>]
  instance_manager cluster <name> service remove <service>
  instance_manager cluster <name> service remove <service>
  instance_manager instance (add|remove) <x> <y> [--moored|--drifting]
  instance_manager -h | --help
  instance_manager --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --size=<size> Size of the container.
  --moored      Moored (anchored) instance.
  --drifting    Drifting instance.
  --google  Google Cloud.
  --virtualbox  VirtualBox.
  --replication Service Replication.
"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='0.1.1rc')
    print(arguments)

这是DocOpt的无效版本。

"""
Instance Manager

Usage:
  instance_manager cluster create <name> <manager> <worker>... [--google|--virtualbox]
  instance_manager cluster delete <name>
  instance_manager cluster <name> add <worker> [--size=<size>]
  instance_manager cluster <name> remove <worker>
  instance_manager cluster <name> service add <service> [--replicas=<replicas>]
  instance_manager cluster <name> service remove <service>
  instance_manager cluster <name> service remove <service>
  instance_manager instance (add|remove) <x> <y> [--moored|--drifting]
  instance_manager -h | --help
  instance_manager --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --size=<size> Size of the container.
  --moored      Moored (anchored) instance.
  --drifting    Drifting instance.
  --google  Google Cloud.
  --virtualbox  VirtualBox.
  --replicas    Service Replication.
"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='0.1.1rc')
    print(arguments)

错误:

docopt.DocoptLanguageError: --replicas must not have an argument

唯一的区别是,人们使用单词replicas而不是replication

diff first.py second.py 
9c9
<   instance_manager cluster <name> service add <service> [--replication=<replication>]
---
>   instance_manager cluster <name> service add <service> [--replicas=<replicas>]
24c24
<   --replication Service Replication.
---
>   --replicas    Service Replication.

这是不可接受的。

2 个答案:

答案 0 :(得分:2)

--replication后需要两个空格,只有一个。 --size=<size>之后相同。

此外,在第二个示例中,模式(顶部)中的--replicas[Options]都同时有--replicas=<replicas>(无自变量)。这些彼此矛盾,尚不清楚是否应允许使用参数。

最后,不需要有两个相同的模式,删除一个:

instance_manager cluster <name> service remove <service>

文档:https://github.com/docopt/docopt#option-descriptions-format

  

使用两个空格将选项及其非正式描述分开:

--verbose More text.   # BAD, will be treated as if verbose option had
                       # an argument "More", so use 2 spaces instead
-q        Quit.        # GOOD
-o FILE   Output file. # GOOD
--stdout  Use stdout.  # GOOD, 2 spaces

这是--replication的工作模式:

Instance Manager

Usage:
  instance_manager cluster create <name> <manager> <worker>... [--google|--virtualbox]
  instance_manager cluster delete <name>
  instance_manager cluster <name> add <worker> [--size=<size>]
  instance_manager cluster <name> remove <worker>
  instance_manager cluster <name> service add <service> [--replication=<replicas>]
  instance_manager cluster <name> service remove <service>
  instance_manager instance (add|remove) <x> <y> [--moored|--drifting]
  instance_manager -h | --help
  instance_manager --version

Options:
  -h --help      Show this screen.
  --version      Show version.
  --size=<size>  Size of the container.
  --moored       Moored (anchored) instance.
  --drifting     Drifting instance.
  --google       Google Cloud.
  --virtualbox   VirtualBox.
  --replication=<replicas>  Service Replication.

http://try.docopt.org上进行实时(预填充)测试

答案 1 :(得分:0)

在损坏版本的 --replicas 部分将 --replicas=<replicas> 更改为 Options:。然后it works

基本上,如果一个选项接受一个参数,那么该参数也必须出现在“选项:”部分的选项条目中。您在两个版本中都犯了同样的错误。

您的第二个版本仅“有效”,因为它无法为您捕捉到该错误,因为您没有遵循“选项及其描述之间的两个空格”规则而混淆了它。如果您在“工作”版本中的 --replication 之后添加所需的空间,您将获得 the same error

您还可以通过在 --replicas 和“选项”部分中的描述之间仅放置一个空格来“修复”损坏的版本。然后是 also works,尽管这种方式“违反了 docopt 的规则”,但我不会指望它起作用 - 如果是我,我尝试“修复”这个问题的方法要么是

  1. 尝试在选项及其描述之间接受一个空格,在这种情况下,此版本(以及您在问题中发布的“工作”版本)会引发相同的错误,或者

  2. 尽量确保这个版本(以及你在问题中发布的“工作”版本)总是抛出一个关于选项和它们的描述之间没有足够空格的异常。