Python argparse配置Nargs后报错 如何保留Nargs解决该问题?
问题根源
你给三个参数都设置了nargs=1,这是argparse的标准设计:只要声明nargs为正整数,不管值是1还是更大的数,解析出来的参数值都会被封装为长度等于nargs的列表,而非单个值。
你当前代码里实际拿到的args.o是['mul']、args.x是[5.0]、args.y是[6.0],calc函数中判断str(args.o) == 'mul'时,实际对比的是字符串"['mul']"和"mul",显然不匹配,所以走到else分支返回错误信息。
你注释掉nargs之后,argparse默认使用nargs=None,会直接返回单个值而非列表,所以判断逻辑能正常生效,得到预期结果。
保留nargs的解决方案
有两种可行修改方式:
方式1:解析参数后提取列表首元素
在参数解析完成后,手动取出每个参数列表的第一个元素即可,修改代码如下:
args = parser.parse_args() # 提取列表首元素转为单个值 args.x = args.x[0] args.y = args.y[0] args.o = args.o[0] print(str(args.o), args.x, args.y) sys.stdout.write(str(calc(args)))
方式2:修改calc函数适配列表类型参数
不修改参数解析逻辑,直接在calc函数内取值时处理列表:
def calc(args): print("In calc args") # 提取列表首元素做计算 op = args.o[0] x = args.x[0] y = args.y[0] if op == 'add': return x + y elif op == 'mul': return x * y elif op == 'sub': return x - y elif op == 'div': return x / y else: return "Something went wrong"
内容的提问来源于stack exchange,提问作者user15228768
相关产品推荐
相关产品推荐

