classification
Title: argparse parsing (mingling --option and optional positional argument)
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.4
process
Status: closed Resolution: duplicate
Dependencies: Superseder: argparse: nargs='*' positional argument doesn't accept any items if preceded by an option and another positional
View: 15112
Assigned To: Nosy List: bobjalex, martin.panter
Priority: normal Keywords:

Created on 2015-05-18 01:22 by bobjalex, last changed 2015-05-21 16:46 by bobjalex. This issue is now closed.

Messages (3)
msg243447 - (view) Author: Bob Alexander (bobjalex) * Date: 2015-05-18 01:22
Here is simple example of failure to parse arguments that should parse OK. In the following little program, the second from last line contains an aargument sequence that parses OK, but the last line should but doesn't.

import argparse
ap = argparse.ArgumentParser()
ap.add_argument("--option", action="store_true")
ap.add_argument("arg_1")
ap.add_argument("arg_2", nargs="?")
print("test 1:", ap.parse_args(["abc", "mmm", "--option"]))
print("test 2:", ap.parse_args(["abc", "--option", "mmm"]))
msg243452 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2015-05-18 03:29
I suggest this is a duplicate of Issue 15112. The same problem also happens with nargs="*", and that issue apparently has a patch to handle both cases.

For the record, this is the resulting error, and a demo that it works if the option comes before the positional arguments:

>>> print("test 2:", ap.parse_args(["abc", "--option", "mmm"]))
usage: [-h] [--option] arg_1 [arg_2]
: error: unrecognized arguments: mmm
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/proj/python/cpython/Lib/argparse.py", line 1729, in parse_args
    self.error(msg % ' '.join(argv))
  File "/home/proj/python/cpython/Lib/argparse.py", line 2385, in error
    self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
  File "/home/proj/python/cpython/Lib/argparse.py", line 2372, in exit
    _sys.exit(status)
  File "/home/pythonstartup.py", line 345, in exit
    raise SystemExit(code)
__main__.SystemExit: 2
>>> ap.parse_args(["--option", "abc", "mmm"])
Namespace(arg_1='abc', arg_2='mmm', option=True)
msg243763 - (view) Author: Bob Alexander (bobjalex) * Date: 2015-05-21 16:46
Thanks for the note, Martin. I agree that it's a duplicate. (I had done a
brief search for possible dups, but didn't find that one!)

Bob

On Sun, May 17, 2015 at 8:29 PM, Martin Panter <report@bugs.python.org>
wrote:

>
> Martin Panter added the comment:
>
> I suggest this is a duplicate of Issue 15112. The same problem also
> happens with nargs="*", and that issue apparently has a patch to handle
> both cases.
>
> For the record, this is the resulting error, and a demo that it works if
> the option comes before the positional arguments:
>
> >>> print("test 2:", ap.parse_args(["abc", "--option", "mmm"]))
> usage: [-h] [--option] arg_1 [arg_2]
> : error: unrecognized arguments: mmm
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "/home/proj/python/cpython/Lib/argparse.py", line 1729, in
> parse_args
>     self.error(msg % ' '.join(argv))
>   File "/home/proj/python/cpython/Lib/argparse.py", line 2385, in error
>     self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
>   File "/home/proj/python/cpython/Lib/argparse.py", line 2372, in exit
>     _sys.exit(status)
>   File "/home/pythonstartup.py", line 345, in exit
>     raise SystemExit(code)
> __main__.SystemExit: 2
> >>> ap.parse_args(["--option", "abc", "mmm"])
> Namespace(arg_1='abc', arg_2='mmm', option=True)
>
> ----------
> nosy: +vadmium
> resolution:  -> duplicate
> stage:  -> resolved
> status: open -> closed
> superseder:  -> argparse: nargs='*' positional argument doesn't accept any
> items if preceded by an option and another positional
> title: argparse parsing bug -> argparse parsing (mingling --option and
> optional positional argument)
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue24223>
> _______________________________________
>
History
Date User Action Args
2015-05-21 16:46:53bobjalexsetmessages: + msg243763
2015-05-18 03:29:16martin.pantersetstatus: open -> closed

superseder: argparse: nargs='*' positional argument doesn't accept any items if preceded by an option and another positional
title: argparse parsing bug -> argparse parsing (mingling --option and optional positional argument)
nosy: + martin.panter

messages: + msg243452
resolution: duplicate
stage: resolved
2015-05-18 01:22:12bobjalexcreate