我正在尝试在图像之间进行数学运算。我已经定义了(我的真实代码的简化版本):
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=str
,action='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/