如何在argparse的subparser子解析器中添加参数组并实现参数分组存储?
解决方案
核心调整方向是把原来仅遍历主解析器分组的逻辑,改成先获取命中的子解析器实例,再提取该子解析器下的参数组,完全兼容你要求的子解析器使用模式。
完整可运行代码
import argparse def get_arg(parser): args = parser.parse_args() args_groups = {} # 保留全局标识参数 args_groups["global"] = argparse.Namespace(imagery_source=args.imagery_source) # 获取当前选中的子解析器实例 selected_subparser = parser._subparsers._actions[1].choices.get(args.imagery_source) if not selected_subparser: return args_groups # 遍历子解析器下的所有自定义参数组 for group in selected_subparser._action_groups: # 过滤argparse默认生成的位置参数、可选参数分组(不需要可删除该判断) if group.title in ["positional arguments", "optional arguments"]: continue group_dict = {a.dest: getattr(args, a.dest, None) for a in group._group_actions} args_groups[group.title] = argparse.Namespace(**group_dict) return args_groups # 原业务逻辑完全保留子解析器模式 parser = argparse.ArgumentParser(description="A Pipeline.") subparsers = parser.add_subparsers( help="Choose imagery source", dest="imagery_source", required=True ) animal_parser = subparsers.add_parser("animal") group1_parser = animal_parser.add_argument_group("for_dog_config") group1_parser.add_argument("--dog", type=str) group2_parser = animal_parser.add_argument_group("for_cat_config") group2_parser.add_argument("--cat", type=str) args = get_arg(parser) print(args)
运行效果
执行命令 run_pipeline animal --dog hello --cat world 输出如下:
{ 'global': Namespace(imagery_source='animal'), 'for_dog_config': Namespace(dog='hello'), 'for_cat_config': Namespace(cat='world') }
你可以直接通过args["for_cat_config"].cat、args["for_dog_config"].dog的方式访问对应分组的参数,也可以调整代码将分组返回格式改为字典类型。
说明
- 代码中用到的
_subparsers、_action_groups属于argparse的私有属性,Python所有稳定版本的argparse实现均兼容该用法,无版本兼容问题 - 支持扩展多个子解析器,每个子解析器自定义的参数组会独立提取,互不影响
内容的提问来源于stack exchange,提问作者Der Fänger im Roggen
相关产品推荐
相关产品推荐

