diff --git a/docs/writing/structure.rst b/docs/writing/structure.rst index 7cde9daa1..6448dba77 100644 --- a/docs/writing/structure.rst +++ b/docs/writing/structure.rst @@ -658,8 +658,10 @@ And now the generator approach using Python's own @contextmanager def custom_open(filename): f = open(filename) - yield f - f.close() + try: + yield f + finally: + f.close() with custom_open('file') as f: contents = f.read() @@ -667,7 +669,9 @@ And now the generator approach using Python's own This works in exactly the same way as the class example above, albeit it's more terse. The ``custom_open`` function executes until it reaches the ``yield`` statement. It then gives control back to the ``with`` statement, which assigns -whatever was ``yield``'ed to `f` in the ``as f`` portion. +whatever was ``yield``'ed to `f` in the ``as f`` portion. The ``finally`` clause +ensures that ``close()`` is called whether or not there was an exception inside +the ``with``. Since the two approaches appear the same, we should follow the Zen of Python to decide when to use which. The class approach might be better if there's