[Python-checkins] cpython: Close #19266: contextlib.ignore -> contextlib.suppress

nick.coghlan python-checkins at python.org
Thu Oct 17 15:42:53 CEST 2013


http://hg.python.org/cpython/rev/22247b7d17fa
changeset:   86403:22247b7d17fa
user:        Nick Coghlan <ncoghlan at gmail.com>
date:        Thu Oct 17 23:40:57 2013 +1000
summary:
  Close #19266: contextlib.ignore -> contextlib.suppress

Patch by Zero Piraeus.

files:
  Doc/library/contextlib.rst  |  26 ++++++++++----
  Doc/whatsnew/3.4.rst        |  13 ++++--
  Lib/contextlib.py           |   8 ++--
  Lib/test/test_contextlib.py |  44 ++++++++++++------------
  Misc/ACKS                   |   1 +
  Misc/NEWS                   |   5 ++
  6 files changed, 58 insertions(+), 39 deletions(-)


diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst
--- a/Doc/library/contextlib.rst
+++ b/Doc/library/contextlib.rst
@@ -95,22 +95,27 @@
    ``page.close()`` will be called when the :keyword:`with` block is exited.
 
 
-.. function:: ignore(*exceptions)
+.. function:: suppress(*exceptions)
 
-   Return a context manager that ignores the specified exceptions if they
-   occur in the body of a with-statement.
+   Return a context manager that suppresses any of the specified exceptions
+   if they occur in the body of a with statement and then resumes execution
+   with the first statement following the end of the with statement.
 
-   As with any other mechanism that completely suppresses exceptions, it
-   should only be used to cover very specific errors where silently
-   ignoring the exception is known to be the right thing to do.
+   As with any other mechanism that completely suppresses exceptions, this
+   context manager should be used only to cover very specific errors where
+   silently continuing with program execution is known to be the right
+   thing to do.
 
    For example::
 
-       from contextlib import ignore
+       from contextlib import suppress
 
-       with ignore(FileNotFoundError):
+       with suppress(FileNotFoundError):
            os.remove('somefile.tmp')
 
+       with suppress(FileNotFoundError):
+           os.remove('someotherfile.tmp')
+
    This code is equivalent to::
 
        try:
@@ -118,6 +123,11 @@
        except FileNotFoundError:
            pass
 
+       try:
+           os.remove('someotherfile.tmp')
+       except FileNotFoundError:
+           pass
+
    .. versionadded:: 3.4
 
 
diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
--- a/Doc/whatsnew/3.4.rst
+++ b/Doc/whatsnew/3.4.rst
@@ -221,14 +221,17 @@
 contextlib
 ----------
 
-The new :class:`contextlib.ignore` context manager helps to clarify the
-intent of code that deliberately ignores failures from a particular
-operation.
+The new :class:`contextlib.suppress` context manager helps to clarify the
+intent of code that deliberately suppresses exceptions from a single
+statement. (Contributed by Raymond Hettinger in :issue:`15806` and
+Zero Piraeus in :issue:`19266`)
+
 
 The new :class:`contextlib.redirect_stdio` context manager makes it easier
 for utility scripts to handle inflexible APIs that don't provide any
 options to retrieve their output as a string or direct it to somewhere
-other than :data:`sys.stdout`.
+other than :data:`sys.stdout`. (Contribute by Raymond Hettinger in
+:issue:`15805`)
 
 
 dis
@@ -283,7 +286,7 @@
 A pair of new subclasses of :class:`~email.message.Message` have been added,
 along with a new sub-module, :mod:`~email.contentmanager`.  All documentation
 is currently in the new module, which is being added as part of the new
-:term:`provisional <provosional package>` email API.  These classes provide a
+:term:`provisional <provisional package>` email API.  These classes provide a
 number of new methods that make extracting content from and inserting content
 into email messages much easier.  See the :mod:`~email.contentmanager`
 documentation for details.
diff --git a/Lib/contextlib.py b/Lib/contextlib.py
--- a/Lib/contextlib.py
+++ b/Lib/contextlib.py
@@ -5,7 +5,7 @@
 from functools import wraps
 
 __all__ = ["contextmanager", "closing", "ContextDecorator", "ExitStack",
-           "ignore", "redirect_stdout"]
+           "redirect_stdout", "suppress"]
 
 
 class ContextDecorator(object):
@@ -179,10 +179,10 @@
         sys.stdout = self.old_target
 
 @contextmanager
-def ignore(*exceptions):
-    """Context manager to ignore specified exceptions
+def suppress(*exceptions):
+    """Context manager to suppress specified exceptions
 
-         with ignore(OSError):
+         with suppress(OSError):
              os.remove(somefile)
 
     """
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -632,28 +632,6 @@
         stack.push(cm)
         self.assertIs(stack._exit_callbacks[-1], cm)
 
-class TestIgnore(unittest.TestCase):
-
-    def test_no_exception(self):
-
-        with ignore(ValueError):
-            self.assertEqual(pow(2, 5), 32)
-
-    def test_exact_exception(self):
-
-        with ignore(TypeError):
-            len(5)
-
-    def test_multiple_exception_args(self):
-
-        with ignore(ZeroDivisionError, TypeError):
-            len(5)
-
-    def test_exception_hierarchy(self):
-
-        with ignore(LookupError):
-            'Hello'[50]
-
 class TestRedirectStdout(unittest.TestCase):
 
     def test_redirect_to_string_io(self):
@@ -663,5 +641,27 @@
         s = f.getvalue()
         self.assertIn('pow', s)
 
+class TestSuppress(unittest.TestCase):
+
+    def test_no_exception(self):
+
+        with suppress(ValueError):
+            self.assertEqual(pow(2, 5), 32)
+
+    def test_exact_exception(self):
+
+        with suppress(TypeError):
+            len(5)
+
+    def test_multiple_exception_args(self):
+
+        with suppress(ZeroDivisionError, TypeError):
+            len(5)
+
+    def test_exception_hierarchy(self):
+
+        with suppress(LookupError):
+            'Hello'[50]
+
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1003,6 +1003,7 @@
 François Pinard
 Tom Pinckney
 Zach Pincus
+Zero Piraeus
 Michael Piotrowski
 Antoine Pitrou
 Jean-François Piéronne
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -42,6 +42,11 @@
 Library
 -------
 
+- Issue #19266: Rename the new-in-3.4 ``contextlib.ignore`` context manager
+  to ``contextlib.suppress`` in order to be more consistent with existing
+  descriptions of that operation elsewhere in the language and standard
+  library documentation (Patch by Zero Piraeus)
+
 - Issue #18891: Completed the new email package (provisional) API additions
   by adding new classes EmailMessage, MIMEPart, and ContentManager.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list