diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 3ea823af4a5b..274e227a3494 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -21,7 +21,7 @@ from _typeshed import ( ) from ast import AST, mod from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper -from types import CodeType, TracebackType +from types import CodeType, MappingProxyType, TracebackType from typing import ( IO, AbstractSet, @@ -73,6 +73,8 @@ _T_co = TypeVar("_T_co", covariant=True) _T_contra = TypeVar("_T_contra", contravariant=True) _KT = TypeVar("_KT") _VT = TypeVar("_VT") +_KT_co = TypeVar("_KT_co", covariant=True) # Key type covariant containers. +_VT_co = TypeVar("_VT_co", covariant=True) # Value type covariant containers. _S = TypeVar("_S") _T1 = TypeVar("_T1") _T2 = TypeVar("_T2") @@ -787,6 +789,20 @@ class list(MutableSequence[_T], Generic[_T]): if sys.version_info >= (3, 9): def __class_getitem__(cls, item: Any) -> GenericAlias: ... +class _dict_keys(KeysView[_KT_co], Generic[_KT_co, _VT_co]): + if sys.version_info >= (3, 10): + mapping: MappingProxyType[_KT_co, _VT_co] + +# The generics are the wrong way around because of a mypy limitation +# https://github.com/python/mypy/issues/11138 +class _dict_values(ValuesView[_VT_co], Generic[_VT_co, _KT_co]): + if sys.version_info >= (3, 10): + mapping: MappingProxyType[_KT_co, _VT_co] + +class _dict_items(ItemsView[_KT_co, _VT_co], Generic[_KT_co, _VT_co]): + if sys.version_info >= (3, 10): + mapping: MappingProxyType[_KT_co, _VT_co] + class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]): @overload def __init__(self: dict[_KT, _VT]) -> None: ... @@ -807,9 +823,9 @@ class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]): def update(self, __m: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ... @overload def update(self, **kwargs: _VT) -> None: ... - def keys(self) -> KeysView[_KT]: ... - def values(self) -> ValuesView[_VT]: ... - def items(self) -> ItemsView[_KT, _VT]: ... + def keys(self) -> _dict_keys[_KT, _VT]: ... + def values(self) -> _dict_values[_VT, _KT]: ... + def items(self) -> _dict_items[_KT, _VT]: ... @classmethod @overload def fromkeys(cls, __iterable: Iterable[_T], __value: None = ...) -> dict[_T, Any | None]: ... diff --git a/stdlib/collections/__init__.pyi b/stdlib/collections/__init__.pyi index 253e06077496..2cfd187eb35a 100644 --- a/stdlib/collections/__init__.pyi +++ b/stdlib/collections/__init__.pyi @@ -1,21 +1,10 @@ import sys from _typeshed import Self +from builtins import _dict_items, _dict_keys, _dict_values from typing import Any, Dict, Generic, NoReturn, Tuple, Type, TypeVar, overload if sys.version_info >= (3, 10): - from typing import ( - Callable, - ItemsView, - Iterable, - Iterator, - KeysView, - Mapping, - MutableMapping, - MutableSequence, - Reversible, - Sequence, - ValuesView, - ) + from typing import Callable, Iterable, Iterator, Mapping, MutableMapping, MutableSequence, Reversible, Sequence else: from _collections_abc import * @@ -23,6 +12,8 @@ _S = TypeVar("_S") _T = TypeVar("_T") _KT = TypeVar("_KT") _VT = TypeVar("_VT") +_KT_co = TypeVar("_KT_co", covariant=True) +_VT_co = TypeVar("_VT_co", covariant=True) # namedtuple is special-cased in the type checker; the initializer is ignored. if sys.version_info >= (3, 7): @@ -247,23 +238,25 @@ class Counter(Dict[_T, int], Generic[_T]): def __iand__(self, other: Counter[_T]) -> Counter[_T]: ... def __ior__(self, other: Counter[_T]) -> Counter[_T]: ... # type: ignore -class _OrderedDictKeysView(KeysView[_KT], Reversible[_KT]): - def __reversed__(self) -> Iterator[_KT]: ... +class _OrderedDictKeysView(_dict_keys[_KT_co, _VT_co], Reversible[_KT_co]): + def __reversed__(self) -> Iterator[_KT_co]: ... -class _OrderedDictItemsView(ItemsView[_KT, _VT], Reversible[Tuple[_KT, _VT]]): - def __reversed__(self) -> Iterator[Tuple[_KT, _VT]]: ... +class _OrderedDictItemsView(_dict_items[_KT_co, _VT_co], Reversible[Tuple[_KT_co, _VT_co]]): + def __reversed__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ... -class _OrderedDictValuesView(ValuesView[_VT], Reversible[_VT]): - def __reversed__(self) -> Iterator[_VT]: ... +# The generics are the wrong way around because of a mypy limitation +# https://github.com/python/mypy/issues/11138 +class _OrderedDictValuesView(_dict_values[_VT_co, _KT_co], Reversible[_VT_co], Generic[_VT_co, _KT_co]): + def __reversed__(self) -> Iterator[_VT_co]: ... class OrderedDict(Dict[_KT, _VT], Reversible[_KT], Generic[_KT, _VT]): def popitem(self, last: bool = ...) -> Tuple[_KT, _VT]: ... def move_to_end(self, key: _KT, last: bool = ...) -> None: ... def copy(self: _S) -> _S: ... def __reversed__(self) -> Iterator[_KT]: ... - def keys(self) -> _OrderedDictKeysView[_KT]: ... + def keys(self) -> _OrderedDictKeysView[_KT, _VT]: ... def items(self) -> _OrderedDictItemsView[_KT, _VT]: ... - def values(self) -> _OrderedDictValuesView[_VT]: ... + def values(self) -> _OrderedDictValuesView[_VT, _KT]: ... class defaultdict(Dict[_KT, _VT], Generic[_KT, _VT]): default_factory: Callable[[], _VT] | None