如何使用argparse将JSON文件转换为可调用的解析器格式?
解决方法
你不需要用ArgumentParser实例来存储配置——它是用来解析命令行参数的,而你要的是把JSON数据转成可以用点语法访问的对象,直接用argparse.Namespace就够了。
正确代码示例
import json from argparse import Namespace with open("model_args.json", 'r') as f: model_json = json.load(f) # 将JSON字典转换为Namespace对象,直接支持点语法访问 model_args = Namespace(**model_json) # 测试访问 print(model_args.model_name_or_path) # 输出: microsoft/layoutlmv3-base print(model_args.tokenizer_name) # 输出: None print(model_args.use_auth_token) # 输出: False
为什么原有代码不对?
你创建的model_args = argparse.ArgumentParser()是参数解析器对象,不是存储参数的容器。真正用来存参数的是Namespace类——它就是argparse解析命令行后返回的对象类型,刚好适配你用点语法访问配置的需求。
(可选)结合命令行参数+JSON配置
如果你需要同时支持命令行传参和JSON配置(比如命令行参数优先级更高),可以这么做:
import json import argparse # 先定义和JSON键对应的命令行参数 parser = argparse.ArgumentParser() parser.add_argument("--model_name_or_path", default="default-model") parser.add_argument("--config_name", default=None) parser.add_argument("--tokenizer_name", default=None) parser.add_argument("--cache_dir", default=None) parser.add_argument("--model_revision", default="main") parser.add_argument("--use_auth_token", action="store_true") # 解析命令行参数 args = parser.parse_args() # 加载JSON配置,只覆盖命令行未指定的参数 with open("model_args.json", 'r') as f: model_json = json.load(f) for key, value in model_json.items(): if getattr(args, key) == parser.get_default(key): setattr(args, key, value) # 现在args同时包含命令行参数和JSON配置 print(args.model_name_or_path)
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

