如何配置Argparse:必填参数+未传-m时从JSON取默认值
解决Argparse参数配置与JSON默认值读取问题
1. 调整Argparse参数必填性
先修改原有Argparse代码,将-x、-s、-e设为必填参数,-m保持可选:
import argparse import json import os parser = argparse.ArgumentParser() parser.add_argument('-x', dest='shops', metavar='SHOP', type=str, nargs='+', required=True, help='要处理的店铺名称(例如 "abc_m")') parser.add_argument('-s', '--start', dest='start', required=True, metavar='START', type=str, help='起始日期,格式为YYYYMMDD的整数形式') parser.add_argument('-e', '--end', dest='end', metavar='END', type=str, required=True, help='结束日期,格式为YYYYMMDD的整数形式') parser.add_argument('-m', '--memory', dest='memory', metavar='MEMORY', type=int, required=False, default=None, help='内存分配大小(MB)') args = parser.parse_args()
2. 验证店铺对应的JSON文件有效性
遍历-x传入的每个店铺名称,检查/opt目录下是否存在同名JSON文件,若不存在则直接终止程序:
shop_configs = {} for shop in args.shops: config_path = f'/opt/{shop}.json' if not os.path.exists(config_path): print(f"错误:店铺 {shop} 对应的配置文件 {config_path} 不存在") exit(1) # 读取并解析JSON文件 with open(config_path, 'r') as f: try: config = json.load(f) except json.JSONDecodeError: print(f"错误:店铺 {shop} 的配置文件 {config_path} 格式无效") exit(1) shop_configs[shop] = config
3. 处理-m参数的默认值逻辑
如果用户未传入-m参数,就从每个店铺的JSON配置中读取memory值(注意需要去除JSON里的单引号并转成整数);如果传入了-m,则统一使用该值:
# 处理memory参数 if args.memory is None: # 为每个店铺设置默认memory值 for shop, config in shop_configs.items(): if 'memory' not in config: print(f"错误:店铺 {shop} 的配置文件中缺少memory字段") exit(1) # 去除memory值的单引号并转成整数 try: default_memory = int(config['memory'].strip("'")) shop_configs[shop]['memory'] = default_memory except ValueError: print(f"错误:店铺 {shop} 的memory值 {config['memory']} 无法转成整数") exit(1) else: # 使用用户传入的memory值覆盖所有店铺配置 for shop in shop_configs: shop_configs[shop]['memory'] = args.memory
完整代码示例
将上述部分整合起来,完整的脚本代码如下:
import argparse import json import os def main(): parser = argparse.ArgumentParser() parser.add_argument('-x', dest='shops', metavar='SHOP', type=str, nargs='+', required=True, help='要处理的店铺名称(例如 "abc_m")') parser.add_argument('-s', '--start', dest='start', required=True, metavar='START', type=str, help='起始日期,格式为YYYYMMDD的整数形式') parser.add_argument('-e', '--end', dest='end', metavar='END', type=str, required=True, help='结束日期,格式为YYYYMMDD的整数形式') parser.add_argument('-m', '--memory', dest='memory', metavar='MEMORY', type=int, required=False, default=None, help='内存分配大小(MB)') args = parser.parse_args() # 验证并读取店铺配置文件 shop_configs = {} for shop in args.shops: config_path = f'/opt/{shop}.json' if not os.path.exists(config_path): print(f"错误:店铺 {shop} 对应的配置文件 {config_path} 不存在") exit(1) try: with open(config_path, 'r') as f: config = json.load(f) except json.JSONDecodeError: print(f"错误:店铺 {shop} 的配置文件 {config_path} 格式无效") exit(1) shop_configs[shop] = config # 处理memory参数逻辑 if args.memory is None: for shop, config in shop_configs.items(): if 'memory' not in config: print(f"错误:店铺 {shop} 的配置文件中缺少memory字段") exit(1) try: config['memory'] = int(config['memory'].strip("'")) except ValueError: print(f"错误:店铺 {shop} 的memory值 {config['memory']} 不是有效整数") exit(1) else: for shop in shop_configs: shop_configs[shop]['memory'] = args.memory # 后续业务逻辑可以使用 args.start、args.end 和 shop_configs print("参数验证完成,配置信息:") print(f"起始日期: {args.start}") print(f"结束日期: {args.end}") for shop, config in shop_configs.items(): print(f"店铺 {shop}: {config}") if __name__ == '__main__': main()
关键说明
- 必填参数设置:通过
required=True标记-x、-s、-e为必填,Argparse会自动在用户未传入时提示错误并退出。 - 文件有效性检查:使用
os.path.exists验证配置文件存在性,同时捕获JSONDecodeError确保文件格式正确。 - JSON值处理:针对示例JSON中
memory字段带单引号的情况,使用strip("'")去除后转成整数,避免类型转换错误。
内容的提问来源于stack exchange,提问作者iamsage
相关产品推荐
相关产品推荐

