mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Deprecate contextlib.nested(). The with-statement now provides this functionality directly.
This commit is contained in:
parent
fb12391c44
commit
91e3b9d89d
5 changed files with 10 additions and 123 deletions
|
@ -80,6 +80,8 @@ Functions provided:
|
||||||
:meth:`__exit__` methods should avoid raising exceptions, and in particular they
|
:meth:`__exit__` methods should avoid raising exceptions, and in particular they
|
||||||
should not re-raise a passed-in exception.
|
should not re-raise a passed-in exception.
|
||||||
|
|
||||||
|
.. deprecated:: 3.1
|
||||||
|
The with-statement now supports this functionality directly.
|
||||||
|
|
||||||
.. function:: closing(thing)
|
.. function:: closing(thing)
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,9 @@ Some smaller changes made to the core Python language are:
|
||||||
... if '<critical>' in line:
|
... if '<critical>' in line:
|
||||||
... outfile.write(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;
|
(Contributed by Georg Brandl and Mattias Brändström;
|
||||||
`appspot issue 53094 <http://codereview.appspot.com/53094>`_.)
|
`appspot issue 53094 <http://codereview.appspot.com/53094>`_.)
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
from warnings import warn
|
||||||
|
|
||||||
__all__ = ["contextmanager", "nested", "closing"]
|
__all__ = ["contextmanager", "nested", "closing"]
|
||||||
|
|
||||||
|
@ -101,6 +102,8 @@ def nested(*managers):
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
warn("With-statements now directly support multiple context managers",
|
||||||
|
DeprecationWarning, 2)
|
||||||
exits = []
|
exits = []
|
||||||
vars = []
|
vars = []
|
||||||
exc = (None, None, None)
|
exc = (None, None, None)
|
||||||
|
|
|
@ -100,128 +100,6 @@ class ContextManagerTestCase(unittest.TestCase):
|
||||||
self.assertEqual(baz.foo, 'bar')
|
self.assertEqual(baz.foo, 'bar')
|
||||||
self.assertEqual(baz.__doc__, "Whee!")
|
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):
|
class ClosingTestCase(unittest.TestCase):
|
||||||
|
|
||||||
# XXX This needs more work
|
# XXX This needs more work
|
||||||
|
|
|
@ -15,7 +15,8 @@ Core and Builtins
|
||||||
- Issue #6089: Fixed str.format with certain invalid field specifiers
|
- Issue #6089: Fixed str.format with certain invalid field specifiers
|
||||||
that would raise SystemError.
|
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
|
- Issue #5829: complex("1e500") no longer raises OverflowError. This
|
||||||
makes it consistent with float("1e500") and interpretation of real
|
makes it consistent with float("1e500") and interpretation of real
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue