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

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具有两个位置不确定且元素数量不确定的参量,这使“什么是什么”感到困惑。我试过在'operation'中添加choices = [“+”,“-”,“*”,“/”],以便它知道在哪里进行分离,但是argparse似乎无法做到这一点。实际上,在argparse文档中,谈论nargs ='*'时,您可以阅读:



我以为我可以将args.input1,args.operation和args.input2加在一起,然后分开寻找“+”,“-”,“/”,“*”,但是在做如此丑陋的事情之前,我曾想过要敲击集体的思想。

最佳答案

在为位置分配字符串时,解析器仅区分以前缀char(例如'-')开头的字符串和其余字符。它不能区分代表“数字”的字符串和代表“运算”的字符串。实际上,它执行此正则表达式操作:

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

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

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

我认为,这是最接近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/

10-13 02:48