Fixed a bug that led to a false positive error about an "unknown type" in certain cases when using an assignment expression (walrus operator) in a loop. This addresses https://github.com/microsoft/pyright/issues/4557.

This commit is contained in:
Eric Traut 2023-01-31 16:52:11 -08:00
parent 1d461eac65
commit bee1466d4a
3 changed files with 35 additions and 2 deletions

View File

@ -1113,7 +1113,7 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
assignTypeToExpression(
node.leftExpression,
typeResult.type,
/* isTypeIncomplete */ false,
!!typeResult.isIncomplete,
node.rightExpression,
/* ignoreEmptyContainers */ true,
/* allowAssignmentToFinalVar */ true
@ -1126,7 +1126,7 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
assignTypeToExpression(
node.name,
typeResult.type,
/* isTypeIncomplete */ false,
!!typeResult.isIncomplete,
node.rightExpression,
/* ignoreEmptyContainers */ true
);

View File

@ -0,0 +1,27 @@
# This sample tests the case where an assignment expression
# is used within a looping construct such that the assigned
# value is initially unknown.
# pyright: strict
from typing import Iterator
for _ in ["1"]:
old_lines: Iterator[str] = iter(["2", "3"])
try:
while True:
line = next(old_lines)
count = 1
if count:
while True:
if not (line := next(old_lines)):
pass
elif line.startswith(""):
print(line.removeprefix(""))
else:
old_lines = iter([line] + list(old_lines))
break
except StopIteration:
pass

View File

@ -926,6 +926,12 @@ test('CodeFlow7', () => {
TestUtils.validateResults(analysisResults, 0);
});
test('CodeFlow8', () => {
const analysisResults = TestUtils.typeAnalyzeSampleFiles(['codeFlow8.py']);
TestUtils.validateResults(analysisResults, 0);
});
test('CapturedVariable1', () => {
const analysisResults = TestUtils.typeAnalyzeSampleFiles(['capturedVariable1.py']);