Issue #15806: Add contextlib.ignored().

This commit is contained in:
Raymond Hettinger 2013-03-10 22:26:51 -07:00
parent c0417357d1
commit e318a883fe
4 changed files with 58 additions and 1 deletions

View File

@ -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()

View File

@ -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):

View File

@ -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():

View File

@ -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