diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index f8b2fc4e7971..67c525bec613 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -6013,7 +6013,9 @@ def visit_dictionary_comprehension(self, e: DictionaryComprehension) -> Type: ) if e.key is None: # Logic and motivation here is similar to check_generator_or_comprehension(). - arg_types = [self.chk.named_generic_type("typing.Mapping", [ktdef, vtdef])] + arg_types = [ + self.chk.named_generic_type("_typeshed.SupportsKeysAndGetItem", [ktdef, vtdef]) + ] arg_kinds = [nodes.ARG_POS] arg_names = [None] args = [e.value] diff --git a/test-data/unit/check-python315.test b/test-data/unit/check-python315.test index 3de9f4780acf..cf1f80fcda43 100644 --- a/test-data/unit/check-python315.test +++ b/test-data/unit/check-python315.test @@ -5,7 +5,7 @@ def test(x: list[list[int]], y: list[dict[str, int]]) -> None: reveal_type([*i for i in x]) # N: Revealed type is "builtins.list[builtins.int]" reveal_type({*i for i in x}) # N: Revealed type is "builtins.set[builtins.int]" reveal_type({**d for d in y}) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" -[builtins fixtures/isinstancelist.pyi] +[builtins fixtures/primitives.pyi] [case testStarUnpackInComprehensionBasicsOld] # flags: --no-native-parser @@ -14,11 +14,23 @@ def test(x: list[list[int]], y: list[dict[str, int]]) -> None: reveal_type([*i for i in x]) # N: Revealed type is "builtins.list[builtins.int]" reveal_type({*i for i in x}) # N: Revealed type is "builtins.set[builtins.int]" reveal_type({**d for d in y}) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" -[builtins fixtures/isinstancelist.pyi] +[builtins fixtures/primitives.pyi] [case testStarUnpackInComprehensionUnion] def test(x: list[list[int]] | list[list[str]], y: list[dict[str, int]] | list[dict[str, str]]) -> None: reveal_type([*i for i in x]) # N: Revealed type is "builtins.list[builtins.int | builtins.str]" reveal_type({*i for i in x}) # N: Revealed type is "builtins.set[builtins.int | builtins.str]" reveal_type({**d for d in y}) # N: Revealed type is "builtins.dict[builtins.str | builtins.str, builtins.int | builtins.str]" -[builtins fixtures/isinstancelist.pyi] +[builtins fixtures/primitives.pyi] + +[case testDoubleStarUnpackInComprehensionStructuralMapping] +class MappingLike: + def keys(self) -> list[str]: + return ["key"] + def __getitem__(self, key: str) -> int: + return 1 + +def test(xs: list[MappingLike]) -> dict[str, int]: + reveal_type({**x for x in xs}) # N: Revealed type is "builtins.dict[builtins.str, builtins.int]" + return {**x for x in xs} +[builtins fixtures/primitives.pyi]