Loosen Mapping.update() overloads a little (#14593)

This commit is contained in:
Alex Waygood
2025-08-19 19:54:03 +01:00
committed by GitHub
parent ab0968b416
commit 8a56044cd6
4 changed files with 21 additions and 8 deletions
@@ -4,6 +4,10 @@ import os
from typing import Any, Dict, Generic, Iterable, Mapping, TypeVar, Union
from typing_extensions import Self, assert_type
###################################################################
# Note: tests for `dict.update()` are in `check_MutableMapping.py`.
###################################################################
# These do follow `__init__` overloads order:
# mypy and pyright have different opinions about this one:
# mypy raises: 'Need type annotation for "bad"'
@@ -1,6 +1,6 @@
from __future__ import annotations
from typing import Any, Union
from typing import Any, Hashable, Sequence, Union
from typing_extensions import assert_type
@@ -30,6 +30,15 @@ def check_update_method__str_key() -> None:
d.update([("", "")]) # type: ignore
def test_keywords_allowed_on_dict_update_where_key_type_is_str_supertype(
a: dict[object, Any], b: dict[Hashable, Any], c: dict[Sequence[str], Any], d: dict[str, Any]
) -> None:
a.update(keyword_args_are_accepted="whatever")
b.update(here_too="whooo")
c.update(and_here="hooray")
d.update(also_here="yay")
def check_setdefault_method() -> None:
d: dict[int, str] = {}
d2: dict[int, str | None] = {}
+4 -4
View File
@@ -5,7 +5,7 @@ import collections # noqa: F401 # pyright: ignore[reportUnusedImport]
import sys
import typing_extensions
from _collections_abc import dict_items, dict_keys, dict_values
from _typeshed import IdentityFunction, ReadableBuffer, SupportsGetItemViewable, SupportsKeysAndGetItem, Viewable
from _typeshed import IdentityFunction, ReadableBuffer, SupportsGetItem, SupportsGetItemViewable, SupportsKeysAndGetItem, Viewable
from abc import ABCMeta, abstractmethod
from re import Match as Match, Pattern as Pattern
from types import (
@@ -801,13 +801,13 @@ class MutableMapping(Mapping[_KT, _VT]):
@overload
def update(self, m: SupportsKeysAndGetItem[_KT, _VT], /) -> None: ...
@overload
def update(self: Mapping[str, _VT], m: SupportsKeysAndGetItem[str, _VT], /, **kwargs: _VT) -> None: ...
def update(self: SupportsGetItem[str, _VT], m: SupportsKeysAndGetItem[str, _VT], /, **kwargs: _VT) -> None: ...
@overload
def update(self, m: Iterable[tuple[_KT, _VT]], /) -> None: ...
@overload
def update(self: Mapping[str, _VT], m: Iterable[tuple[str, _VT]], /, **kwargs: _VT) -> None: ...
def update(self: SupportsGetItem[str, _VT], m: Iterable[tuple[str, _VT]], /, **kwargs: _VT) -> None: ...
@overload
def update(self: Mapping[str, _VT], **kwargs: _VT) -> None: ...
def update(self: SupportsGetItem[str, _VT], **kwargs: _VT) -> None: ...
Text = str
+3 -3
View File
@@ -1,4 +1,4 @@
from _typeshed import SupportsKeysAndGetItem
from _typeshed import SupportsGetItem, SupportsKeysAndGetItem
from _typeshed.wsgi import WSGIEnvironment
from collections.abc import Collection, Iterable, Iterator, MutableMapping
from typing import Literal, Protocol, TypeVar, overload, type_check_only
@@ -73,11 +73,11 @@ class MultiDict(MutableMapping[_KT, _VT]):
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
def popitem(self) -> tuple[_KT, _VT]: ...
@overload # type: ignore[override]
def update(self: MultiDict[str, _VT], **kwargs: _VT) -> None: ...
def update(self: SupportsGetItem[str, _VT], **kwargs: _VT) -> None: ...
@overload
def update(self, m: Collection[tuple[_KT, _VT]], /) -> None: ...
@overload
def update(self: MultiDict[str, _VT], m: Collection[tuple[str, _VT]], /, **kwargs: _VT) -> None: ...
def update(self: SupportsGetItem[str, _VT], m: Collection[tuple[str, _VT]], /, **kwargs: _VT) -> None: ...
@overload
def extend(self, other: _SupportsItemsWithIterableResult[_KT, _VT]) -> None: ...
@overload