gpt4 book ai didi

python argparse 字符串列表的选择接受唯一的部分列表元素

转载 作者:行者123 更新时间:2023-12-02 09:12:55 26 4
gpt4 key购买 nike

我想要以下规则

parser.add_argument('move', choices=['rock', 'paper', 'scissors'])

如果您传递字符的唯一子集,也可以工作(例如,“k”或“oc”将被接受为“rock”,但不会被接受为“r”,因为它不是唯一的)。

我的需要是能够以尽可能快的方式运行带有一个或多个参数的脚本,因此当子集足以让脚本理解选择时,避免编写整个参数名称。

有没有办法仍然利用自动集成在帮助和错误处理中的方便选择列表来获得此结果?

最佳答案

您可以定义 list 的自定义子类,它支持将 in 运算符定义为“仅包含一个元素(的一部分)一次”,如下所示:

class argList(list):
def __contains__(self, other):
"Check if <other> is a substring of exactly one element of <self>"
num = 0
for item in self:
if other in item:
num += 1
if num > 1:
return False
return num==1
def find(self, other):
"Return the first element of <self> in which <other> can be found"
for item in self:
if other in item:
return item

然后您可以使用它来构建您的参数列表:

>>> l = argList(["rock", "paper", "scissors"])
>>> "rock" in l
True
>>> "ck" in l
True
>>> "r" in l
False
>>> "q" in l
False

并用它来构建你的解析器:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> l = argList(["rock", "paper", "scissors"])
>>> parser.add_argument("move", choices=l)
_StoreAction(option_strings=[], dest='move', nargs=None, const=None, default=Non
e, type=None, choices=['rock', 'paper', 'scissors'], help=None, metavar=None)

现在它可以正确处理参数(尽管错误消息仍然有点误导):

>>> parser.parse_args(["rock"])
Namespace(move='rock')
>>> parser.parse_args(["r"])
usage: [-h] {rock,paper,scissors}
: error: argument move: invalid choice: 'r' (choose from 'rock', 'paper', 'scissors')

请注意,输入的参数被保留,(当然)可能不完整:

>>> parser.parse_args(["ck"])
Namespace(move='ck')

所以你必须找出你选择了哪个实际参数:

>>> args = parser.parse_args(["ck"])
>>> l.find(vars(args)["move"])
'rock'

我还没有进一步测试这一点 - 重新定义 in` 可能会在参数列表中产生意想不到的副作用,我想这种程序行为是否违反了最小意外原则是值得怀疑的 - 但这是一个开始。

关于python argparse 字符串列表的选择接受唯一的部分列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27859064/

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