argparse场景下如何将先输入的参数值自动应用到后续参数配置
问题解答
首先可以明确:你说的参数联动需求可以实现。argparse本身在定义参数的阶段不会自动传递前序参数的取值到后续参数的默认值逻辑里,但是我们可以在完成所有参数解析之后,手动对参数值做二次处理,完全满足需求。
推荐实现方案
直接在parser.parse_args()拿到参数对象后拼接路径即可,推荐用Python标准库的路径处理工具自动兼容跨平台的路径分隔符问题,不需要手动处理斜杠。
使用os.path.join实现(兼容所有Python版本)
from argparse import ArgumentParser import os def get_args(): parser = ArgumentParser(description="Data Generator") parser.add_argument('--name', required=True, type=str, help='Pick one: x, y, z') parser.add_argument('--save_path', type=str, default='C:/Users/User1/Desktop/', help='The save path') args = parser.parse_args() # 自动将name追加到save_path末尾,自动处理路径末尾的分隔符问题 args.save_path = os.path.join(args.save_path, args.name) return args
使用pathlib实现(Python 3.4+ 更简洁)
from argparse import ArgumentParser from pathlib import Path def get_args(): parser = ArgumentParser(description="Data Generator") parser.add_argument('--name', required=True, type=str, help='Pick one: x, y, z') parser.add_argument('--save_path', type=str, default='C:/Users/User1/Desktop/', help='The save path') args = parser.parse_args() # 拼接后得到Path对象,可直接调用mkdir、exists等方法操作路径 args.save_path = Path(args.save_path) / args.name return args
不推荐的方案说明
你也可以通过自定义argparse的Action类把拼接逻辑放到参数定义阶段,但这种方式的执行顺序和用户传入命令行参数的顺序挂钩,如果用户先传--save_path再传--name,就会出现处理save_path时还没拿到name值的问题,稳定性和可读性都不如上面的解析后处理方案,因此不推荐。
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

