meet.is_overlapping_types should be more relaxed for isinstance checks #5529
Labels
needs discussion
priority-1-normal
refactoring
Changing mypy's internals
topic-reachability
Detecting unreachable code
topic-type-narrowing
Conditional type narrowing / binder
Currently, the implementation of
meet.is_overlapping_types(...)
defaults to returning False when it encounters two unexpected types, and doesn't attempt to handle multiple inheritance at all. The current implementation also considers two types likeList[A]
andList[B]
to be non-overlapping, even though they may overlap when both lists are empty.This behavior makes sense when
is_overlapping_types
is used to detect unsafe overload variants, but may be too restrictive/cause branches to be unexpectedly unreachable when used for isinstance checks andif x is None
checks and the like.For more context, see #5476 (comment) and #3603.
Some possible solutions include:
is_overlapping_types
default to returning True, not False. The main disadvantage here is that this would then makeis_overlapping_types
consider two unrelated types likeType[A]
andTypedDict[...]
to be overlapping, which seems wrong.allow_multiple_inheritance
which makes the "if left and right are Instances" case just always return True. The main disadvantage here is that this may not capture every edge case we want to relax.It may also be the case that neither solutions work and a more careful rearrangement of
is_overlapping_types
is necessary. The existing implementation ofis_overlapping_types
is designed to rule out bad combinations/normalize all types toInstance
whenever possible, which may or may not be the correct thing to do for reachability checks.The text was updated successfully, but these errors were encountered: