summaryrefslogtreecommitdiffstats
path: root/Lib/argparse.py
diff options
context:
space:
mode:
authorRémi Lapeyre <remi.lapeyre@henki.fr>2019-09-13 10:17:43 (GMT)
committerStéphane Wirtel <stephane@wirtel.be>2019-09-13 10:17:43 (GMT)
commit6a517c674907c195660fa9178a7b561de49cc721 (patch)
treee13407fbb1f8cdf1d38f3c04118de5fad01c1039 /Lib/argparse.py
parent04f0bbfbedf8d2bb69b012f853de6648b1a9f27f (diff)
downloadcpython-6a517c674907c195660fa9178a7b561de49cc721.zip
cpython-6a517c674907c195660fa9178a7b561de49cc721.tar.gz
cpython-6a517c674907c195660fa9178a7b561de49cc721.tar.bz2
bpo-8538: Add support for boolean actions to argparse (GH-11478)
Co-Authored-By: remilapeyre <remi.lapeyre@henki.fr>
Diffstat (limited to 'Lib/argparse.py')
-rw-r--r--Lib/argparse.py47
1 files changed, 46 insertions, 1 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 370692b..13af7ac 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -67,6 +67,7 @@ __all__ = [
'ArgumentParser',
'ArgumentError',
'ArgumentTypeError',
+ 'BooleanOptionalAction',
'FileType',
'HelpFormatter',
'ArgumentDefaultsHelpFormatter',
@@ -454,7 +455,7 @@ class HelpFormatter(object):
# if the Optional doesn't take a value, format is:
# -s or --long
if action.nargs == 0:
- part = '%s' % option_string
+ part = action.format_usage()
# if the Optional takes a value, format is:
# -s ARGS or --long ARGS
@@ -842,9 +843,53 @@ class Action(_AttributeHolder):
]
return [(name, getattr(self, name)) for name in names]
+ def format_usage(self):
+ return self.option_strings[0]
+
def __call__(self, parser, namespace, values, option_string=None):
raise NotImplementedError(_('.__call__() not defined'))
+class BooleanOptionalAction(Action):
+ def __init__(self,
+ option_strings,
+ dest,
+ const=None,
+ default=None,
+ type=None,
+ choices=None,
+ required=False,
+ help=None,
+ metavar=None):
+
+ _option_strings = []
+ for option_string in option_strings:
+ _option_strings.append(option_string)
+
+ if option_string.startswith('--'):
+ option_string = '--no-' + option_string[2:]
+ _option_strings.append(option_string)
+
+ if help is not None and default is not None:
+ help += f" (default: {default})"
+
+ super().__init__(
+ option_strings=_option_strings,
+ dest=dest,
+ nargs=0,
+ default=default,
+ type=type,
+ choices=choices,
+ required=required,
+ help=help,
+ metavar=metavar)
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ if option_string in self.option_strings:
+ setattr(namespace, self.dest, not option_string.startswith('--no-'))
+
+ def format_usage(self):
+ return ' | '.join(self.option_strings)
+
class _StoreAction(Action):