能否在argparse中用argument=value语法结合nargs="+"接收列表输入?
解决argparse中nargs='+'兼容两种参数输入格式的问题
当使用argparse定义参数时,若设置nargs='+':
parser.add_argument('--arg', nargs='+')
可以正常解析--arg 1 2 3格式的输入,得到列表['1', '2', '3'],但若想同时兼容--arg=1,2,3的等号+逗号分隔格式,直接使用默认配置会遇到问题:
--arg=1 2 3会被解析为arg='1',而2、3会被视为未识别的独立参数--arg=1,2,3会得到单元素列表['1,2,3'],无法直接转为整数列表
如果不想放弃空格分隔的用法,同时希望利用argparse的类型转换能力(比如自动转为整数),可以通过自定义Action类实现兼容:
实现代码
import argparse class IntListAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): int_list = [] for val in values: # 对每个输入值尝试按逗号分割后转整数 int_list.extend(map(int, val.split(','))) setattr(namespace, self.dest, int_list) # 使用自定义Action定义参数 parser = argparse.ArgumentParser() parser.add_argument('--arg', action=IntListAction, nargs='+') # 测试不同输入格式 print(parser.parse_args(['--arg', '1', '2', '3'])) # 输出:Namespace(arg=[1, 2, 3]) print(parser.parse_args(['--arg=1,2,3'])) # 输出:Namespace(arg=[1, 2, 3]) print(parser.parse_args(['--arg', '4,5', '6'])) # 输出:Namespace(arg=[4, 5, 6])
原理说明
- 自定义的
IntListAction会处理所有传入的参数值:- 对于空格分隔的单个值(如
1、2),按逗号分割后仍是单个元素,直接转整数加入列表 - 对于逗号分隔的字符串(如
1,2,3),分割后批量转整数加入列表
- 对于空格分隔的单个值(如
- 保留
nargs='+'确保至少传入一个参数,符合原有的参数校验逻辑
这样既兼容了两种输入格式,又让argparse自动完成整数转换,无需额外的自定义分割逻辑。
内容的提问来源于stack exchange,提问作者Spycho
相关产品推荐
相关产品推荐

