Return value of __exit__

contextmanager, python, with-statement

Solution

Yes, that return statement is redundant. Only when `type` is not `None` does the return value matter.

From the `object.__exit__()` documentation:

If an exception is supplied, and the method wishes to suppress the exception (i.e., prevent it from being propagated), it should return a true value. Otherwise, the exception will be processed normally upon exit from this method.

Note that a true value will suppress the exception; so `1` or `"Handled!"` would also work, not just `True`.

Removing that `return` line would result in `None` being returned instead, and the functionality would remain unchanged. Readability would be improved however, because that `return type == None` statement is just confusing on multiple levels (why not use `type is None` for example?).

Problem

I understand that `__enter__` and `__exit__` are used to implement a context manager. if an exception occurs in a `with` statement, the exception's type, value and traceback are passed to the `__exit__` method. `__exit__` can handle the exception: - Returning `True`: the exception is gracefully handled. - Returning anything else: the `with` statement raises the exception I came across the following `__exit__` method. Is the return statement redundant? ``` def __exit__(self, type, value, traceback): self.close() return type == None ``` since it seems to me that, - If no exception occurred, `type` will naturally be `None`, so `__exit__` returns true. Nothing is raised. - If an exception did occur, `type` is set to the actual exception type, so `__exit__` returns false. The exception is raised as is.

Original source