From 139eba3d97dce05216251d7d34365cc2b1d37e4c Mon Sep 17 00:00:00 2001 From: STerliakov Date: Sun, 2 Nov 2025 15:02:48 +0100 Subject: [PATCH] Do not write "final" cache results for fast containers inside lambdas --- mypy/checkexpr.py | 10 ++++++++-- test-data/unit/check-inference-context.test | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 3eb54579a050..d87b8dc8c95a 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -5082,7 +5082,10 @@ def fast_container_type( self.resolved_type[e] = NoneType() return None ct = self.chk.named_generic_type(container_fullname, [vt]) - self.resolved_type[e] = ct + if not self.in_lambda_expr: + # We cannot cache results in lambdas - their bodies can be accepted in + # error-suppressing watchers too early + self.resolved_type[e] = ct return ct def _first_or_join_fast_item(self, items: list[Type]) -> Type | None: @@ -5317,7 +5320,10 @@ def fast_dict_type(self, e: DictExpr) -> Type | None: self.resolved_type[e] = NoneType() return None dt = self.chk.named_generic_type("builtins.dict", [kt, vt]) - self.resolved_type[e] = dt + if not self.in_lambda_expr: + # We cannot cache results in lambdas - their bodies can be accepted in + # error-suppressing watchers too early + self.resolved_type[e] = dt return dt def check_typeddict_literal_in_context( diff --git a/test-data/unit/check-inference-context.test b/test-data/unit/check-inference-context.test index a41ee5f59670..b5b5d778d90f 100644 --- a/test-data/unit/check-inference-context.test +++ b/test-data/unit/check-inference-context.test @@ -709,6 +709,20 @@ f( A(), r=B()) [builtins fixtures/isinstance.pyi] +[case testLambdaWithFastContainerType] +from collections.abc import Callable +from typing import Never, TypeVar + +T = TypeVar("T") + +def f(a: Callable[[], T]) -> None: ... + +def foo(x: str) -> Never: ... + +f(lambda: [foo(0)]) # E: Argument 1 to "foo" has incompatible type "int"; expected "str" +f(lambda: {"x": foo(0)}) # E: Argument 1 to "foo" has incompatible type "int"; expected "str" +[builtins fixtures/tuple.pyi] + -- Overloads + generic functions -- -----------------------------