0

我是 docopt 的新手,在让一个小例子工作时遇到了一些困难。我刚才遇到了两个小问题,欢迎就这些问题提供帮助,并欢迎对改进代码提出更一般的意见。第一个问题是让程序要求该--required选项。它应该在没有所需命令行选项的情况下在运行时打印文档字符串。第二个问题是让程序接受COMPUTER选项(例如 )的参数(例如--computer)。这将如何在终端中指定以及如何编码?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
my example program

Usage:
    docopt_example_1.py [--ipaddress=IPADDRESS] [--computer=COMPUTER]
    docopt_example_1.py --network <network>
    docopt_example_1.py (--required)
    docopt_example_1.py --notrequired
    docopt_example_1.py --version

Arguments:
    IPADDRESS               I.P. address
    COMPUTER                computer identification
    <network>               network identification

Options:
    -h, --help              Show this help message.
    --version               Show the version and exit.
    --required              option required for running
    --notrequired           option not required for running
    --ipaddress=IPADDRESS   I.P. address
    --computer=COMPUTER     computer identification
    --network=NETWORK       network identification
"""
from docopt import docopt

def main(options):
    print("----------")
    print("a printout of the command line options as parsed by docopt:")
    print(options)
    print("----------")
    if options["--notrequired"]:
        print("required option selected")
    if options["--computer"]:
        print("computer name: {computer}".format(computer=options["COMPUTER"]))
    if options["--network"]:
        print("computer name: {network}".format(network=options["<network>"]))
    else:
        print("no options")

if __name__ == "__main__":
    options = docopt(__doc__, version='1')
    main(options)
4

1 回答 1

4

关于您的第一个问题,“如果不包含在括号中,则默认情况下需要所有元素”。所有使用线都是平行的,这意味着输入只需要匹配任何一条使用线,它就会被认为是有效的。因此,您需要在所有使用行中添加“必需参数”:

Usage:
    docopt_example_1.py --required [--notrequired] [--ipaddress=IPADDRESS] [--computer=COMPUTER]
    docopt_example_1.py --required [--notrequired] --network <network>
    docopt_example_1.py --version

在上面的示例中,如果您的输入不是“docopt_example_1.py --version”并且不包含“--required”,它将在运行时打印文档字符串。


关于第二个问题,使用选项名称读取选项的参数:

print("computer name: {computer}".format(computer=options["--computer"]))
print("network name: {network}".format(network=options["--network"]))

此外,您可能需要注意官方网站上的注释:

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

帮助理解它,如果您删除此行

--network=NETWORK       network identification

并且输入是docopt_example_1.py --required [--notrequired] --network network_name,那么您将无法从中读取“network_name” options['--network'],而是需要使用options['<network>']. 因为在这种情况下,“network_name”被认为是一个单独的位置参数。


顺便说一句,以下几行似乎有逻辑错误。唯一的else纽带到最后if。我认为这不是你所期望的:

if options["--notrequired"]:
    print("required option selected")
if options["--computer"]:
    print("computer name: {computer}".format(computer=options["COMPUTER"]))
if options["--network"]:
    print("computer name: {network}".format(network=options["<network>"]))
else:
    print("no options")

参考:http ://doopt.org/

于 2014-06-30T10:38:24.620 回答