You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:08:34