From 8c1dd5276fa4a26415ccbd08d3a01b2dbd558687 Mon Sep 17 00:00:00 2001 From: Ben West Date: Fri, 23 Sep 2011 22:53:15 -0700 Subject: [PATCH 1/5] close, but not quite right --- argparse.py | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/argparse.py b/argparse.py index 3bdcd33..d5f2ce5 100644 --- a/argparse.py +++ b/argparse.py @@ -90,6 +90,9 @@ from gettext import gettext as _ +# XXX.bewest: remove +from pprint import pprint + try: set except NameError: @@ -123,6 +126,7 @@ def _callable(obj): ZERO_OR_MORE = '*' ONE_OR_MORE = '+' PARSER = 'A...' +_OPTIONAL_PARSER = 'A?..' REMAINDER = '...' _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' @@ -601,7 +605,7 @@ def _format_args(self, action, default_metavar): result = '%s [%s ...]' % get_metavar(2) elif action.nargs == REMAINDER: result = '...' - elif action.nargs == PARSER: + elif action.nargs in [ PARSER, _OPTIONAL_PARSER ]: result = '%s ...' % get_metavar(1) else: formats = ['%s' for _ in range(action.nargs)] @@ -1055,6 +1059,7 @@ def __init__(self, parser_class, dest=SUPPRESS, help=None, + default=None, metavar=None): self._prog_prefix = prog @@ -1062,10 +1067,15 @@ def __init__(self, self._name_parser_map = {} self._choices_actions = [] + nargs = PARSER + if default is not None: + nargs = _OPTIONAL_PARSER + super(_SubParsersAction, self).__init__( option_strings=option_strings, dest=dest, - nargs=PARSER, + nargs=nargs, + default=default, choices=self._name_parser_map, help=help, metavar=metavar) @@ -1097,6 +1107,7 @@ def __call__(self, parser, namespace, values, option_string=None): if self.dest is not SUPPRESS: setattr(namespace, self.dest, parser_name) + pprint(['select parser', vars( )]) # select the parser try: parser = self._name_parser_map[parser_name] @@ -1674,6 +1685,7 @@ def add_subparsers(self, **kwargs): # create the parsers action and add it to the positionals list parsers_class = self._pop_action_class(kwargs, 'parsers') action = parsers_class(option_strings=[], **kwargs) + pprint(['add subparsers', parsers_class, kwargs ]) self._subparsers._add_action(action) # return the created parsers action @@ -1792,6 +1804,8 @@ def take_action(action, argument_strings, option_string=None): seen_actions.add(action) argument_values = self._get_values(action, argument_strings) + pprint(['take action', action, argument_strings]) + # error if this argument is not allowed with other previously # seen arguments, assuming that actions that use the default # value don't really count as "present" @@ -1808,6 +1822,7 @@ def take_action(action, argument_strings, option_string=None): if argument_values is not SUPPRESS: action(self, namespace, argument_values, option_string) + pprint(['consume optionals']) # function to convert arg_strings into an optional action def consume_optional(start_index): @@ -1818,6 +1833,7 @@ def consume_optional(start_index): # identify additional optionals in the same arg string # (e.g. -xyz is the same as -x -y -z if no args are required) match_argument = self._match_argument + pprint(['consume optional', vars( )]) action_tuples = [] while True: @@ -1884,6 +1900,7 @@ def consume_optional(start_index): # the list of Positionals left to be parsed; this is modified # by consume_positionals() positionals = self._get_positional_actions() + pprint(['remaining positionals', positionals]) # function to convert arg_strings into positional actions def consume_positionals(start_index): @@ -1892,11 +1909,13 @@ def consume_positionals(start_index): selected_pattern = arg_strings_pattern[start_index:] arg_counts = match_partial(positionals, selected_pattern) + pprint(['consume positionals', vars( )]) # slice off the appropriate arg strings for each Positional # and add the Positional and its args to the list for action, arg_count in zip(positionals, arg_counts): args = arg_strings[start_index: start_index + arg_count] start_index += arg_count + pprint(['loop', action, arg_count ]) take_action(action, args) # slice off the Positionals that we just parsed and return the @@ -1938,6 +1957,7 @@ def consume_positionals(start_index): start_index = next_option_string_index # consume the next optional and any arguments for it + pprint('calling consume optionals') start_index = consume_optional(start_index) # consume any positionals following the last Optional @@ -2013,6 +2033,7 @@ def _match_argument(self, action, arg_strings_pattern): nargs_pattern = self._get_nargs_pattern(action) match = _re.match(nargs_pattern, arg_strings_pattern) + pprint(['match argument', nargs_pattern, match]) # raise an exception if we weren't able to find a match if match is None: nargs_errors = { @@ -2036,6 +2057,7 @@ def _match_arguments_partial(self, actions, arg_strings_pattern): pattern = ''.join([self._get_nargs_pattern(action) for action in actions_slice]) match = _re.match(pattern, arg_strings_pattern) + pprint(['match arguments partial', pattern, match]) if match is not None: result.extend([len(string) for string in match.groups()]) break @@ -2173,6 +2195,13 @@ def _get_nargs_pattern(self, action): elif nargs == PARSER: nargs_pattern = '(-*A[-AO]*)' + # allow one optional argument followed by any number of options or + # arguments + elif nargs == _OPTIONAL_PARSER: + # XXX.bewest: This doesn't quite work. + nargs_pattern = '(-*A?-[-AO]*)?' + nargs_pattern = '([-AO]*)' + # all others should be integers else: nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) @@ -2182,6 +2211,7 @@ def _get_nargs_pattern(self, action): nargs_pattern = nargs_pattern.replace('-*', '') nargs_pattern = nargs_pattern.replace('-', '') + print nargs_pattern, nargs # return the pattern return nargs_pattern @@ -2190,11 +2220,15 @@ def _get_nargs_pattern(self, action): # ======================== def _get_values(self, action, arg_strings): # for everything but PARSER args, strip out '--' - if action.nargs not in [PARSER, REMAINDER]: + #if action.nargs not in [PARSER, REMAINDER]: + if action.nargs not in [_OPTIONAL_PARSER, PARSER, REMAINDER]: arg_strings = [s for s in arg_strings if s != '--'] # optional argument produces a default when not present - if not arg_strings and action.nargs == OPTIONAL: + opt_types = [ OPTIONAL, _OPTIONAL_PARSER ] + pprint(['get values', action, arg_strings]) + #if not arg_strings and action.nargs == OPTIONAL: + if not arg_strings and action.nargs in opt_types: if action.option_strings: value = action.const else: @@ -2202,7 +2236,7 @@ def _get_values(self, action, arg_strings): if isinstance(value, basestring): value = self._get_value(action, value) self._check_value(action, value) - + pprint(['VALUE', value]) # when nargs='*' on a positional, if there were no command-line # args, use the default if it is anything other than None elif (not arg_strings and action.nargs == ZERO_OR_MORE and @@ -2224,7 +2258,7 @@ def _get_values(self, action, arg_strings): value = [self._get_value(action, v) for v in arg_strings] # PARSER arguments convert all values, but check only the first - elif action.nargs == PARSER: + elif action.nargs in [ PARSER, _OPTIONAL_PARSER ]: value = [self._get_value(action, v) for v in arg_strings] self._check_value(action, value[0]) From 352015a520b2e010f96e43e812742115d9ea79c4 Mon Sep 17 00:00:00 2001 From: Ben West Date: Fri, 23 Sep 2011 23:34:10 -0700 Subject: [PATCH 2/5] incorrect regexp There's a test in git@gist.github.com:1202975.git http://gist.github.com/1202975 * test_opt_subcommand.py * s.py That gives this error: bewest@ripen:~/Documents/git/gist/cli-hello$ python test_opt_subcommand.py -v test_optional_subcommand_behavior (__main__.TestSubparserDefaultFun) ... ['add subparsers', , {'default': 'qux', 'dest': 'command', 'help': 'some help on group A', 'parser_class': , 'prog': 'my program'}] ['consume optionals'] ['remaining positionals', [_SubParsersAction(option_strings=[], dest='command', nargs='A?..', const=None, default='qux', type=None, choices={'lux': ArgumentParser(prog='my program lux', usage=None, description='long desc of lux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'qux': ArgumentParser(prog='my program qux', usage=None, description='long desc of qux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'bux': ArgumentParser(prog='my program bux', usage=None, description='long desc of bux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'fux': ArgumentParser(prog='my program fux', usage=None, description='long desc of fux', version=None, formatter_class=, conflict_handler='error', add_help=True)}, help='some help on group A', metavar=None)]] ([-AO]*) A?.. ['match arguments partial', '([-AO]*)', <_sre.SRE_Match object at 0x93f34a0>] ['consume positionals', {'arg_counts': [0], 'arg_strings': [], 'arg_strings_pattern': '', 'match_partial': , conflict_handler='error', add_help=True)>, 'positionals': [_SubParsersAction(option_strings=[], dest='command', nargs='A?..', const=None, default='qux', type=None, choices={'lux': ArgumentParser(prog='my program lux', usage=None, description='long desc of lux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'qux': ArgumentParser(prog='my program qux', usage=None, description='long desc of qux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'bux': ArgumentParser(prog='my program bux', usage=None, description='long desc of bux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'fux': ArgumentParser(prog='my program fux', usage=None, description='long desc of fux', version=None, formatter_class=, conflict_handler='error', add_help=True)}, help='some help on group A', metavar=None)], 'selected_pattern': '', 'self': ArgumentParser(prog='test_opt_subcommand.py', usage=None, description=None, version=None, formatter_class=, conflict_handler='error', add_help=True), 'start_index': 0, 'take_action': }] ['loop', _SubParsersAction(option_strings=[], dest='command', nargs='A?..', const=None, default='qux', type=None, choices={'lux': ArgumentParser(prog='my program lux', usage=None, description='long desc of lux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'qux': ArgumentParser(prog='my program qux', usage=None, description='long desc of qux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'bux': ArgumentParser(prog='my program bux', usage=None, description='long desc of bux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'fux': ArgumentParser(prog='my program fux', usage=None, description='long desc of fux', version=None, formatter_class=, conflict_handler='error', add_help=True)}, help='some help on group A', metavar=None), 0] ['get values', _SubParsersAction(option_strings=[], dest='command', nargs='A?..', const=None, default='qux', type=None, choices={'lux': ArgumentParser(prog='my program lux', usage=None, description='long desc of lux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'qux': ArgumentParser(prog='my program qux', usage=None, description='long desc of qux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'bux': ArgumentParser(prog='my program bux', usage=None, description='long desc of bux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'fux': ArgumentParser(prog='my program fux', usage=None, description='long desc of fux', version=None, formatter_class=, conflict_handler='error', add_help=True)}, help='some help on group A', metavar=None), []] ['VALUE', 'qux'] ['take action', _SubParsersAction(option_strings=[], dest='command', nargs='A?..', const=None, default='qux', type=None, choices={'lux': ArgumentParser(prog='my program lux', usage=None, description='long desc of lux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'qux': ArgumentParser(prog='my program qux', usage=None, description='long desc of qux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'bux': ArgumentParser(prog='my program bux', usage=None, description='long desc of bux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'fux': ArgumentParser(prog='my program fux', usage=None, description='long desc of fux', version=None, formatter_class=, conflict_handler='error', add_help=True)}, help='some help on group A', metavar=None), []] ['select parser', {'arg_strings': 'ux', 'namespace': Namespace(command='q', debug=False), 'option_string': None, 'parser': ArgumentParser(prog='test_opt_subcommand.py', usage=None, description=None, version=None, formatter_class=, conflict_handler='error', add_help=True), 'parser_name': 'q', 'self': _SubParsersAction(option_strings=[], dest='command', nargs='A?..', const=None, default='qux', type=None, choices={'lux': ArgumentParser(prog='my program lux', usage=None, description='long desc of lux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'qux': ArgumentParser(prog='my program qux', usage=None, description='long desc of qux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'bux': ArgumentParser(prog='my program bux', usage=None, description='long desc of bux', version=None, formatter_class=, conflict_handler='error', add_help=True), 'fux': ArgumentParser(prog='my program fux', usage=None, description='long desc of fux', version=None, formatter_class=, conflict_handler='error', add_help=True)}, help='some help on group A', metavar=None), 'values': 'qux'}] usage: test_opt_subcommand.py [-h] [-d] {lux,qux,bux,fux} ... test_opt_subcommand.py: error: argument command: unknown parser 'q' (choices: lux, qux, bux, fux) ERROR ====================================================================== ERROR: test_optional_subcommand_behavior (__main__.TestSubparserDefaultFun) ---------------------------------------------------------------------- Traceback (most recent call last): File "test_opt_subcommand.py", line 32, in test_optional_subcommand_behavior self.parser.parse_args(prep(' ')) File "/home/bewest/Documents/git/argparse/argparse.py", line 1715, in parse_args args, argv = self.parse_known_args(args, namespace) File "/home/bewest/Documents/git/argparse/argparse.py", line 1754, in parse_known_args self.error(str(err)) File "/home/bewest/Documents/git/argparse/argparse.py", line 2398, in error self.exit(2, _('%s: error: %s\n') % (self.prog, message)) File "/home/bewest/Documents/git/argparse/argparse.py", line 2386, in exit _sys.exit(status) SystemExit: 2 ---------------------------------------------------------------------- Ran 1 test in 0.013s FAILED (errors=1) bewest@ripen:~/Documents/git/gist/cli-hello$ git diff bewest@ripen:~/Documents/git/gist/cli-hello$ git remote origin bewest@ripen:~/Documents/git/gist/cli-hello$ git remote add prune rename rm set-head show update bewest@ripen:~/Documents/git/gist/cli-hello$ git remote show -v error: unknown switch `v' usage: git remote show [] -n do not query remotes bewest@ripen:~/Documents/git/gist/cli-hello$ git remote -v origin git@gist.github.com:1202975.git (fetch) origin git@gist.github.com:1202975.git (push) bewest@ripen:~/Documents/git/gist/cli-hello$ j^C bewest@ripen:~/Documents/git/gist/cli-hello$ jobs bewest@ripen:~/Documents/git/gist/cli-hello$ ls a.py a.pyc b.py b.pyc README s.py test_opt_subcommand.py bewest@ripen:~/Documents/git/gist/cli-hello$ --- argparse.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/argparse.py b/argparse.py index d5f2ce5..a653aa5 100644 --- a/argparse.py +++ b/argparse.py @@ -2199,7 +2199,9 @@ def _get_nargs_pattern(self, action): # arguments elif nargs == _OPTIONAL_PARSER: # XXX.bewest: This doesn't quite work. - nargs_pattern = '(-*A?-[-AO]*)?' + nargs_pattern = '(-*A[-AO]*)|([-AO]*)' + #nargs_pattern = '([-*A]?-[-AO]*)?' + #nargs_pattern = '([-AO]*)' nargs_pattern = '([-AO]*)' # all others should be integers From 254725b65b3274e524f0ac416e35267eddf1da76 Mon Sep 17 00:00:00 2001 From: Ben West Date: Sat, 24 Sep 2011 11:55:09 -0700 Subject: [PATCH 3/5] This seems to work. The trick is that parser types expect an array of values, and only check the first one. So to make it optional, the default must be couched in a list. --- argparse.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/argparse.py b/argparse.py index a653aa5..190d172 100644 --- a/argparse.py +++ b/argparse.py @@ -126,7 +126,7 @@ def _callable(obj): ZERO_OR_MORE = '*' ONE_OR_MORE = '+' PARSER = 'A...' -_OPTIONAL_PARSER = 'A?..' +_OPTIONAL_PARSER = 'A...?' REMAINDER = '...' _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' @@ -1804,7 +1804,7 @@ def take_action(action, argument_strings, option_string=None): seen_actions.add(action) argument_values = self._get_values(action, argument_strings) - pprint(['take action', action, argument_strings]) + pprint(['take action', action, argument_values, argument_strings]) # error if this argument is not allowed with other previously # seen arguments, assuming that actions that use the default @@ -1833,7 +1833,7 @@ def consume_optional(start_index): # identify additional optionals in the same arg string # (e.g. -xyz is the same as -x -y -z if no args are required) match_argument = self._match_argument - pprint(['consume optional', vars( )]) + pprint(['consume optional', start_index, vars( )]) action_tuples = [] while True: @@ -1857,6 +1857,7 @@ def consume_optional(start_index): option_string = char + explicit_arg[0] new_explicit_arg = explicit_arg[1:] or None optionals_map = self._option_string_actions + pprint(['SPECIAL', vars( )]) if option_string in optionals_map: action = optionals_map[option_string] explicit_arg = new_explicit_arg @@ -2201,8 +2202,8 @@ def _get_nargs_pattern(self, action): # XXX.bewest: This doesn't quite work. nargs_pattern = '(-*A[-AO]*)|([-AO]*)' #nargs_pattern = '([-*A]?-[-AO]*)?' + nargs_pattern = '([-*A?[A-]*)' #nargs_pattern = '([-AO]*)' - nargs_pattern = '([-AO]*)' # all others should be integers else: @@ -2229,8 +2230,8 @@ def _get_values(self, action, arg_strings): # optional argument produces a default when not present opt_types = [ OPTIONAL, _OPTIONAL_PARSER ] pprint(['get values', action, arg_strings]) - #if not arg_strings and action.nargs == OPTIONAL: - if not arg_strings and action.nargs in opt_types: + if not arg_strings and action.nargs == OPTIONAL: + #if not arg_strings and action.nargs in opt_types: if action.option_strings: value = action.const else: @@ -2262,6 +2263,11 @@ def _get_values(self, action, arg_strings): # PARSER arguments convert all values, but check only the first elif action.nargs in [ PARSER, _OPTIONAL_PARSER ]: value = [self._get_value(action, v) for v in arg_strings] + if (not arg_strings and action.default is not None + and action.nargs == _OPTIONAL_PARSER): + value = [action.default] + pprint("DEFAULT VALUE!!!") + pprint(["VALUE", value, arg_strings]) self._check_value(action, value[0]) # all other types of nargs produce a list From d57e8a9a4d0dd7306336ae5157e21dc326f64ea2 Mon Sep 17 00:00:00 2001 From: Ben West Date: Sat, 24 Sep 2011 12:01:49 -0700 Subject: [PATCH 4/5] remove most debug printing --- argparse.py | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/argparse.py b/argparse.py index 190d172..9f6bc97 100644 --- a/argparse.py +++ b/argparse.py @@ -1107,7 +1107,6 @@ def __call__(self, parser, namespace, values, option_string=None): if self.dest is not SUPPRESS: setattr(namespace, self.dest, parser_name) - pprint(['select parser', vars( )]) # select the parser try: parser = self._name_parser_map[parser_name] @@ -1685,7 +1684,6 @@ def add_subparsers(self, **kwargs): # create the parsers action and add it to the positionals list parsers_class = self._pop_action_class(kwargs, 'parsers') action = parsers_class(option_strings=[], **kwargs) - pprint(['add subparsers', parsers_class, kwargs ]) self._subparsers._add_action(action) # return the created parsers action @@ -1804,8 +1802,6 @@ def take_action(action, argument_strings, option_string=None): seen_actions.add(action) argument_values = self._get_values(action, argument_strings) - pprint(['take action', action, argument_values, argument_strings]) - # error if this argument is not allowed with other previously # seen arguments, assuming that actions that use the default # value don't really count as "present" @@ -1822,7 +1818,6 @@ def take_action(action, argument_strings, option_string=None): if argument_values is not SUPPRESS: action(self, namespace, argument_values, option_string) - pprint(['consume optionals']) # function to convert arg_strings into an optional action def consume_optional(start_index): @@ -1833,7 +1828,6 @@ def consume_optional(start_index): # identify additional optionals in the same arg string # (e.g. -xyz is the same as -x -y -z if no args are required) match_argument = self._match_argument - pprint(['consume optional', start_index, vars( )]) action_tuples = [] while True: @@ -1857,7 +1851,6 @@ def consume_optional(start_index): option_string = char + explicit_arg[0] new_explicit_arg = explicit_arg[1:] or None optionals_map = self._option_string_actions - pprint(['SPECIAL', vars( )]) if option_string in optionals_map: action = optionals_map[option_string] explicit_arg = new_explicit_arg @@ -1901,7 +1894,6 @@ def consume_optional(start_index): # the list of Positionals left to be parsed; this is modified # by consume_positionals() positionals = self._get_positional_actions() - pprint(['remaining positionals', positionals]) # function to convert arg_strings into positional actions def consume_positionals(start_index): @@ -1910,13 +1902,11 @@ def consume_positionals(start_index): selected_pattern = arg_strings_pattern[start_index:] arg_counts = match_partial(positionals, selected_pattern) - pprint(['consume positionals', vars( )]) # slice off the appropriate arg strings for each Positional # and add the Positional and its args to the list for action, arg_count in zip(positionals, arg_counts): args = arg_strings[start_index: start_index + arg_count] start_index += arg_count - pprint(['loop', action, arg_count ]) take_action(action, args) # slice off the Positionals that we just parsed and return the @@ -1958,7 +1948,6 @@ def consume_positionals(start_index): start_index = next_option_string_index # consume the next optional and any arguments for it - pprint('calling consume optionals') start_index = consume_optional(start_index) # consume any positionals following the last Optional @@ -2034,7 +2023,6 @@ def _match_argument(self, action, arg_strings_pattern): nargs_pattern = self._get_nargs_pattern(action) match = _re.match(nargs_pattern, arg_strings_pattern) - pprint(['match argument', nargs_pattern, match]) # raise an exception if we weren't able to find a match if match is None: nargs_errors = { @@ -2058,7 +2046,6 @@ def _match_arguments_partial(self, actions, arg_strings_pattern): pattern = ''.join([self._get_nargs_pattern(action) for action in actions_slice]) match = _re.match(pattern, arg_strings_pattern) - pprint(['match arguments partial', pattern, match]) if match is not None: result.extend([len(string) for string in match.groups()]) break @@ -2201,8 +2188,9 @@ def _get_nargs_pattern(self, action): elif nargs == _OPTIONAL_PARSER: # XXX.bewest: This doesn't quite work. nargs_pattern = '(-*A[-AO]*)|([-AO]*)' + nargs_pattern = '(-*A[-AO]*)?' #nargs_pattern = '([-*A]?-[-AO]*)?' - nargs_pattern = '([-*A?[A-]*)' + #nargs_pattern = '([-*A?[A-]*)' #nargs_pattern = '([-AO]*)' # all others should be integers @@ -2214,7 +2202,6 @@ def _get_nargs_pattern(self, action): nargs_pattern = nargs_pattern.replace('-*', '') nargs_pattern = nargs_pattern.replace('-', '') - print nargs_pattern, nargs # return the pattern return nargs_pattern @@ -2228,10 +2215,7 @@ def _get_values(self, action, arg_strings): arg_strings = [s for s in arg_strings if s != '--'] # optional argument produces a default when not present - opt_types = [ OPTIONAL, _OPTIONAL_PARSER ] - pprint(['get values', action, arg_strings]) if not arg_strings and action.nargs == OPTIONAL: - #if not arg_strings and action.nargs in opt_types: if action.option_strings: value = action.const else: @@ -2239,7 +2223,6 @@ def _get_values(self, action, arg_strings): if isinstance(value, basestring): value = self._get_value(action, value) self._check_value(action, value) - pprint(['VALUE', value]) # when nargs='*' on a positional, if there were no command-line # args, use the default if it is anything other than None elif (not arg_strings and action.nargs == ZERO_OR_MORE and @@ -2266,8 +2249,6 @@ def _get_values(self, action, arg_strings): if (not arg_strings and action.default is not None and action.nargs == _OPTIONAL_PARSER): value = [action.default] - pprint("DEFAULT VALUE!!!") - pprint(["VALUE", value, arg_strings]) self._check_value(action, value[0]) # all other types of nargs produce a list From f4384ccfef2d38dfbc7759dff7a96fac049916c5 Mon Sep 17 00:00:00 2001 From: Ben West Date: Sat, 24 Sep 2011 12:28:02 -0700 Subject: [PATCH 5/5] this seems to work --- argparse.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/argparse.py b/argparse.py index 9f6bc97..c271811 100644 --- a/argparse.py +++ b/argparse.py @@ -2186,12 +2186,7 @@ def _get_nargs_pattern(self, action): # allow one optional argument followed by any number of options or # arguments elif nargs == _OPTIONAL_PARSER: - # XXX.bewest: This doesn't quite work. - nargs_pattern = '(-*A[-AO]*)|([-AO]*)' - nargs_pattern = '(-*A[-AO]*)?' - #nargs_pattern = '([-*A]?-[-AO]*)?' - #nargs_pattern = '([-*A?[A-]*)' - #nargs_pattern = '([-AO]*)' + nargs_pattern = '(-*A?[-AO]*)?' # all others should be integers else: