如何使用argparse通过等号传递列表类型命令行参数
argparse 带前导短横线的多值列表参数=传参实现
官方基础列表传参用法
argparse原生支持通过nargs="+"配置接收多值列表参数,基础写法如下:
parser = argparse.ArgumentParser() parser.add_argument("--list", nargs="+", default=["a", "b"]) value = parser.parse_args()
Shell环境下通过空格分隔参数值即可传参,执行命令python3 example.py --list a b c,可得到解析结果['a', 'b', 'c']。
带前导短横线的参数传参限制
如果列表元素本身带有前导短横线,直接用空格分隔传参会被argparse误识别为独立选项。此时用=连接参数名和单个参数值可以避免识别错误,执行python3 example.py --list=-a可正常得到解析结果['-a']。
但原生nargs="+"配置不支持通过=语法传入多个值,无法实现执行python3 example.py --list=-a,-b时得到['-a','-b']的解析效果。
具体实现方案
通过自定义参数类型转换逻辑,即可支持=连接逗号分隔多值的传参方式,同时兼容带前导短横线的参数值。
仅支持=连接逗号分隔传参的最简实现
import argparse def split_comma_list(input_str): return [item.strip() for item in input_str.split(',') if item.strip()] parser = argparse.ArgumentParser() parser.add_argument("--list", type=split_comma_list, default=["a", "b"]) args = parser.parse_args()
执行python3 example.py --list=-a,-b,即可得到预期解析结果['-a', '-b']。
兼容原生空格分隔传参的扩展实现
如果需要同时保留原生空格分隔多值的传参能力,可追加nargs="+"配置,调整转换逻辑兼容两种传参格式:
import argparse def split_comma_list(input_val): item_list = [] # 兼容nargs传入的多值列表、单值字符串两种输入格式 if not isinstance(input_val, list): input_val = [input_val] for val in input_val: item_list.extend([item.strip() for item in val.split(',') if item.strip()]) return item_list parser = argparse.ArgumentParser() parser.add_argument("--list", type=split_comma_list, nargs="+", default=["a", "b"]) args = parser.parse_args()
该写法支持三种传参格式:
- 原生空格分隔:执行
python3 example.py --list a b c,解析结果为['a', 'b', 'c'] - =连接逗号分隔带短横线参数:执行
python3 example.py --list=-a,-b,解析结果为['-a', '-b'] - 混合格式传参:执行
python3 example.py --list x,-y z,解析结果为['x', '-y', 'z']
内容的提问来源于stack exchange,提问作者Gunner Stone
相关产品推荐
相关产品推荐

