`not isinstance(float_arg, float)` should narrow to int; `not isinstance(complex_arg, complex)` should narrow to float
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
The typing specs require that a float typed argument also accept int values, and that a complex type argument accept both int and complex values. That implies that, if we have a val typed complex, and isinstance(val, complex) returns false, it can still be an int or float. So,
def test(x: float):
if not isinstance(x, float):
reveal_type(x) # Should reveal int
and,
def test(x: complex):
if not isinstance(x, complex):
reveal_type(x) # Should reveal int | float (or possibly just float)
But they actually get treated as unreachable code and don't reveal anything.
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 reproducing the two snippets from the issue and inspecting the existing type-narrowing tests or implementation that handles isinstance checks. Done means the first example reveals int and the second reveals int | float, or the documented acceptable narrowing, rather than treating the branches as unreachable.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100