Python如何通过argparse等工具将元组列表作为命令行参数传入
你遇到的报错是因为Shell中()属于特殊语法字符,不会直接作为参数传递给Python程序,以下是两种可直接复用的实现方案:
方案1:传入带引号的元组字符串,自定义解析函数
该方案贴合你原来的传参习惯,仅需对入参做简单解析:
- 先自定义元组解析函数,将传入的字符串格式元组转成Python可识别的元组类型
- 传参时给每个元组加单/双引号,规避Shell语法报错
完整修改后代码
import argparse def parse_pair(s): # 去掉字符串两端的括号,拆分数字后转成int元组 s = s.strip('()') return tuple(map(int, s.split(','))) def test(args): print("----") print(args.pairs) # 可直接按索引访问元素,例如下方打印第一个元组的第二个元素 print("测试访问元素:", args.pairs[0][1]) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--pairs', type=parse_pair, nargs='+') args = parser.parse_args() print("===args===") for arg in vars(args): print(arg, getattr(args, arg)) test(args)
执行命令
python test.py --pairs "(1,2)" "(2,4)" "(5,6)"
方案2:传入JSON格式字符串,一次性解析
如果元组数量多、结构复杂,更推荐用JSON格式传参,无需单独处理每个元组:
- 直接传入整个列表的JSON字符串,用
json.loads自动解析 - 按需将列表转成元组即可
完整修改后代码
import argparse import json def test(args): # 转成元组列表格式 args.pairs = [tuple(item) for item in args.pairs] print("----") print(args.pairs) print("测试访问元素:", args.pairs[0][1]) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--pairs', type=json.loads) args = parser.parse_args() print("===args===") for arg in vars(args): print(arg, getattr(args, arg)) test(args)
执行命令
python test.py --pairs '[[1,2],[2,4],[5,6]]'
内容的提问来源于stack exchange,提问作者OfLettersAndNumbers
相关产品推荐
相关产品推荐

