diff options
author | Rémi Lapeyre <remi.lapeyre@henki.fr> | 2019-09-13 10:17:43 (GMT) |
---|---|---|
committer | Stéphane Wirtel <stephane@wirtel.be> | 2019-09-13 10:17:43 (GMT) |
commit | 6a517c674907c195660fa9178a7b561de49cc721 (patch) | |
tree | e13407fbb1f8cdf1d38f3c04118de5fad01c1039 /Lib/argparse.py | |
parent | 04f0bbfbedf8d2bb69b012f853de6648b1a9f27f (diff) | |
download | cpython-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.py | 47 |
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): |