Skip to content

Commit 9a4cfae

Browse files
onlinedilevkivskyi
authored andcommitted
Fix crash when a star expression is used in isinstance (#6659)
Fixes #4986.
1 parent 75d4686 commit 9a4cfae

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

mypy/checker.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3945,6 +3945,8 @@ def flatten(t: Expression) -> List[Expression]:
39453945
"""Flatten a nested sequence of tuples/lists into one list of nodes."""
39463946
if isinstance(t, TupleExpr) or isinstance(t, ListExpr):
39473947
return [b for a in t.items for b in flatten(a)]
3948+
elif isinstance(t, StarExpr):
3949+
return flatten(t.expr)
39483950
else:
39493951
return [t]
39503952

test-data/unit/check-isinstance.test

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2207,3 +2207,29 @@ def bar(x: Union[List[str], List[int], None]) -> None:
22072207
assert isinstance(x, list)
22082208
reveal_type(x) # E: Revealed type is 'Union[builtins.list[builtins.str], builtins.list[builtins.int]]'
22092209
[builtins fixtures/isinstancelist.pyi]
2210+
2211+
[case testIsInstanceWithStarExpression]
2212+
from typing import Union, List, Tuple
2213+
2214+
def f(var: Union[List[str], Tuple[str, str], str]) -> None:
2215+
reveal_type(var) # E: Revealed type is 'Union[builtins.list[builtins.str], Tuple[builtins.str, builtins.str], builtins.str]'
2216+
if isinstance(var, (list, *(str, int))):
2217+
reveal_type(var) # E: Revealed type is 'Union[builtins.list[builtins.str], builtins.str]'
2218+
[builtins fixtures/isinstancelist.pyi]
2219+
2220+
[case testIsInstanceWithStarExpressionAndVariable]
2221+
from typing import Union
2222+
2223+
def f(var: Union[int, str]) -> None:
2224+
reveal_type(var) # E: Revealed type is 'Union[builtins.int, builtins.str]'
2225+
some_types = (str, tuple)
2226+
another_type = list
2227+
if isinstance(var, (*some_types, another_type)):
2228+
reveal_type(var) # E: Revealed type is 'builtins.str'
2229+
[builtins fixtures/isinstancelist.pyi]
2230+
2231+
[case testIsInstanceWithWrongStarExpression]
2232+
var = 'some string'
2233+
if isinstance(var, *(str, int)): # E: Too many arguments for "isinstance"
2234+
pass
2235+
[builtins fixtures/isinstancelist.pyi]

0 commit comments

Comments
 (0)