meet.is_overlapping_types should be more relaxed for isinstance checks
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
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 like List[A] and List[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 and if x is None checks and the like.
For more context, see https://github.com/python/mypy/pull/5476#discussion_r211030040 and https://github.com/python/mypy/issues/3603.
Some possible solutions include:
- Add a flag that makes
is_overlapping_typesdefault to returning True, not False. The main disadvantage here is that this would then makeis_overlapping_typesconsider two unrelated types likeType[A]andTypedDict[...]to be overlapping, which seems wrong. - Add a flag named
allow_multiple_inheritancewhich 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 of is_overlapping_types is designed to rule out bad combinations/normalize all types to Instance whenever possible, which may or may not be the correct thing to do for reachability checks.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading the implementation of meet.is_overlapping_types and the discussion in PR 5476 and issue 3603. Compare its current behavior for unexpected types, multiple inheritance, and List[A] versus List[B], then determine which reachability behavior is intended. Done requires a decided approach that relaxes isinstance and None checks without incorrectly broadening overload-safety checks.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- compilers
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100