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:
True
: the exception is gracefully handled.with
statement raises the exceptionI 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,
type
will naturally be None
, so __exit__
returns true. Nothing is raised.type
is set to the actual exception type, so __exit__
returns false. The exception is raised as is.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?).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With