Issue #15806: Add contextlib.ignored().
This commit is contained in:
parent
c0417357d1
commit
e318a883fe
|
@ -94,6 +94,26 @@ Functions and classes provided:
|
||||||
without needing to explicitly close ``page``. Even if an error occurs,
|
without needing to explicitly close ``page``. Even if an error occurs,
|
||||||
``page.close()`` will be called when the :keyword:`with` block is exited.
|
``page.close()`` will be called when the :keyword:`with` block is exited.
|
||||||
|
|
||||||
|
.. function:: ignored(*exceptions)
|
||||||
|
|
||||||
|
Return a context manager that ignores the specified expections if they
|
||||||
|
occur in the body of a with-statement.
|
||||||
|
|
||||||
|
For example::
|
||||||
|
|
||||||
|
from contextlib import ignored
|
||||||
|
|
||||||
|
with ignored(OSError):
|
||||||
|
os.remove('somefile.tmp')
|
||||||
|
|
||||||
|
This code is equivalent to::
|
||||||
|
|
||||||
|
try:
|
||||||
|
os.remove('somefile.tmp')
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
.. versionadded:: 3.4
|
||||||
|
|
||||||
.. class:: ContextDecorator()
|
.. class:: ContextDecorator()
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import sys
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack"]
|
__all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack", "ignored"]
|
||||||
|
|
||||||
|
|
||||||
class ContextDecorator(object):
|
class ContextDecorator(object):
|
||||||
|
@ -140,6 +140,18 @@ class closing(object):
|
||||||
def __exit__(self, *exc_info):
|
def __exit__(self, *exc_info):
|
||||||
self.thing.close()
|
self.thing.close()
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def ignored(*exceptions):
|
||||||
|
"""Context manager to ignore specifed exceptions
|
||||||
|
|
||||||
|
with ignored(OSError):
|
||||||
|
os.remove(somefile)
|
||||||
|
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
except exceptions:
|
||||||
|
pass
|
||||||
|
|
||||||
# Inspired by discussions on http://bugs.python.org/issue13585
|
# Inspired by discussions on http://bugs.python.org/issue13585
|
||||||
class ExitStack(object):
|
class ExitStack(object):
|
||||||
|
|
|
@ -594,6 +594,28 @@ class TestExitStack(unittest.TestCase):
|
||||||
stack.push(cm)
|
stack.push(cm)
|
||||||
self.assertIs(stack._exit_callbacks[-1], cm)
|
self.assertIs(stack._exit_callbacks[-1], cm)
|
||||||
|
|
||||||
|
class TestIgnored(unittest.TestCase):
|
||||||
|
|
||||||
|
def test_no_exception(self):
|
||||||
|
|
||||||
|
with ignored(ValueError):
|
||||||
|
self.assertEqual(pow(2, 5), 32)
|
||||||
|
|
||||||
|
def test_exact_exception(self):
|
||||||
|
|
||||||
|
with ignored(TypeError):
|
||||||
|
len(5)
|
||||||
|
|
||||||
|
def test_multiple_exception_args(self):
|
||||||
|
|
||||||
|
with ignored(ZeroDivisionError, TypeError):
|
||||||
|
len(5)
|
||||||
|
|
||||||
|
def test_exception_hierarchy(self):
|
||||||
|
|
||||||
|
with ignored(LookupError):
|
||||||
|
'Hello'[50]
|
||||||
|
|
||||||
|
|
||||||
# This is needed to make the test actually run under regrtest.py!
|
# This is needed to make the test actually run under regrtest.py!
|
||||||
def test_main():
|
def test_main():
|
||||||
|
|
|
@ -280,6 +280,9 @@ Library
|
||||||
_ Issue #17385: Fix quadratic behavior in threading.Condition. The FIFO
|
_ Issue #17385: Fix quadratic behavior in threading.Condition. The FIFO
|
||||||
queue now uses a deque instead of a list.
|
queue now uses a deque instead of a list.
|
||||||
|
|
||||||
|
- Issue #15806: Add contextlib.ignored(). This creates a context manager
|
||||||
|
to ignore specified exceptions, replacing the "except Exc: pass" idiom.
|
||||||
|
|
||||||
- Issue #14645: The email generator classes now produce output using the
|
- Issue #14645: The email generator classes now produce output using the
|
||||||
specified linesep throughout. Previously if the prolog, epilog, or
|
specified linesep throughout. Previously if the prolog, epilog, or
|
||||||
body were stored with a different linesep, that linesep was used. This
|
body were stored with a different linesep, that linesep was used. This
|
||||||
|
|
Loading…
Reference in New Issue