Commits

Raymond Hettinger  committed 3eb522d

Deprecate contextlib.nested(). The with-statement now provides this functionality directly.

  • Participants
  • Parent commits b004049

Comments (0)

Files changed (5)

File Doc/library/contextlib.rst

    :meth:`__exit__` methods should avoid raising exceptions, and in particular they
    should not re-raise a passed-in exception.
 
+   .. deprecated:: 3.1
+      The with-statement now supports this functionality directly.
 
 .. function:: closing(thing)
 

File Doc/whatsnew/3.1.rst

     ...         if '<critical>' in line:
     ...             outfile.write(line)
 
+  With the new syntax, the :func:`contextlib.nested` function is no longer
+  needed and is not deprecated.
+
   (Contributed by Georg Brandl and Mattias Brändström;
   `appspot issue 53094 <http://codereview.appspot.com/53094>`_.)
 

File Lib/contextlib.py

 
 import sys
 from functools import wraps
+from warnings import warn
 
 __all__ = ["contextmanager", "nested", "closing"]
 
                     <body>
 
     """
+    warn("With-statements now directly support multiple context managers",
+        DeprecationWarning, 2)
     exits = []
     vars = []
     exc = (None, None, None)

File Lib/test/test_contextlib.py

         self.assertEqual(baz.foo, 'bar')
         self.assertEqual(baz.__doc__, "Whee!")
 
-class NestedTestCase(unittest.TestCase):
-
-    # XXX This needs more work
-
-    def test_nested(self):
-        @contextmanager
-        def a():
-            yield 1
-        @contextmanager
-        def b():
-            yield 2
-        @contextmanager
-        def c():
-            yield 3
-        with nested(a(), b(), c()) as (x, y, z):
-            self.assertEqual(x, 1)
-            self.assertEqual(y, 2)
-            self.assertEqual(z, 3)
-
-    def test_nested_cleanup(self):
-        state = []
-        @contextmanager
-        def a():
-            state.append(1)
-            try:
-                yield 2
-            finally:
-                state.append(3)
-        @contextmanager
-        def b():
-            state.append(4)
-            try:
-                yield 5
-            finally:
-                state.append(6)
-        try:
-            with nested(a(), b()) as (x, y):
-                state.append(x)
-                state.append(y)
-                1/0
-        except ZeroDivisionError:
-            self.assertEqual(state, [1, 4, 2, 5, 6, 3])
-        else:
-            self.fail("Didn't raise ZeroDivisionError")
-
-    def test_nested_right_exception(self):
-        state = []
-        @contextmanager
-        def a():
-            yield 1
-        class b(object):
-            def __enter__(self):
-                return 2
-            def __exit__(self, *exc_info):
-                try:
-                    raise Exception()
-                except:
-                    pass
-        try:
-            with nested(a(), b()) as (x, y):
-                1/0
-        except ZeroDivisionError:
-            self.assertEqual((x, y), (1, 2))
-        except Exception:
-            self.fail("Reraised wrong exception")
-        else:
-            self.fail("Didn't raise ZeroDivisionError")
-
-    def test_nested_b_swallows(self):
-        @contextmanager
-        def a():
-            yield
-        @contextmanager
-        def b():
-            try:
-                yield
-            except:
-                # Swallow the exception
-                pass
-        try:
-            with nested(a(), b()):
-                1/0
-        except ZeroDivisionError:
-            self.fail("Didn't swallow ZeroDivisionError")
-
-    def test_nested_break(self):
-        @contextmanager
-        def a():
-            yield
-        state = 0
-        while True:
-            state += 1
-            with nested(a(), a()):
-                break
-            state += 10
-        self.assertEqual(state, 1)
-
-    def test_nested_continue(self):
-        @contextmanager
-        def a():
-            yield
-        state = 0
-        while state < 3:
-            state += 1
-            with nested(a(), a()):
-                continue
-            state += 10
-        self.assertEqual(state, 3)
-
-    def test_nested_return(self):
-        @contextmanager
-        def a():
-            try:
-                yield
-            except:
-                pass
-        def foo():
-            with nested(a(), a()):
-                return 1
-            return 10
-        self.assertEqual(foo(), 1)
-
 class ClosingTestCase(unittest.TestCase):
 
     # XXX This needs more work
 - Issue #6089: Fixed str.format with certain invalid field specifiers
   that would raise SystemError.
 
-- Added support for multiple context managers in the same with statement.
+- Added support for multiple context managers in the same with-statement.
+  Deprecated contextlib.nested() which is no longer needed.
 
 - Issue #5829: complex("1e500") no longer raises OverflowError.  This
   makes it consistent with float("1e500") and interpretation of real