Wrapper-Klasse
Dies ist die zuverlässigste und DRY Ansatz , den ich bisher auf beide zeigen Standardwerte gefunden haben und eine andere Formatierer so verwenden , wie argparse.RawTextHelpFormatter
zur gleichen Zeit:
#!/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())
Ausgabe:
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
Mehrfachvererbung
Mehrfachvererbung funktioniert nur, scheint aber keine öffentliche API zu sein:
#!/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()
Ausgabe:
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)
Es funktioniert einfach, weil, wie wir aus den Quellen https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648 trivial sehen können, dass:
RawTextHelpFormatter
Geräte _split_lines
ArgumentDefaultsHelpFormatter
Geräte _get_help_string
Wir können also davon ausgehen, dass sie gut zusammenarbeiten werden.
Dies scheint jedoch keine öffentliche API zu sein, und die Methoden formatter_class
auch nicht. Daher glaube ich nicht, dass es derzeit eine öffentliche API-Methode gibt, um dies zu tun. argparse
docstring sagt:
Alle anderen Klassen in diesem Modul werden als Implementierungsdetails betrachtet. (Beachten Sie auch, dass HelpFormatter und RawDescriptionHelpFormatter nur als Objektnamen als öffentlich betrachtet werden. Die API der Formatierungsobjekte wird weiterhin als Implementierungsdetail betrachtet.)
Siehe auch: Argparse-Hilfemeldung anpassen
Getestet auf Python 3.6.5.