You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:21