Skip to content

Commit 295c8e3

Browse files
committed
add support for iterable
1 parent bc8a3ad commit 295c8e3

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

mypy/checker.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2482,17 +2482,38 @@ def check_assignment_to_multiple_lvalues(self, lvalues: List[Lvalue], rvalue: Ex
24822482
# using the type of rhs, because this allowed more fine grained
24832483
# control in cases like: a, b = [int, str] where rhs would get
24842484
# type List[object]
2485-
24862485
rvalues = [] # type: List[Expression]
2486+
lhs_len = len(lvalues)
2487+
idx_of_iterable = []
2488+
item_type_of_iterable = [] # type: List['mypy.types.Type']
2489+
idx = 0
24872490
for rval in rvalue.items:
24882491
if isinstance(rval, StarExpr):
2489-
typs = get_proper_type(self.expr_checker.visit_star_expr(rval).type)
2492+
typs = get_proper_type(self.expr_checker.visit_star_expr(rval).type) # type: ProperType
24902493
if isinstance(typs, TupleType):
24912494
rvalues.extend([TempNode(typ) for typ in typs.items])
2495+
lhs_len -= len(typs.items)
2496+
idx += len(typs.items)
2497+
elif self.type_is_iterable(typs):
2498+
item_type_of_iterable.append(self.iterable_item_type(typs))
2499+
idx_of_iterable.append(idx)
24922500
else:
2493-
rvalues.append(TempNode(typs))
2501+
self.fail("StarExpr should not be a '{}'".format(typs), context)
24942502
else:
24952503
rvalues.append(rval)
2504+
lhs_len -= 1
2505+
idx += 1
2506+
num_every_iterable = 0
2507+
num_last_iterable = 0
2508+
if len(idx_of_iterable):
2509+
num_every_iterable = int(lhs_len / len(idx_of_iterable))
2510+
num_last_iterable = lhs_len - (len(idx_of_iterable) - 1) * int(num_every_iterable)
2511+
for i, (idx, item_type) in enumerate(zip(idx_of_iterable, item_type_of_iterable)):
2512+
if i == (len(idx_of_iterable) - 1):
2513+
rvalues[idx:idx] = [TempNode(item_type) for _ in range(num_last_iterable)]
2514+
else:
2515+
rvalues[idx:idx] = [TempNode(item_type) for _ in range(num_every_iterable)]
2516+
24962517
if self.check_rvalue_count_in_assignment(lvalues, len(rvalues), context):
24972518
star_index = next((i for i, lv in enumerate(lvalues) if
24982519
isinstance(lv, StarExpr)), len(lvalues))

test-data/unit/check-tuples.test

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,8 +1423,26 @@ t6: Tuple[int, int, int, int, int, int, int, int, int, int, int, int] = (1, 2, 3
14231423
[builtins fixtures/tuple.pyi]
14241424

14251425
[case testTupleWithStarExpr]
1426-
from typing import Tuple
1427-
points = (1, 2) # type: Tuple[int, int]
1426+
from typing import Tuple, List
1427+
points = (1, "test") # type: Tuple[int, str]
14281428
x, y, z = *points, 0
1429+
reveal_type(x) # N: Revealed type is 'builtins.int'
1430+
reveal_type(y) # N: Revealed type is 'builtins.str'
1431+
reveal_type(z) # N: Revealed type is 'builtins.int'
1432+
1433+
points2 = [1,2]
1434+
x2, y2, z2= *points2, "test"
1435+
1436+
reveal_type(x2) # N: Revealed type is 'builtins.int*'
1437+
reveal_type(y2) # N: Revealed type is 'builtins.int*'
1438+
reveal_type(z2) # N: Revealed type is 'builtins.str'
1439+
1440+
x3, x4, y3, y4, z3 = *points, *points2, "test"
1441+
1442+
reveal_type(x3) # N: Revealed type is 'builtins.int'
1443+
reveal_type(x4) # N: Revealed type is 'builtins.str'
1444+
reveal_type(y3) # N: Revealed type is 'builtins.int*'
1445+
reveal_type(y4) # N: Revealed type is 'builtins.int*'
1446+
reveal_type(z3) # N: Revealed type is 'builtins.str'
14291447

14301448
[builtins fixtures/tuple.pyi]

0 commit comments

Comments
 (0)