Kaydet (Commit) e318a883 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue #15806: Add contextlib.ignored().

üst c0417357
...@@ -94,6 +94,26 @@ Functions and classes provided: ...@@ -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 ...@@ -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): ...@@ -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): ...@@ -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 ...@@ -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
......
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