From 91e3b9d89d6a63149dcd9ab12223f552d1473aab Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 28 May 2009 22:20:03 +0000 Subject: Deprecate contextlib.nested(). The with-statement now provides this functionality directly. --- Doc/library/contextlib.rst | 2 + Doc/whatsnew/3.1.rst | 3 ++ Lib/contextlib.py | 3 ++ Lib/test/test_contextlib.py | 122 -------------------------------------------- Misc/NEWS | 3 +- 5 files changed, 10 insertions(+), 123 deletions(-) diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index d6ce9a7..7403a35 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -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) diff --git a/Doc/whatsnew/3.1.rst b/Doc/whatsnew/3.1.rst index 8a3a01f..468eda8 100644 --- a/Doc/whatsnew/3.1.rst +++ b/Doc/whatsnew/3.1.rst @@ -164,6 +164,9 @@ Some smaller changes made to the core Python language are: ... if '' 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 `_.) diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 647efdd..0841ac3 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -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): """ + warn("With-statements now directly support multiple context managers", + DeprecationWarning, 2) exits = [] vars = [] exc = (None, None, None) diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index c05f37b..b878dc1 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index 19f323f..12dfbac 100644 --- 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 -- cgit v0.12