You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Are you reporting a bug, or opening a feature request?: bug
What is the actual behavior/output?
Given the following (cut down) loop code, mypy identifies incorrectly that the print statement cannot be reached.
last=Nonereveal_type(last) # Revealed type is 'None'forvalinrange(10):
reveal_type(last) # Revealed type is 'None'iflastisnotNoneandlast<2:
print("apparently unreachable")
reveal_type(last) # no outputreveal_type(last) # Revealed type is 'None'last=valreveal_type(last) # Revealed type is 'builtins.int*'
My original code also used the value of last within the conditional; that was also warned about being not evaluated.
Notably, running mypy --no-warn-unreachable still doesn't give any output for the reveal_type in the if branch.
Happily this issue can be worked around by adding an explicit Optional[int] annotation to last.
What is the behavior/output you expect?
I think mypy should consider last to be Optional[int] in the early part of the loop, rather than just being None. That would fix the unreachable warning as well as potentially being more correct.
Within the if last is not None branch, last should be of type int.
What are the versions of mypy and Python you are using? mypy 0.770, Python 3.5.2
Do you see the same issue after installing mypy from Git master? yes (tested at 125728a)
What are the mypy flags you are using? --warn-unreachable
This seems pretty bad, as it can result in false negatives. Mypy should give an error when reading the value of last before it has a non-None type, at least within a loop.
Activity
Explicitly type this variable
JukkaL commentedon May 1, 2020
This seems pretty bad, as it can result in false negatives. Mypy should give an error when reading the value of
lastbefore it has a non-Nonetype, at least within a loop.sbalmer commentedon Mar 9, 2021
I think #8865 is about the same problem.
davidhalter commentedon Aug 4, 2024
False positives are also possible without partials, see for example:
https://mypy-play.net/?mypy=latest&python=3.12&flags=warn-unreachable&gist=10808f2ddaa8e35da240e50b068104f3
Avoid false `unreachable` and `redundant-expr` warnings in loops.
Avoid false `unreachable` and `redundant-expr` warnings in loops. (py…