| #!/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!" |