Skip to content

Commit 48b7542

Browse files
committed
Deduplicate iterable logic
This e.g. makes sure both code paths receive my fix in #15688
1 parent 5783af4 commit 48b7542

File tree

1 file changed

+11
-22
lines changed

1 file changed

+11
-22
lines changed

mypy/checker.py

+11-22
Original file line numberDiff line numberDiff line change
@@ -4653,22 +4653,13 @@ def analyze_async_iterable_item_type(self, expr: Expression) -> tuple[Type, Type
46534653

46544654
def analyze_iterable_item_type(self, expr: Expression) -> tuple[Type, Type]:
46554655
"""Analyse iterable expression and return iterator and iterator item types."""
4656-
echk = self.expr_checker
4657-
iterable = get_proper_type(echk.accept(expr))
4658-
iterator = echk.check_method_call_by_name("__iter__", iterable, [], [], expr)[0]
4659-
4656+
iterator, iterable = self.analyze_iterable_item_type_without_expression(
4657+
self.expr_checker.accept(expr), context=expr
4658+
)
46604659
int_type = self.analyze_range_native_int_type(expr)
46614660
if int_type:
46624661
return iterator, int_type
4663-
4664-
if (
4665-
isinstance(iterable, TupleType)
4666-
and iterable.partial_fallback.type.fullname == "builtins.tuple"
4667-
):
4668-
return iterator, tuple_fallback(iterable).args[0]
4669-
else:
4670-
# Non-tuple iterable.
4671-
return iterator, echk.check_method_call_by_name("__next__", iterator, [], [], expr)[0]
4662+
return iterator, iterable
46724663

46734664
def analyze_iterable_item_type_without_expression(
46744665
self, type: Type, context: Context
@@ -4678,17 +4669,15 @@ def analyze_iterable_item_type_without_expression(
46784669
iterable = get_proper_type(type)
46794670
iterator = echk.check_method_call_by_name("__iter__", iterable, [], [], context)[0]
46804671

4681-
if isinstance(iterable, TupleType):
4682-
joined: Type = UninhabitedType()
4683-
for item in iterable.items:
4684-
joined = join_types(joined, item)
4685-
return iterator, joined
4672+
if (
4673+
isinstance(iterable, TupleType)
4674+
and iterable.partial_fallback.type.fullname == "builtins.tuple"
4675+
):
4676+
return iterator, tuple_fallback(iterable).args[0]
46864677
else:
46874678
# Non-tuple iterable.
4688-
return (
4689-
iterator,
4690-
echk.check_method_call_by_name("__next__", iterator, [], [], context)[0],
4691-
)
4679+
iterable = echk.check_method_call_by_name("__next__", iterator, [], [], context)[0]
4680+
return iterator, iterable
46924681

46934682
def analyze_range_native_int_type(self, expr: Expression) -> Type | None:
46944683
"""Try to infer native int item type from arguments to range(...).

0 commit comments

Comments
 (0)