mirror of
https://github.com/python/cpython.git
synced 2024-11-24 10:24:35 +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
|
: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
|
||||||
^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^
|
||||||
|
@ -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
|
||||||
# =====================
|
# =====================
|
||||||
|
@ -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
|
||||||
# =====================================
|
# =====================================
|
||||||
|
@ -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
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user