如何区分argparse中参数值来自默认还是命令行指定?
判断argparse参数是默认值还是用户指定值
要区分args.foo是来自默认设置的"bar"还是用户通过命令行指定(哪怕用户指定的值和默认值相同),同时保留帮助文档的默认值显示,可通过自定义argparse.Action实现参数追踪:
实现步骤
- 自定义一个
TrackedAction类,继承自argparse.Action,在参数被用户指定时标记一个对应的状态属性。 - 添加参数时使用这个自定义action,同时正常设置
default值,确保帮助文档能显示默认值。 - 解析参数后,通过状态属性判断参数来源。
完整代码示例
import argparse class TrackedAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): # 设置参数的实际值 setattr(namespace, self.dest, values) # 标记该参数已被用户主动指定 setattr(namespace, f"{self.dest}_specified", True) # 初始化解析器,保留默认值显示格式 parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) # 使用自定义action添加参数,正常设置默认值 parser.add_argument("--foo", type=str, default="bar", help="参数描述", action=TrackedAction) args = parser.parse_args() # 初始化未指定参数的状态为False if not hasattr(args, "foo_specified"): setattr(args, "foo_specified", False) # 判断并输出参数来源 if args.foo_specified: print(f"foo 来自用户指定:{args.foo}") else: print("foo 使用默认值:bar")
效果验证
- 直接运行
python myprogram.py:输出foo 使用默认值:bar,帮助文档显示--foo FOO 参数描述 (default: bar) - 运行
python myprogram.py --foo bar:输出foo 来自用户指定:bar - 运行
python myprogram.py --foo custom:输出foo 来自用户指定:custom
内容的提问来源于stack exchange,提问作者Tom de Geus
相关产品推荐
相关产品推荐

