Make most contextmanager __exit__
signatures return Optional[bool]
#3179
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This pull request is a follow-up to python/mypy#7214.
In short, within that mypy issue, we found it would be helpful to determine between contextmanagers that can "swallow" exceptions vs ones that can't. This helps prevent some false positive when using flags that analyze control flow such as
--warn-unreachable
. To do this, Jelle proposed assuming that only contextmanagers where the__exit__
returnsbool
are assumed to swallow exceptions.This unfortunately required the following typeshed changes:
The typing.IO, threading.Lock, and concurrent.futures.Executor were all modified so
__exit__
returnsOptional[None]
instead of None -- along with all of their subclasses.I believe these three types are meant to be subclassed, so I felt picking the more general type was correct.
There were also a few concrete types (e.g. see socketserver, subprocess, ftplib...) that I modified to return
None
-- I checked the source code, and these all seem to return None (and don't appear to be meant to be subclassable).contextlib.suppress was changed to return bool. I also double-checked the unittest modules and modified a subset of those contextmanagers, leaving ones like
_AssertRaisesContext
alone.