次のargparseスニペットがあるとします:
diags.cmdln_parser.add_argument( '--scan-time',
action = 'store',
nargs = '?',
type = int,
default = 5,
help = "Wait SCAN-TIME seconds between status checks.")
現在、--help
は以下を返します。
usage: connection_check.py [-h]
[--version] [--scan-time [SCAN_TIME]]
Test the reliability/uptime of a connection.
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
私は次のようなものを好むでしょう:
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(Default = 5)
ヘルプフォーマッタコードを覗いてみると、限られたオプションが明らかになりました。 argparse
を取得して--scan-time
のデフォルト値を同様の方法で出力する賢い方法はありますか、それともhelp
フォーマッターをサブクラス化するだけですか?
argparse.ArgumentDefaultsHelpFormatter
formatter を使用します。
parser = argparse.ArgumentParser(
# ... other options ...
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
ドキュメントを引用するには:
使用可能な他のフォーマッタクラス
ArgumentDefaultsHelpFormatter
は、各引数のデフォルト値に関する情報を追加します。
これは、ヘルプテキストが定義されている引数にのみ適用されることに注意してください;引数にhelp
値がない場合、toに情報を追加する必要はありません。
スキャン時間オプションの正確な出力は次のようになります。
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(default: 5)
'%(default)'
をヘルプパラメータに追加して、表示される内容を制御します。
parser.add_argument("--type", default="toto", choices=["toto","titi"],
help = "type (default: %(default)s)")
ラッパークラス
これは最も信頼性が高く、DRYアプローチであり、これまでにデフォルトを表示し、argparse.RawTextHelpFormatter
などの別のフォーマッターを同時に使用することがわかっています。
#!/usr/bin/env python3
import argparse
class ArgumentParserWithDefaults(argparse.ArgumentParser):
def add_argument(self, *args, help=None, default=None, **kwargs):
if help is not None:
kwargs['help'] = help
if default is not None and args[0] != '-h':
kwargs['default'] = default
if help is not None:
kwargs['help'] += ' Default: {}'.format(default)
super().add_argument(*args, **kwargs)
parser = ArgumentParserWithDefaults(
formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.add_argument('--no-default', help='''my help
for no-default''')
parser.add_argument('--no-help', default=101)
parser.print_help()
print()
print(parser.parse_args())
出力:
usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
[--no-help NO_HELP]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a Default: 13
-b B my help
for b Default: 42
--no-default NO_DEFAULT
my help
for no-default
--no-help NO_HELP
Namespace(a=13, b=42, no_default=None, no_help=101)
ArgumentDefaultsHelpFormatter
+ RawTextHelpFormatter
多重継承
多重継承は機能しますが、パブリックAPIではないようです:
#!/usr/bin/env python3
import argparse
class RawTextArgumentDefaultsHelpFormatter(
argparse.ArgumentDefaultsHelpFormatter,
argparse.RawTextHelpFormatter
):
pass
parser = argparse.ArgumentParser(
formatter_class=RawTextArgumentDefaultsHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.print_help()
出力:
usage: a.py [-h] [-a A] [-b B]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a (default: 13)
-b B my help
for b (default: 42)
ソースから些細なことを見ることができるので、それはただ動作します https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 それ:
RawTextHelpFormatter
は_split_lines
を実装しますArgumentDefaultsHelpFormatter
は_get_help_string
を実装しますそのため、これらがうまく機能すると推測できます。
ただし、これはパブリックAPIではないようで、formatter_class
のメソッドでもないため、現在、パブリックAPIを使用する方法はないと思います。 argparse
docstringのコメント:
このモジュールの他のすべてのクラスは、実装の詳細と見なされます。 (HelpFormatterとRawDescriptionHelpFormatterはオブジェクト名としてのみパブリックと見なされることに注意してください。フォーマッタオブジェクトのAPIは依然として実装の詳細と見なされます。)
Python 3.6.5でテスト済み。