]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #15806: Add contextlib.ignored().
authorRaymond Hettinger <python@rcn.com>
Mon, 11 Mar 2013 05:26:51 +0000 (22:26 -0700)
committerRaymond Hettinger <python@rcn.com>
Mon, 11 Mar 2013 05:26:51 +0000 (22:26 -0700)
Doc/library/contextlib.rst
Lib/contextlib.py
Lib/test/test_contextlib.py
Misc/NEWS

index 41dfded4b5da499dcef67256a1386a7a2a817614..4c8fe7803d0bf72fb9ac7829c6c948f4e32ed970 100644 (file)
@@ -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()
 
index 0b6bf71b08ca08daa5c7763ce2cd0b34a94d5518..03c56da39758e0b18989b875a6e72e9da9b43474 100644 (file)
@@ -4,7 +4,7 @@ import sys
 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 @@ class closing(object):
     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):
index e52ed91a585c8a68bab1ce08ca265dce3f3a249c..d13659d95c39e0ad92dcc45d993f43854d295972 100644 (file)
@@ -594,6 +594,28 @@ class TestExitStack(unittest.TestCase):
         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():
index dcf4812f1461ba5f22b7927cfa0df87c5e4b2538..607ad5efd27ac60e8fa8b9acacb6b2f2760b00ad 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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