From a37543f242625fa199a10ec8a4a64f1d021a530b Mon Sep 17 00:00:00 2001 From: Joachim Jablon Date: Thu, 17 Mar 2016 00:25:34 +0100 Subject: [PATCH] Fixes #686 --- docs/writing/structure.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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