]> granicus.if.org Git - python/commitdiff
Deprecate contextlib.nested(). The with-statement now provides this functionality...
authorRaymond Hettinger <python@rcn.com>
Thu, 28 May 2009 22:20:03 +0000 (22:20 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 28 May 2009 22:20:03 +0000 (22:20 +0000)
Doc/library/contextlib.rst
Doc/whatsnew/3.1.rst
Lib/contextlib.py
Lib/test/test_contextlib.py
Misc/NEWS

index d6ce9a763163a8898b8153b593ce50307e3c5a37..7403a3520b556bf68f5be713571dd295f1fcb1da 100644 (file)
@@ -80,6 +80,8 @@ Functions provided:
    :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)
 
index 8a3a01fa10444ed21a6383f3978e027c53efc516..468eda837ebee6820e8f4ade40302f0aa53b3f16 100644 (file)
@@ -164,6 +164,9 @@ Some smaller changes made to the core Python language are:
     ...         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>`_.)
 
index 647efdd26de532d0b3469eefe6f60b9ee3c3326b..0841ac33ed541611b768c37843f3c629555fdf7b 100644 (file)
@@ -2,6 +2,7 @@
 
 import sys
 from functools import wraps
+from warnings import warn
 
 __all__ = ["contextmanager", "nested", "closing"]
 
@@ -101,6 +102,8 @@ def nested(*managers):
                     <body>
 
     """
+    warn("With-statements now directly support multiple context managers",
+        DeprecationWarning, 2)
     exits = []
     vars = []
     exc = (None, None, None)
index c05f37b0ba4e3cb7dc1961d15638cf04d04ab2b5..b878dc1614f27794bc43d1f7f907f5638838089e 100644 (file)
@@ -100,128 +100,6 @@ class ContextManagerTestCase(unittest.TestCase):
         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
index 19f323f6a4f07299d6ace44af8b7357b78e3bc92..12dfbac99a1c8d98e51f8544de65308ac38cb9a9 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,7 +15,8 @@ Core and Builtins
 - 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