Permalink
Browse files

Issue #15806: Add contextlib.ignored().

  • Loading branch information...
rhettinger committed Mar 11, 2013
1 parent c041735 commit e318a883fece5d9a45165670b5f995886f524820
Showing with 58 additions and 1 deletion.
  1. +20 −0 Doc/library/contextlib.rst
  2. +13 −1 Lib/contextlib.py
  3. +22 −0 Lib/test/test_contextlib.py
  4. +3 −0 Misc/NEWS
@@ -94,6 +94,26 @@ Functions and classes provided:
without needing to explicitly close ``page``. Even if an error occurs,
``page.close()`` will be called when the :keyword:`with` block is exited.
.. function:: ignored(*exceptions)
Return a context manager that ignores the specified expections if they
occur in the body of a with-statement.
For example::
from contextlib import ignored
with ignored(OSError):
os.remove('somefile.tmp')
This code is equivalent to::
try:
os.remove('somefile.tmp')
except OSError:
pass
.. versionadded:: 3.4
.. class:: ContextDecorator()
@@ -4,7 +4,7 @@
from collections import deque
from functools import wraps
__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack"]
__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", "ignored"]
class ContextDecorator(object):
@@ -140,6 +140,18 @@ def __enter__(self):
def __exit__(self, *exc_info):
self.thing.close()
@contextmanager
def ignored(*exceptions):
"""Context manager to ignore specifed exceptions
with ignored(OSError):
os.remove(somefile)
"""
try:
yield
except exceptions:
pass
# Inspired by discussions on http://bugs.python.org/issue13585
class ExitStack(object):
@@ -594,6 +594,28 @@ class Example(object): pass
stack.push(cm)
self.assertIs(stack._exit_callbacks[-1], cm)
class TestIgnored(unittest.TestCase):
def test_no_exception(self):
with ignored(ValueError):
self.assertEqual(pow(2, 5), 32)
def test_exact_exception(self):
with ignored(TypeError):
len(5)
def test_multiple_exception_args(self):
with ignored(ZeroDivisionError, TypeError):
len(5)
def test_exception_hierarchy(self):
with ignored(LookupError):
'Hello'[50]
# This is needed to make the test actually run under regrtest.py!
def test_main():
@@ -280,6 +280,9 @@ Library
_ Issue #17385: Fix quadratic behavior in threading.Condition. The FIFO
queue now uses a deque instead of a list.
- Issue #15806: Add contextlib.ignored(). This creates a context manager
to ignore specified exceptions, replacing the "except Exc: pass" idiom.
- Issue #14645: The email generator classes now produce output using the
specified linesep throughout. Previously if the prolog, epilog, or
body were stored with a different linesep, that linesep was used. This

0 comments on commit e318a88

Please sign in to comment.