gpt4 book ai didi

python - Docopt:重复元素后的选项被解释为重复元素

转载 作者:太空狗 更新时间:2023-10-29 21:31:47 24 4
gpt4 key购买 nike

我正在使用 docopt 在我的简单 Python 程序中:

#!/usr/bin/env python
"""
Farmers market

Usage:
farmersmarket.py buy -i <item> -q <quantity> [<quantity>] [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help

Options:
-i --item Item.
-q --quantity Quantity.
-p --price Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.
"""

from docopt import docopt

print docopt(__doc__)

如果我运行:

farmersmarket.py buy --item eggs --quantity 100 115 --price 0.25

预期行为是以 0.25 的价格随机购买数量在 100 到 115 之间的鸡蛋。这至少在解释参数时没有问题。换句话说,docopt 得到了预期的一切:

{'--debug': False,
'--help': False,
'--item': True,
'--price': True,
'--quantity': True,
'--version': False,
'<item>': 'eggs',
'<price>': '0.25',
'<quantity>': ['100', '115'],
'buy': True}

但有时我不想购买随机数量的鸡蛋,而是购买特定数量的鸡蛋。在这种情况下 --quantity选项只接受一个参数:

farmersmarket.py buy --item eggs --quantity 471 --price 0.25

但这失败了,因为 docopt 解释了 --price 0.25作为 --quantity 的重复元素并失去了 <price> 的值(value):

{'--debug': False,
'--help': False,
'--item': True,
'--price': True,
'--quantity': True,
'--version': False,
'<item>': 'eggs',
'<price>': None,
'<quantity>': ['471', '0.25'],
'buy': True}

如何在重复元素后让其他选项起作用?

最佳答案

实际上,您忘记添加 <price> Options: 的参数描述部分;以下代码:

#!/usr/bin/env python
"""
Farmers market

Usage:
farmersmarket.py buy -i <item> -q <quantity> [<quantity>] [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help

Options:
-i --item Item.
-q --quantity Quantity.
-p --price <price> Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.
"""

from docopt import docopt

print docopt(__doc__)

如你所愿:

 % farmersmarket.py buy --item eggs --quantity 100 --price 0.25
{'--debug': False,
'--help': False,
'--item': True,
'--price': '0.25',
'--quantity': True,
'--version': False,
'<item>': 'eggs',
'<quantity>': ['100'],
'buy': True}

编辑:

但实际上,您尝试实现的目标是错误的。如果您查看已解析的参数,您会看到:

 '--quantity': True,
[…]
'<quantity>': ['100'],

这意味着您定义了一个 bool 值 --quantity参数和位置 quantity争论。两者无关……因此如下:

buy --items eggs --quantity --price 0.25 100 2 

给出结果:

 '--quantity': True,
[…]
'<quantity>': ['100','2'],

这不是您想要的……所以让我们回到您想要的:您说您想要一个参数,该参数采用两个值来定义最小值和可选的最大值。但我很遗憾地告诉你,这个确切的规则在 geptopt 中不再可能。 , argparsedocopt .

解析完成后,解决方案将始终涉及一些逻辑,否则您需要更改解析参数的方式。所以我可以为您看到四个选项:

两个开关

Farmers market

Usage:
farmersmarket.py buy -i <item> -m <min> [-M <max>] [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help

Options:
-i --item <item> Item.
-m --min <min> Minimal quantity.
-M --max <min> Maximal quantity.
-p --price <price> Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.

在这里,最简单但我认为最好的解决方案是使用两个不同的选项来设置最大和最小边界。这是解析器可以处理 {1,2} 的唯一方法参数的数量以及它应该实现的方式。

使用单个参数

让你实际拥有列表参数的最接近方法是实际“玩”语法:

Farmers market

Usage:
farmersmarket.py buy -i <item> -q <quantity> [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help

Options:
-i --item <item> Item.
-q --quantity <quantity> Quantity: min[,max]
-p --price <price> Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.

然后你可以使用:

% farmersmarket.py buy --items eggs -q 100,2 --price 0.25

并通过以下方式获取最小值和最大值:if len(docopt(__doc__)['--quantity'].split(',')) == 2: qmin, qmax = docopt(__doc__)['--quantity'].split(',') .

仅使用位置参数

最后,您的最后一个解决方案是仅使用位置参数:

Farmers market

Usage:
farmersmarket.py buy <item> <min_qty> [<max_qty>] [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help

Options:
<item> Item.
<min_qty> Minimum quantity
<max_qty> Maximum quantity
-p --price <price> Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.

然后当你打电话时它会起作用:

% farmersmarket.py buy eggs 100 2 -p 0.25

选项列表

但看起来您想获得一个参数列表,而使用命令行选项实现该目的的唯一方法是重复选项 -q 1 -q 2 -q 3… .要告诉 docopt 这就是你想要的,你需要在选项的参数之后添加一个省略号:

Farmers market

Usage:
farmersmarket.py buy -i <item> -q <quantity>... [-p <price>] [-dvh]
farmersmarket.py -d | --debug
farmersmarket.py -v | --version
farmersmarket.py -h | --help

Options:
-i --item <item> Item.
-q --quantity <quantity>... Quantity (-q min -q max)
-p --price <price> Price.
-d --debug Show debug messages.
-h --help Show this screen.
-v --version Show version.

然后你可以调用:

% farmersmarket.py buy --items eggs -q 100 -q 2 --price 0.25 

但是,您必须检查 len(docopt(__doc__)['--quantity']) < 2 (因为解析器将强制您至少提供一个)。但是你必须在描述中真正清楚地说明你的意思是如何使用它并给出一两个例子。

最后,我建议您使用选项列表之外的其他三个选项之一,因为它们使您希望如何调用程序更加明显。

关于python - Docopt:重复元素后的选项被解释为重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com