Issue #11174: Add argparse.MetavarTypeHelpFormatter, which uses type names

for the names of optional and positional arguments in help messages.
This commit is contained in:
Steven Bethard 2011-03-26 14:48:04 +01:00
parent 657bd0a25d
commit 0331e906d6
4 changed files with 89 additions and 14 deletions

View File

@ -356,13 +356,10 @@ formatter_class
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
:class:`ArgumentParser` objects allow the help formatting to be customized by :class:`ArgumentParser` objects allow the help formatting to be customized by
specifying an alternate formatting class. Currently, there are three such specifying an alternate formatting class.
classes: :class:`argparse.RawDescriptionHelpFormatter`,
:class:`argparse.RawTextHelpFormatter` and
:class:`argparse.ArgumentDefaultsHelpFormatter`. The first two allow more
control over how textual descriptions are displayed, while the last
automatically adds information about argument default values.
:class:`RawDescriptionHelpFormatter` and :class:`RawTextHelpFormatter` give
more control over how textual descriptions are displayed.
By default, :class:`ArgumentParser` objects line-wrap the description_ and By default, :class:`ArgumentParser` objects line-wrap the description_ and
epilog_ texts in command-line help messages:: epilog_ texts in command-line help messages::
@ -386,7 +383,7 @@ epilog_ texts in command-line help messages::
likewise for this epilog whose whitespace will be cleaned up and whose words likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines will be wrapped across a couple lines
Passing :class:`argparse.RawDescriptionHelpFormatter` as ``formatter_class=`` Passing :class:`RawDescriptionHelpFormatter` as ``formatter_class=``
indicates that description_ and epilog_ are already correctly formatted and indicates that description_ and epilog_ are already correctly formatted and
should not be line-wrapped:: should not be line-wrapped::
@ -412,11 +409,11 @@ should not be line-wrapped::
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
:class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text :class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text,
including argument descriptions. including argument descriptions.
The other formatter class available, :class:`ArgumentDefaultsHelpFormatter`, :class:`ArgumentDefaultsHelpFormatter` automatically adds information about
will add information about the default value of each of the arguments:: default values to each of the argument help messages::
>>> parser = argparse.ArgumentParser( >>> parser = argparse.ArgumentParser(
... prog='PROG', ... prog='PROG',
@ -433,6 +430,25 @@ will add information about the default value of each of the arguments::
-h, --help show this help message and exit -h, --help show this help message and exit
--foo FOO FOO! (default: 42) --foo FOO FOO! (default: 42)
:class:`MetavarTypeHelpFormatter` uses the name of the type_ argument for each
argument as as the display name for its values (rather than using the dest_
as the regular formatter does)::
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float
positional arguments:
float
optional arguments:
-h, --help show this help message and exit
--foo int
conflict_handler conflict_handler
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^

View File

@ -71,6 +71,7 @@ __all__ = [
'ArgumentDefaultsHelpFormatter', 'ArgumentDefaultsHelpFormatter',
'RawDescriptionHelpFormatter', 'RawDescriptionHelpFormatter',
'RawTextHelpFormatter', 'RawTextHelpFormatter',
'MetavarTypeHelpFormatter',
'Namespace', 'Namespace',
'Action', 'Action',
'ONE_OR_MORE', 'ONE_OR_MORE',
@ -422,7 +423,8 @@ class HelpFormatter(object):
# produce all arg strings # produce all arg strings
elif not action.option_strings: elif not action.option_strings:
part = self._format_args(action, action.dest) default = self._get_default_metavar_for_positional(action)
part = self._format_args(action, default)
# if it's in a group, strip the outer [] # if it's in a group, strip the outer []
if action in group_actions: if action in group_actions:
@ -444,7 +446,7 @@ class HelpFormatter(object):
# if the Optional takes a value, format is: # if the Optional takes a value, format is:
# -s ARGS or --long ARGS # -s ARGS or --long ARGS
else: else:
default = action.dest.upper() default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default) args_string = self._format_args(action, default)
part = '%s %s' % (option_string, args_string) part = '%s %s' % (option_string, args_string)
@ -530,7 +532,8 @@ class HelpFormatter(object):
def _format_action_invocation(self, action): def _format_action_invocation(self, action):
if not action.option_strings: if not action.option_strings:
metavar, = self._metavar_formatter(action, action.dest)(1) default = self._get_default_metavar_for_positional(action)
metavar, = self._metavar_formatter(action, default)(1)
return metavar return metavar
else: else:
@ -544,7 +547,7 @@ class HelpFormatter(object):
# if the Optional takes a value, format is: # if the Optional takes a value, format is:
# -s ARGS, --long ARGS # -s ARGS, --long ARGS
else: else:
default = action.dest.upper() default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default) args_string = self._format_args(action, default)
for option_string in action.option_strings: for option_string in action.option_strings:
parts.append('%s %s' % (option_string, args_string)) parts.append('%s %s' % (option_string, args_string))
@ -622,6 +625,12 @@ class HelpFormatter(object):
def _get_help_string(self, action): def _get_help_string(self, action):
return action.help return action.help
def _get_default_metavar_for_optional(self, action):
return action.dest.upper()
def _get_default_metavar_for_positional(self, action):
return action.dest
class RawDescriptionHelpFormatter(HelpFormatter): class RawDescriptionHelpFormatter(HelpFormatter):
"""Help message formatter which retains any formatting in descriptions. """Help message formatter which retains any formatting in descriptions.
@ -662,6 +671,22 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter):
return help return help
class MetavarTypeHelpFormatter(HelpFormatter):
"""Help message formatter which uses the argument 'type' as the default
metavar value (instead of the argument 'dest')
Only the name of this class is considered a public API. All the methods
provided by the class are considered an implementation detail.
"""
def _get_default_metavar_for_optional(self, action):
return action.type.__name__
def _get_default_metavar_for_positional(self, action):
return action.type.__name__
# ===================== # =====================
# Options and Arguments # Options and Arguments
# ===================== # =====================

View File

@ -3940,6 +3940,37 @@ class TestHelpVersionAction(HelpTestCase):
''' '''
version = '' version = ''
class TestHelpMetavarTypeFormatter(HelpTestCase):
""""""
def custom_type(string):
return string
parser_signature = Sig(prog='PROG', description='description',
formatter_class=argparse.MetavarTypeHelpFormatter)
argument_signatures = [Sig('a', type=int),
Sig('-b', type=custom_type),
Sig('-c', type=float, metavar='SOME FLOAT')]
argument_group_signatures = []
usage = '''\
usage: PROG [-h] [-b custom_type] [-c SOME FLOAT] int
'''
help = usage + '''\
description
positional arguments:
int
optional arguments:
-h, --help show this help message and exit
-b custom_type
-c SOME FLOAT
'''
version = ''
# ===================================== # =====================================
# Optional/Positional constructor tests # Optional/Positional constructor tests
# ===================================== # =====================================

View File

@ -291,6 +291,9 @@ Library
- Issue #11388: Added a clear() method to MutableSequence - Issue #11388: Added a clear() method to MutableSequence
- Issue #11174: Add argparse.MetavarTypeHelpFormatter, which uses type names
for the names of optional and positional arguments in help messages.
Build Build
----- -----