| \section{\module{contextlib} --- |
| Utilities for \keyword{with}-statement contexts.} |
| |
| \declaremodule{standard}{contextlib} |
| \modulesynopsis{Utilities for \keyword{with}-statement contexts.} |
| |
| \versionadded{2.5} |
| |
| This module provides utilities for common tasks involving the |
| \keyword{with} statement. |
| |
| Functions provided: |
| |
| \begin{funcdesc}{context}{func} |
| This function is a decorator that can be used to define a factory |
| function for \keyword{with} statement context objects, without |
| needing to create a class or separate \method{__enter__()} and |
| \method{__exit__()} methods. |
| |
| A simple example: |
| |
| \begin{verbatim} |
| from __future__ import with_statement |
| from contextlib import contextfactory |
| |
| @contextfactory |
| def tag(name): |
| print "<%s>" % name |
| yield |
| print "</%s>" % name |
| |
| >>> with tag("h1"): |
| ... print "foo" |
| ... |
| <h1> |
| foo |
| </h1> |
| \end{verbatim} |
| |
| The function being decorated must return a generator-iterator when |
| called. This iterator must yield exactly one value, which will be |
| bound to the targets in the \keyword{with} statement's \keyword{as} |
| clause, if any. |
| |
| At the point where the generator yields, the block nested in the |
| \keyword{with} statement is executed. The generator is then resumed |
| after the block is exited. If an unhandled exception occurs in the |
| block, it is reraised inside the generator at the point where the yield |
| occurred. Thus, you can use a |
| \keyword{try}...\keyword{except}...\keyword{finally} statement to trap |
| the error (if any), or ensure that some cleanup takes place. If an |
| exception is trapped merely in order to log it or to perform some |
| action (rather than to suppress it entirely), the generator must |
| reraise that exception. Otherwise the \keyword{with} statement will |
| treat the exception as having been handled, and resume execution with |
| the statement immediately following the \keyword{with} statement. |
| \end{funcdesc} |
| |
| \begin{funcdesc}{nested}{ctx1\optional{, ctx2\optional{, ...}}} |
| Combine multiple context managers into a single nested context manager. |
| |
| Code like this: |
| |
| \begin{verbatim} |
| from contextlib import nested |
| |
| with nested(A, B, C) as (X, Y, Z): |
| do_something() |
| \end{verbatim} |
| |
| is equivalent to this: |
| |
| \begin{verbatim} |
| with A as X: |
| with B as Y: |
| with C as Z: |
| do_something() |
| \end{verbatim} |
| |
| Note that if the \method{__exit__()} method of one of the nested |
| context objects indicates an exception should be suppressed, no |
| exception information will be passed to any remaining outer context |
| objects. Similarly, if the \method{__exit__()} method of one of the |
| nested context objects raises an exception, any previous exception |
| state will be lost; the new exception will be passed to the |
| \method{__exit__()} methods of any remaining outer context objects. |
| In general, \method{__exit__()} methods should avoid raising |
| exceptions, and in particular they should not re-raise a |
| passed-in exception. |
| \end{funcdesc} |
| |
| \label{context-closing} |
| \begin{funcdesc}{closing}{thing} |
| Return a context that closes \var{thing} upon completion of the |
| block. This is basically equivalent to: |
| |
| \begin{verbatim} |
| from contextlib import contextfactory |
| |
| @contextfactory |
| def closing(thing): |
| try: |
| yield thing |
| finally: |
| thing.close() |
| \end{verbatim} |
| |
| And lets you write code like this: |
| \begin{verbatim} |
| from __future__ import with_statement |
| from contextlib import closing |
| import codecs |
| |
| with closing(urllib.urlopen('http://www.python.org')) as page: |
| for line in page: |
| print line |
| \end{verbatim} |
| |
| without needing to explicitly close \code{page}. Even if an error |
| occurs, \code{page.close()} will be called when the \keyword{with} |
| block is exited. |
| \end{funcdesc} |
| |
| \begin{seealso} |
| \seepep{0343}{The "with" statement} |
| {The specification, background, and examples for the |
| Python \keyword{with} statement.} |
| \end{seealso} |