## The `with` statement

The `with` statement is used to wrap the execution of a block with methods defined by a context manager (see section With Statement Context Managers). This allows common `try`...`except`...`finally` usage patterns to be encapsulated for convenient reuse.

    with_stmt ::=  "with" with_item ("," with_item)* ":" suite
    with_item ::=  expression ["as" target]

The execution of the `with` statement with one “item” proceeds as follows:

1. The context expression (the expression given in the `with_item`) is evaluated to obtain a context manager.

2. The context manager’s `__exit__()` is loaded for later use.

3. The context manager’s `__enter__()` method is invoked.

4. If a target was included in the `with` statement, the return value from `__enter__()` is assigned to it.

   Note

   The `with` statement guarantees that if the `__enter__()` method returns without an error, then `__exit__()` will always be called. Thus, if an error occurs during the assignment to the target list, it will be treated the same as an error occurring within the suite would be. See step 6 below.

5. The suite is executed.

6. The context manager’s `__exit__()` method is invoked. If an exception caused the suite to be exited, its type, value, and traceback are passed as arguments to `__exit__()`. Otherwise, three `None` arguments are supplied.

   If the suite was exited due to an exception, and the return value from the `__exit__()` method was false, the exception is reraised. If the return value was true, the exception is suppressed, and execution continues with the statement following the `with` statement.

   If the suite was exited for any reason other than an exception, the return value from `__exit__()` is ignored, and execution proceeds at the normal location for the kind of exit that was taken.

With more than one item, the context managers are processed as if multiple `with` statements were nested:

    with A() as a, B() as b:
        suite

is equivalent to

    with A() as a:
        with B() as b:
            suite

Changed in version 3.1: Support for multiple context expressions.

See also

PEP 0343 - The “with” statement
  The specification, background, and examples for the Python `with` statement.