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"
し、オプションの名前空間を使用して実行時にこれを解決できることを認識していますが、ヘルプをより明確にしたいと考えています。
別の解決策は、引数を一度解析してグローバルオプションを取得することです。つまり、
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()
これはややハッキーに思えますが。より良いアプローチ/ソリューションはありますか?