mirror of
https://github.com/python/cpython.git
synced 2024-11-24 02:15:30 +08:00
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:
parent
657bd0a25d
commit
0331e906d6
@ -356,13 +356,10 @@ formatter_class
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
:class:`ArgumentParser` objects allow the help formatting to be customized by
|
||||
specifying an alternate formatting class. Currently, there are three such
|
||||
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.
|
||||
specifying an alternate formatting class.
|
||||
|
||||
:class:`RawDescriptionHelpFormatter` and :class:`RawTextHelpFormatter` give
|
||||
more control over how textual descriptions are displayed.
|
||||
By default, :class:`ArgumentParser` objects line-wrap the description_ and
|
||||
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
|
||||
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
|
||||
should not be line-wrapped::
|
||||
|
||||
@ -412,11 +409,11 @@ should not be line-wrapped::
|
||||
optional arguments:
|
||||
-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.
|
||||
|
||||
The other formatter class available, :class:`ArgumentDefaultsHelpFormatter`,
|
||||
will add information about the default value of each of the arguments::
|
||||
:class:`ArgumentDefaultsHelpFormatter` automatically adds information about
|
||||
default values to each of the argument help messages::
|
||||
|
||||
>>> parser = argparse.ArgumentParser(
|
||||
... 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
|
||||
--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
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
@ -71,6 +71,7 @@ __all__ = [
|
||||
'ArgumentDefaultsHelpFormatter',
|
||||
'RawDescriptionHelpFormatter',
|
||||
'RawTextHelpFormatter',
|
||||
'MetavarTypeHelpFormatter',
|
||||
'Namespace',
|
||||
'Action',
|
||||
'ONE_OR_MORE',
|
||||
@ -422,7 +423,8 @@ class HelpFormatter(object):
|
||||
|
||||
# produce all arg 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 action in group_actions:
|
||||
@ -444,7 +446,7 @@ class HelpFormatter(object):
|
||||
# if the Optional takes a value, format is:
|
||||
# -s ARGS or --long ARGS
|
||||
else:
|
||||
default = action.dest.upper()
|
||||
default = self._get_default_metavar_for_optional(action)
|
||||
args_string = self._format_args(action, default)
|
||||
part = '%s %s' % (option_string, args_string)
|
||||
|
||||
@ -530,7 +532,8 @@ class HelpFormatter(object):
|
||||
|
||||
def _format_action_invocation(self, action):
|
||||
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
|
||||
|
||||
else:
|
||||
@ -544,7 +547,7 @@ class HelpFormatter(object):
|
||||
# if the Optional takes a value, format is:
|
||||
# -s ARGS, --long ARGS
|
||||
else:
|
||||
default = action.dest.upper()
|
||||
default = self._get_default_metavar_for_optional(action)
|
||||
args_string = self._format_args(action, default)
|
||||
for option_string in action.option_strings:
|
||||
parts.append('%s %s' % (option_string, args_string))
|
||||
@ -622,6 +625,12 @@ class HelpFormatter(object):
|
||||
def _get_help_string(self, action):
|
||||
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):
|
||||
"""Help message formatter which retains any formatting in descriptions.
|
||||
@ -662,6 +671,22 @@ class ArgumentDefaultsHelpFormatter(HelpFormatter):
|
||||
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
|
||||
# =====================
|
||||
|
@ -3940,6 +3940,37 @@ class TestHelpVersionAction(HelpTestCase):
|
||||
'''
|
||||
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
|
||||
# =====================================
|
||||
|
Loading…
Reference in New Issue
Block a user