pyre-check
pyre-check copied to clipboard
Pyre doesn't understand for-else statement
Pyre Bug
Bug description Pyre doesn't understand meaning of for-else.
Reproduction steps Run pyre-check with following script:
from random import randint
def foo() -> None:
for i in range(randint(1, 10)):
if i % 5 == 0:
my_none: None = None
break
else:
return None
return my_none
Expected behavior
This should pass but not give a false positive: test.py:9:11 Uninitialized local [61]: Local variable `my_none` is undefined, or not always defined.
Logs
$ pyre check
ƛ Found 1 type error!
test.py:9:11 Uninitialized local [61]: Local variable `my_none` is undefined, or not always defined.
Hey @WangGithubUser, thanks for reporting this! I didn't know that for-else loops were a thing until now, it's a cool feature of the language!
As a quick debugging check, I tried doing a similar setup with an if
statement, and it looks like the issue doesn't appear there. My guess is that we have an issue with our control flow graph around for-else statements. I'll add this task to our backlog and we'll take a look.
The error you're seeing is because Pyre isn't sure if the variable my_none is always set before it's used. To fix this error i would suggest you to initialize my_none before the loop:
from random import randint
def foo() -> None: my_none = None # Initialize it here for i in range(randint(1, 10)): if i % 5 == 0: my_none = None break else: return None return my_none
I believe that this should resolve the issue
duplicate of #192