| #!/usr/bin/env python3 | |
| import argparse | |
| class ActionStoreBool(argparse.Action): | |
| """Convert a string argument into a boolean. | |
| Use like this for a default off argument which can be turned on; | |
| >>> parser = argparse.ArgumentParser() | |
| >>> parser.add_argument( | |
| ... '--arg', action=ActionStoreBool, default=False) | |
| ActionStoreBool(['--arg'], False) | |
| >>> parser.parse_args([]).arg | |
| False | |
| >>> parser.parse_args(['--arg']).arg | |
| True | |
| >>> parser.parse_args(['--no-arg']).arg | |
| False | |
| >>> parser.parse_args(['--arg', 'yes']).arg | |
| True | |
| >>> parser.parse_args(['--arg', 'no']).arg | |
| False | |
| >>> | |
| Use like this for a default on argument which can be turned off; | |
| >>> parser = argparse.ArgumentParser() | |
| >>> parser.add_argument( | |
| ... '--arg', action=ActionStoreBool, default=True) | |
| ActionStoreBool(['--arg'], True) | |
| >>> parser.parse_args([]).arg | |
| True | |
| >>> parser.parse_args(['--arg']).arg | |
| True | |
| >>> parser.parse_args(['--no-arg']).arg | |
| False | |
| >>> parser.parse_args(['--arg', 'yes']).arg | |
| True | |
| >>> parser.parse_args(['--arg', 'no']).arg | |
| False | |
| >>> | |
| Converts the following (in can capitalization) to `True`: | |
| * yes | |
| * y | |
| * true | |
| * t | |
| * 1 | |
| Converts the following (in can capitalization) to `False`: | |
| * no | |
| * n | |
| * false | |
| * f | |
| * 0 | |
| """ | |
| def __init__( | |
| self, | |
| option_strings, | |
| dest, | |
| default=None, | |
| required=False, | |
| help=None, | |
| metavar=None | |
| ): | |
| self.orig_option_strings = option_strings | |
| new_option_strings = [] | |
| for s in option_strings: | |
| assert s.startswith("--"), s | |
| new_option_strings.append(s) | |
| new_option_strings.append("--no-" + s[2:]) | |
| argparse.Action.__init__( | |
| self, | |
| new_option_strings, | |
| dest=dest, | |
| nargs='?', | |
| const=[True], | |
| default=default, | |
| type=self.value, | |
| choices=None, | |
| required=required, | |
| help=help, | |
| metavar=metavar | |
| ) | |
| def value(self, s): | |
| if not s: | |
| return self.default | |
| elif s.lower() in ('yes', 'true', 't', 'y', '1'): | |
| return [True] | |
| elif s.lower() in ('no', 'false', 'f', 'n', '0'): | |
| return [False] | |
| else: | |
| raise argparse.ArgumentTypeError('Boolean value expected.') | |
| def __call__(self, parser, namespace, values, option_string=None): | |
| if len(values) == 0: | |
| values = [self.default] | |
| assert len(values) == 1 | |
| if option_string.startswith("--no"): | |
| values[0] = False | |
| setattr(namespace, self.dest, values[0]) | |
| def __repr__(self): | |
| return "ActionStoreBool({}, {})".format( | |
| self.orig_option_strings, self.default | |
| ) | |
| if __name__ == "__main__": | |
| import doctest | |
| failure_count, test_count = doctest.testmod() | |
| assert test_count > 0 | |
| assert failure_count == 0, "Doctests failed!" |