Commit 91e3b9d8 authored by Raymond Hettinger's avatar Raymond Hettinger

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

parent fb12391c
......@@ -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)
......
......@@ -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>`_.)
......
......@@ -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)
......
......@@ -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
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment