有没有办法确定在设置有意义的默认值时是否在命令行中指定了参数?

时间:2014-12-09 12:53:15

标签: python argparse

说我有这个:

parser.add_argument('--num_nodes', type=int, default=3)

解析命令行后,如果args.num_nodes为3,我想知道它是否得到该值,因为用户在命令行中指定了--num_nodes 3,或者因为标志不是&# 39; t指定。

有办法吗?

(我知道基于"特殊"默认值(例如-1或None)的方法,并更改为实际默认值(例如3)如果检测到特殊值,则在代码中。我更喜欢避免这种方法,因此 real 默认值不会隐藏在内部。)

1 个答案:

答案 0 :(得分:2)

内部parse_args在变量seen_actions中跟踪此信息。这是已经看到的set个动作。它使用它来测试所需的参数。您可以在parser._parse_known_args方法(argparse.py文件)的末尾附近看到此操作。但这是一个私有方法和变量,因此用户无法直接访问。

http://bugs.python.org/issue11588探索提供一个可以访问此变量的钩子。它可以用来测试各种参数组合的出现。

解决此问题的方法:

  • 修改您自己的argparse.py副本以访问seen_actions

  • sys.argv[1:]搜索相关的参数标记。它不会处理缩写和-f可能发生的各种方式,但除此之外它是一种简单的方法。

  • 暂时将该参数设置为required并捕获missing option错误。如果你愿意,我可以详细说明。

  • 按照你的建议摆弄默认值。

  • 正如Ikke建议的那样,一个自定义动作设置一个发生标志。如果未看到该操作,则不会设置该标志。此标志可以位于命名空间中,也可以位于全局变量中。

(带有nargs ='*'或'?'的位置,在测试它们是否被“看到”时需要一些特殊处理。)