[New-bugs-announce] [issue24070] Exceptions and arguments disappear when using argparse inside with statement

Roy Hyunjin Han report at bugs.python.org
Tue Apr 28 19:57:25 CEST 2015


New submission from Roy Hyunjin Han:

Exceptions and arguments disappear when using argparse inside a "with" statement.  The behavior was confusing and frustrating because I could not pinpoint why certain arguments were missing or unrecognized.

Unhandled exceptions inside the with statement typically trigger a traceback, unless __exit__ returns True, in which the exception is "swallowed" (https://www.python.org/dev/peps/pep-0343/).

However, the NameError exception and tile_indices argument disappear because of a premature sys.exit (https://hg.python.org/cpython/file/default/Lib/argparse.py#l2385).

```
"""
$ python exception-in-with.py
EXPECTED
Traceback (most recent call last):
  File "exception-in-with.py", line 51, in <module>
    abc  # !!!
NameError: name 'abc' is not defined
ACTUAL
usage: exception-in-with.py [-h] --image_path PATH
exception-in-with.py: error: argument --image_path is required

$ python exception-in-with.py --image_path x
EXPECTED == ACTUAL
Traceback (most recent call last):
  File "exception-in-with.py", line 51, in <module>
    abc  # !!!
NameError: name 'abc' is not defined

$ python exception-in-with.py --image_path x --tile_indices 1
EXPECTED
Traceback (most recent call last):
  File "exception-in-with.py", line 51, in <module>
    abc  # !!!
NameError: name 'abc' is not defined
ACTUAL
usage: exception-in-with.py [-h] --image_path PATH
exception-in-with.py: error: unrecognized arguments: --tile_indices 1
"""
from argparse import ArgumentParser


class Starter(object):

    def __init__(self):
        self.argument_parser = ArgumentParser()

    def __enter__(self):
        return self

    def __exit__(self, exception_type, exception_value, exception_traceback):
        self.argument_parser.parse_args()

    def add_argument(self, *args, **kw):
        self.argument_parser.add_argument(*args, **kw)


with Starter() as starter:
    starter.add_argument('--image_path', metavar='PATH', required=True)
    abc  # !!!
    starter.add_argument('--tile_indices', metavar='INTEGER')
```

----------
components: Library (Lib)
files: argparse-with-exception.py
messages: 242192
nosy: invisibleroads
priority: normal
severity: normal
status: open
title: Exceptions and arguments disappear when using argparse inside with statement
type: behavior
versions: Python 2.7, Python 3.3
Added file: http://bugs.python.org/file39227/argparse-with-exception.py

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue24070>
_______________________________________


More information about the New-bugs-announce mailing list