Search code examples
pythonreturnwith-statement

In Python, if I return inside a "with" block, will the file still close?


Consider the following:

with open(path, mode) as f:
    return [line for line in f if condition]

Will the file be closed properly, or does using return somehow bypass the context manager?


Solution

  • Yes, it acts like the finally block after a try block, i.e. it always executes (unless the python process terminates in an unusual way of course).

    It is also mentioned in one of the examples of PEP-343 which is the specification for the with statement:

    with locked(myLock):
        # Code here executes with myLock held.  The lock is
        # guaranteed to be released when the block is left (even
        # if via return or by an uncaught exception).
    

    Something worth mentioning is however, that you cannot easily catch exceptions thrown by the open() call without putting the whole with block inside a try..except block which is usually not what one wants.