说我有这个:
parser.add_argument('--num_nodes', type=int, default=3)
解析命令行后,如果args.num_nodes
为3,我想知道它是否得到该值,因为用户在命令行中指定了--num_nodes 3
,或者因为标志不是&# 39; t指定。
有办法吗?
(我知道基于"特殊"默认值(例如-1或None
)的方法,并更改为实际默认值(例如3)如果检测到特殊值,则在代码中。我更喜欢避免这种方法,因此 real 默认值不会隐藏在内部。)
答案 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 ='*'或'?'的位置,在测试它们是否被“看到”时需要一些特殊处理。)