我希望能够使用 argparse.ArgumentParser 对象中的全局选项来覆盖/增加子命令的默认值。
一个示例是显示的帮助反映了全局更新,即,对于以下玩具示例:
import argparse
import os
import sys
# Global parser and options.
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--user",
dest="user",
default=os.environ.get("USER"),
help="Override the setting of the $USER variable.")
# Sub-command parser and options.
subparsers = parser.add_subparsers()
command = subparsers.add_parser(
"command",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
command.add_argument("--config",
dest="config",
default="~%s/config" % os.environ.get("USER"),
help="The config file.")
options = parser.parse_args()
理想情况下,当我在帮助模式下运行它时,我会得到,
> python example.py --user thing command --help
usage: example.py command [-h] [--config CONFIG]
optional arguments:
-h, --help show this help message and exit
--config CONFIG The config file. (default: ~thing/config)
即,配置文件路径是用户特定的(事物)。我意识到我可以将默认配置更改为"~%(user)s/config"
,然后在运行时使用 options 命名空间解决这个问题,但是我希望帮助更明确。
我收集另一种解决方案是尝试解析参数一次以获得全局选项,即
if "--help" in sys.argv:
# Parse the command minus the help to obtain the global options.
args = sys.argv[1:]
args.remove("--help")
# Update the defaults with the global options.
options = parser.parse_args(args)
command.set_defaults(config="~%s/config" % options.user)
# Re-parse the options.
parser.parse_args()
虽然这看起来有点 hacky。有更好的方法/解决方案吗?