gpt4 book ai didi

python - Argparse:带有 nargs ='+' 的两个位置参数

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:57 25 4
gpt4 key购买 nike

我正在尝试在图像之间进行数学运算。我已经定义(我的真实代码的简化版本):

parser = argparse.ArgumentParser(description='Arithmetic operations on images')
parser.add_argument("input1", metavar='input1', action='store',
help='list of input images to operate with', nargs="+", type=str)
parser.add_argument("operation", metavar='operation', action='store', type=str,
help='type of operation (+,-,*,/) to be done', nargs=1)
parser.add_argument("input2",metavar='input2', action='store', nargs="+",
type=str, help='image (or value) with which to perform the operation on input1')

此代码产生:

arith.py -h
usage: arith.py [-h] input1 [input1 ...] operation input2 [input2 ...]

因此它理解 input1 可以包含一个或多个元素,operation 将是单个元素,而 input2 可以是任意数量的元素。

当然,问题是有两个位置参数和不确定数量的元素,argparse 混淆了什么是什么。我试过将 choices=["+", "-", "*", "/"] 添加到 'operation' 中,这样它就会知道在哪里进行分离,但似乎 argparse 无法做到这一点。实际上,在 argparse 文档中,谈论 nargs='*' 你可以阅读:

Note that it generally doesn’t make much sense to have more than one positional argument with nargs='*'

我认为我可以将 args.input1、args.operation 和 args.input2 加在一起,然后将自己分开寻找“+”、“-”、“/”、“*”,但在做一些如此丑陋的事情之前我想过利用集体思想。

最佳答案

将字符串分配给位置时,解析器仅区分以前缀 char(例如“-”)开头的字符串和其余字符串。它无法区分表示“数字”的字符串和表示“操作”的字符串。实际上它执行这个正则表达式操作:

re.match('(A+)(A)(A+)','AAAAAAAAA')

这将产生 (AAAAAA),(A),(A)。它为最后 2 组分配足够的字符串以满足它们的规范,并将其余的分配给第一组。

因此您需要某种“标志”来标记第一个列表的结尾。

我认为,这是您使用 argparse 最接近的结果:

parser.add_argument("input1", nargs="+", type=int)
parser.add_argument("-o", "--operation", choices=['+','minus','*','/'] )
parser.add_argument("input2", nargs="+", type=int)

应该转向

PROG 1 3 4 -o + 5 6 7
PROG 1 3 4 -o+ 5 6 7
PROG 1 3 4 --operation=+ 5 6 7

进入(我认为)

namespace(input1=[1,3,4], operation='+', input2=[5,6,7])

请注意 choices 列表不包含“-”。那是因为解析器将其视为 prefix_char。可能有一种方法可以将它作为参数值潜入,但我不会花时间去寻找它。

我在解析器中将 input1 值转换为整数。之后你可以这样做。当然,也可以制作花车。

我省略了默认参数,例如 type=straction='store'


但也许更好的解决方案是将所有值作为 1 个列表,然后自行拆分。至少对于这 3 个参数,您没有充分利用 argparse 的强大功能。

alist = ['1','2','3','+','4','5','6']
i = <find index of '+-/*'>
input1 = alist[:i]
operations = alist[i]
input2 = alsits[i+1:]

关于python - Argparse:带有 nargs ='+' 的两个位置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235469/

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