加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Argparse:两个位置参数,带有nargs =”

发布时间:2020-12-20 13:49:48 所属栏目:Python 来源:网络整理
导读:我正在尝试在图像之间进行数学运算.我已定义(我的真实代码的简化版本): parser = argparse.ArgumentParser(description='Arithmetic operations on images')parser.add_argument("input1",metavar='input1',action='store',help='list of input images to o
我正在尝试在图像之间进行数学运算.我已定义(我的真实代码的简化版本):

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',type=str,help='type of operation (+,-,*,/) to be done',nargs=1)
parser.add_argument("input2",metavar='input2',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可以包含一个或多个元素,操作将是单个元素,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).它为最后两组分配足够的字符串以满足其规范,并将其余组分配给第一组.

所以你需要某种“标志”来标记第一个列表的结尾.

我认为,这是你与argparse最接近的:

parser.add_argument("input1",type=int)
parser.add_argument("-o","--operation",choices=['+','minus','*','/'] )
parser.add_argument("input2",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])

请注意,选择列表不包括“ – ”.那是因为解析器将其视为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:]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读