Title: argparse eats characters when parsing multiple merged short options
Type: behavior Stage: needs patch
Components: Library (Lib) Versions:
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: bethard Nosy List: bethard, catherine
Priority: normal Keywords: patch

Created on 2010-07-23 14:18 by bethard, last changed 2010-11-01 16:01 by bethard. This issue is now closed.

File name Uploaded Description Edit
multiple_short_same_prefix.patch bethard, 2010-07-23 14:18
test_multiple_short_same_prefix.patch catherine, 2010-08-03 15:54 unit test
multiple_short_same_prefix_new.patch catherine, 2010-08-03 15:56 patch
Messages (4)
msg111328 - (view) Author: Steven Bethard (bethard) * (Python committer) Date: 2010-07-23 14:18
[Moved from]

What steps will reproduce the problem?
parser = ArgumentParser(prefix_chars="-+")
print parser.parse_args("-abc".split())

What is the expected output? What do you see instead?
I would expect Namespace(a=True, b=True, c=True)
You get Namespace(a=True, b=False, c=True)

because in the loop that iterates through the prefix characters it builds an option_string to try by pulling the first character off explicit_arg. If it doesn't match any option then it will try the next prefix character, but it will have lost that character from the explicit_arg. This is also a problem even with only one prefix character because if it doesn't match an option the error message will be missing that one character.

The above match -a, tried -b and fails, but instead of trying +b, it tries +c because the b has been lost.

I've included multiple_short.patch which fixes just this bug. However, I also don't agree with the behavior of trying all prefix characters. I would expect that when merging short options together they would have to all share the same prefix character. If I have prefix_chars="-+" and I have options -a, +a, -b, and +b and I type +ab I would expect my action to be called with option_strings +a and +b, not +a and -b. The patch to fix the above bug *and* only try the same prefix character as the first option is multiple_short_same_prefix.patch.

[Only the latter patch (which sounds like the right behavior) is attached. It will need to be updated to work against Python trunk.]
msg112621 - (view) Author: Catherine Devlin (catherine) Date: 2010-08-03 15:54
Attaching a test to verify parse failure on mismatched prefix (-abc or +abc).  Steven's patch makes it pass.
msg112622 - (view) Author: Catherine Devlin (catherine) Date: 2010-08-03 15:56
Updated Steven's patch; no changes, but now it knows the new context so that ``patch -p0`` won't fail.
msg120135 - (view) Author: Steven Bethard (bethard) * (Python committer) Date: 2010-11-01 16:00
Patches applied in r86090 (3.X) and r86091 (2.7). Thanks for your help Catherine, and sorry it took me so long to apply these.
Date User Action Args
2010-11-01 16:01:00bethardsetstatus: open -> closed
assignee: bethard
resolution: fixed
messages: + msg120135
2010-08-03 15:56:20catherinesetfiles: + multiple_short_same_prefix_new.patch

messages: + msg112622
2010-08-03 15:54:57catherinesetfiles: + test_multiple_short_same_prefix.patch
versions: - Python 2.7, Python 3.2
nosy: + catherine

messages: + msg112621
2010-07-23 14:18:22bethardcreate