如何让Python argparse重复选项的参数合并为单个列表
解决argparse重复选项参数合并为单列表的问题
问题场景
使用argparse库时,若给选项设置action='append'并配合nargs='+'(或nargs='*'),重复调用该选项会得到嵌套列表。比如执行以下代码:
# myScript.py import argparse parser=argparse.ArgumentParser() parser.add_argument('-i', action='append', nargs='+') parser.add_argument('-o', action='append', nargs='*') args = parser.parse_args()
运行命令:
myScript.py -i input1 input2 -o output1 -i input3 input4 input5 -o output2 -i input6
当前args.i的结果是嵌套列表:
[["input1", "input2"], ["input3", "input4", "input5"], ["input6"]]
期望得到扁平的单列表:
["input1", "input2", "input3", "input4", "input5", "input6"]
解决方案
方法1:解析后手动扁平化列表
最简单直接的方式,在解析完成后通过列表推导式展开嵌套列表:
# myScript.py import argparse parser = argparse.ArgumentParser() parser.add_argument('-i', action='append', nargs='+') parser.add_argument('-o', action='append', nargs='*') args = parser.parse_args() # 处理-i参数,展开为扁平列表 if args.i: args.i = [item for sublist in args.i for item in sublist] # 同理处理-o参数(如果需要) if args.o: args.o = [item for sublist in args.o for item in sublist]
方法2:自定义Action实现解析时扁平化
如果希望在参数解析阶段就完成合并,无需后续处理,可以自定义一个Action类:
import argparse class AppendFlatAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): # 获取当前参数已有的值,无则初始化为空列表 current = getattr(namespace, self.dest, []) # 将新传入的参数列表直接扩展到已有列表中 current.extend(values) setattr(namespace, self.dest, current) parser = argparse.ArgumentParser() # 使用自定义Action替代默认的append parser.add_argument('-i', action=AppendFlatAction, nargs='+') parser.add_argument('-o', action=AppendFlatAction, nargs='*') args = parser.parse_args()
方法对比
- 方法1:代码改动小,适合快速解决单个脚本的需求,无需额外类定义。
- 方法2:更优雅,解析阶段完成处理,适合需要在多个脚本复用该逻辑的场景。
内容的提问来源于stack exchange,提问作者Shezan
相关产品推荐
相关产品推荐

