Message111270
[From the old argparse tracker: http://code.google.com/p/argparse/issues/detail?id=20]
You can't follow a nargs='+' optional argument with a positional argument:
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--badger', nargs='+')
>>> parser.add_argument('spam')
>>> parser.parse_args('--badger A B C D'.split())
usage: PROG [-h] [--badger BADGER [BADGER ...]] spam
PROG: error: too few arguments
Ideally, this should produce:
>>> parser.parse_args('--badger A B C D'.split())
Namespace(badger=['A', 'B', 'C'], spam='D')
The problem is that the nargs='+' causes the optional to consume all the arguments following it, even though we should know that we need to save one for the final positional argument.
A workaround is to specify '--', e.g.:
>>> parser.parse_args('--badger A B C -- D'.split())
Namespace(badger=['A', 'B', 'C'], spam='D')
The problem arises from the fact that argparse uses regular-expression style matching for positional arguments, but it does that separately from what it does for optional arguments.
One solution might be to build a regular expression of the possible things a parser could match. So given a parser like::
parser = argparse.ArgumentParser()
parser.add_argument('-w')
parser.add_argument('-x', nargs='+')
parser.add_argument('y')
parser.add_argument('z', nargs='*')
the regular expression might look something like (where positionals have been replaced by the character A)::
(-w A)? (-x A+)? A (-w A)? (-x A+)? A* (-w A)? (-x A+)?
Note that the optionals can appear between any positionals, so I have to repeat their regular expressions multiple times. Because of this, I worry about how big the regular expression might grow to be for large parsers. But maybe this is the right way to solve the problem. |
|
Date |
User |
Action |
Args |
2010-07-23 10:46:29 | bethard | set | recipients:
+ bethard |
2010-07-23 10:46:29 | bethard | set | messageid: <1279881989.28.0.725806934086.issue9338@psf.upfronthosting.co.za> |
2010-07-23 10:46:27 | bethard | link | issue9338 messages |
2010-07-23 10:46:26 | bethard | create | |
|