[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