Commit f7e60a69 authored by Tal Einat's avatar Tal Einat Committed by GitHub

[2.7] bpo-33468: Add try-finally contextlib.contextmanager example (GH-7816) (GH-8427)

(cherry picked from commit bde782bb)
Co-authored-by: default avatarMatthias Bussonnier <bussonniermatthias@gmail.com>
parent fbcb6fae
...@@ -24,22 +24,28 @@ Functions provided: ...@@ -24,22 +24,28 @@ Functions provided:
function for :keyword:`with` statement context managers, without needing to function for :keyword:`with` statement context managers, without needing to
create a class or separate :meth:`__enter__` and :meth:`__exit__` methods. create a class or separate :meth:`__enter__` and :meth:`__exit__` methods.
A simple example (this is not recommended as a real way of generating HTML!):: While many objects natively support use in with statements, sometimes a
resource needs to be managed that isn't a context manager in its own right,
and doesn't implement a ``close()`` method for use with ``contextlib.closing``
An abstract example would be the following to ensure correct resource
management::
from contextlib import contextmanager from contextlib import contextmanager
@contextmanager @contextmanager
def tag(name): def managed_resource(*args, **kwds):
print "<%s>" % name # Code to acquire resource, e.g.:
yield resource = acquire_resource(*args, **kwds)
print "</%s>" % name try:
yield resource
>>> with tag("h1"): finally:
... print "foo" # Code to release resource, e.g.:
... release_resource(resource)
<h1>
foo >>> with managed_resource(timeout=3600) as resource:
</h1> ... # Resource is released at the end of this block,
... # even if code in the block raises an exception
The function being decorated must return a :term:`generator`-iterator when The function being decorated must return a :term:`generator`-iterator when
called. This iterator must yield exactly one value, which will be bound to called. This iterator must yield exactly one value, which will be bound to
......
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