gpt4 book ai didi

python - argparse 通过全局选项增加子命令默认值

转载 作者:太空狗 更新时间:2023-10-30 01:16:37 25 4
gpt4 key购买 nike

我希望能够使用 argparse.ArgumentParser 对象的全局选项来覆盖/增加子命令的默认值。

一个示例是显示的帮助反射(reflect)了全局更新,即对于以下玩具示例:

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" 然后在运行时使用选项命名空间解决这个问题,但是我希望帮助更多明确的。

我收集到一个替代解决方案是尝试解析一次参数以获得全局选项,即

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()

虽然这看起来有点老套。有没有更好的方法/解决方案?

最佳答案

在定义全局选项之后,但在定义子命令之前,调用 parse_known_args 来找出 --user 的值是什么。然后,完成定义子解析器命令,使用 --user 的值定义 --config 的默认值,之前调用 parse_args 解析命令行上的所有选项。

这与您的替代方案略有不同,但它将所有命令行处理保留在 argparse 对象中。

(我稍微精简了您的代码以缩短此答案。)

import os
import argparse

# Global preparser and options.
preparser = argparse.ArgumentParser(add_help=False)
preparser.add_argument("--user", dest="user", default=os.environ.get("USER"))

# ****** NEW *******
options, _ = preparser.parse_known_args() # Ignore what we haven't defined yet
user = options.user # Use this to define the default of --config

parser = argparse.ArgumentParser(parents=[ preparser ], add_help=True,
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Sub-command parser and options.
subparsers = parser.add_subparsers()

command = subparsers.add_parser("command")

# ****** MODIFIED *******
command.add_argument("--config", dest="config", default="~%s/config" % (user,))

options = parser.parse_args()

关于python - argparse 通过全局选项增加子命令默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com