From b98cceee74b9a7711bb9e509e21d0ae4aa19fdc8 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Wed, 13 Nov 2024 12:20:57 +0100 Subject: [PATCH 1/4] replace slice with IndexSlice --- stdlib/_ctypes.pyi | 6 +++--- stdlib/_operator.pyi | 8 ++++---- stdlib/_typeshed/__init__.pyi | 7 +++++-- stdlib/array.pyi | 6 +++--- stdlib/builtins.pyi | 26 +++++++++++++------------- stdlib/collections/__init__.pyi | 8 ++++---- stdlib/typing.pyi | 10 +++++----- 7 files changed, 37 insertions(+), 34 deletions(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index 35c77619d474..85997c718035 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -130,7 +130,7 @@ class _Pointer(_PointerLike, _CData, Generic[_CT], metaclass=_PyCPointerType): @overload def __getitem__(self, key: int, /) -> Any: ... @overload - def __getitem__(self, key: slice, /) -> list[Any]: ... + def __getitem__(self, key: IndexSlice, /) -> list[Any]: ... def __setitem__(self, key: int, value: Any, /) -> None: ... if sys.version_info < (3, 14): @@ -313,11 +313,11 @@ class Array(_CData, Generic[_CT], metaclass=_PyCArrayType): @overload def __getitem__(self, key: int, /) -> Any: ... @overload - def __getitem__(self, key: slice, /) -> list[Any]: ... + def __getitem__(self, key: IndexSlice, /) -> list[Any]: ... @overload def __setitem__(self, key: int, value: Any, /) -> None: ... @overload - def __setitem__(self, key: slice, value: Iterable[Any], /) -> None: ... + def __setitem__(self, key: IndexSlice, value: Iterable[Any], /) -> None: ... def __iter__(self) -> Iterator[Any]: ... # Can't inherit from Sized because the metaclass conflict between # Sized and _CData prevents using _CDataMeta. diff --git a/stdlib/_operator.pyi b/stdlib/_operator.pyi index 967215d8fa21..e72922976521 100644 --- a/stdlib/_operator.pyi +++ b/stdlib/_operator.pyi @@ -1,5 +1,5 @@ import sys -from _typeshed import SupportsGetItem +from _typeshed import IndexSlice, SupportsGetItem from collections.abc import Callable, Container, Iterable, MutableMapping, MutableSequence, Sequence from operator import attrgetter as attrgetter, itemgetter as itemgetter, methodcaller as methodcaller from typing import Any, AnyStr, Protocol, SupportsAbs, SupportsIndex, TypeVar, overload @@ -75,18 +75,18 @@ def countOf(a: Iterable[object], b: object, /) -> int: ... @overload def delitem(a: MutableSequence[Any], b: SupportsIndex, /) -> None: ... @overload -def delitem(a: MutableSequence[Any], b: slice, /) -> None: ... +def delitem(a: MutableSequence[Any], b: IndexSlice, /) -> None: ... @overload def delitem(a: MutableMapping[_K, Any], b: _K, /) -> None: ... @overload -def getitem(a: Sequence[_T], b: slice, /) -> Sequence[_T]: ... +def getitem(a: Sequence[_T], b: IndexSlice, /) -> Sequence[_T]: ... @overload def getitem(a: SupportsGetItem[_K, _V], b: _K, /) -> _V: ... def indexOf(a: Iterable[_T], b: _T, /) -> int: ... @overload def setitem(a: MutableSequence[_T], b: SupportsIndex, c: _T, /) -> None: ... @overload -def setitem(a: MutableSequence[_T], b: slice, c: Sequence[_T], /) -> None: ... +def setitem(a: MutableSequence[_T], b: IndexSlice, c: Sequence[_T], /) -> None: ... @overload def setitem(a: MutableMapping[_K, _V], b: _K, c: _V, /) -> None: ... def length_hint(obj: object, default: int = 0, /) -> int: ... diff --git a/stdlib/_typeshed/__init__.pyi b/stdlib/_typeshed/__init__.pyi index f322244016dd..19c41a5054d1 100644 --- a/stdlib/_typeshed/__init__.pyi +++ b/stdlib/_typeshed/__init__.pyi @@ -70,6 +70,9 @@ MaybeNone: TypeAlias = Any # stable # def foo(x: int | None | _SentinelType = ...) -> None: ... sentinel: Any +IndexSlice: TypeAlias = slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | None] +IntSlice: TypeAlias = slice[int | None, int | None, int | None] + # stable class IdentityFunction(Protocol): def __call__(self, x: _T, /) -> _T: ... @@ -284,7 +287,7 @@ WriteableBuffer: TypeAlias = Buffer ReadableBuffer: TypeAlias = Buffer # stable class SliceableBuffer(Buffer, Protocol): - def __getitem__(self, slice: slice, /) -> Sequence[int]: ... + def __getitem__(self, slice: IndexSlice, /) -> Sequence[int]: ... class IndexableBuffer(Buffer, Protocol): def __getitem__(self, i: int, /) -> int: ... @@ -292,7 +295,7 @@ class IndexableBuffer(Buffer, Protocol): class SupportsGetItemBuffer(SliceableBuffer, IndexableBuffer, Protocol): def __contains__(self, x: Any, /) -> bool: ... @overload - def __getitem__(self, slice: slice, /) -> Sequence[int]: ... + def __getitem__(self, slice: IndexSlice, /) -> Sequence[int]: ... @overload def __getitem__(self, i: int, /) -> int: ... diff --git a/stdlib/array.pyi b/stdlib/array.pyi index bd96c9bc2d31..2149d385475d 100644 --- a/stdlib/array.pyi +++ b/stdlib/array.pyi @@ -62,12 +62,12 @@ class array(MutableSequence[_T]): @overload def __getitem__(self, key: SupportsIndex, /) -> _T: ... @overload - def __getitem__(self, key: slice, /) -> array[_T]: ... + def __getitem__(self, key: IndexSlice, /) -> array[_T]: ... @overload # type: ignore[override] def __setitem__(self, key: SupportsIndex, value: _T, /) -> None: ... @overload - def __setitem__(self, key: slice, value: array[_T], /) -> None: ... - def __delitem__(self, key: SupportsIndex | slice, /) -> None: ... + def __setitem__(self, key: IndexSlice, value: array[_T], /) -> None: ... + def __delitem__(self, key: SupportsIndex | IndexSlice, /) -> None: ... def __add__(self, value: array[_T], /) -> array[_T]: ... def __eq__(self, value: object, /) -> bool: ... def __ge__(self, value: array[_T], /) -> bool: ... diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 9633b410a61c..db0e90377d6e 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -614,9 +614,9 @@ class str(Sequence[str]): def __eq__(self, value: object, /) -> bool: ... def __ge__(self, value: str, /) -> bool: ... @overload - def __getitem__(self: LiteralString, key: SupportsIndex | slice, /) -> LiteralString: ... + def __getitem__(self: LiteralString, key: SupportsIndex | IndexSlice, /) -> LiteralString: ... @overload - def __getitem__(self, key: SupportsIndex | slice, /) -> str: ... # type: ignore[misc] + def __getitem__(self, key: SupportsIndex | IndexSlice, /) -> str: ... # type: ignore[misc] def __gt__(self, value: str, /) -> bool: ... def __hash__(self) -> int: ... @overload @@ -720,7 +720,7 @@ class bytes(Sequence[int]): @overload def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: slice, /) -> bytes: ... + def __getitem__(self, key: IndexSlice, /) -> bytes: ... def __add__(self, value: ReadableBuffer, /) -> bytes: ... def __mul__(self, value: SupportsIndex, /) -> bytes: ... def __rmul__(self, value: SupportsIndex, /) -> bytes: ... @@ -824,12 +824,12 @@ class bytearray(MutableSequence[int]): @overload def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: slice, /) -> bytearray: ... + def __getitem__(self, key: IndexSlice, /) -> bytearray: ... @overload def __setitem__(self, key: SupportsIndex, value: SupportsIndex, /) -> None: ... @overload - def __setitem__(self, key: slice, value: Iterable[SupportsIndex] | bytes, /) -> None: ... - def __delitem__(self, key: SupportsIndex | slice, /) -> None: ... + def __setitem__(self, key: IndexSlice, value: Iterable[SupportsIndex] | bytes, /) -> None: ... + def __delitem__(self, key: SupportsIndex | IndexSlice, /) -> None: ... def __add__(self, value: ReadableBuffer, /) -> bytearray: ... # The superclass wants us to accept Iterable[int], but that fails at runtime. def __iadd__(self, value: ReadableBuffer, /) -> Self: ... # type: ignore[override] @@ -901,14 +901,14 @@ class memoryview(Sequence[_I]): @overload def __getitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...], /) -> _I: ... @overload - def __getitem__(self, key: slice, /) -> memoryview[_I]: ... + def __getitem__(self, key: IndexSlice, /) -> memoryview[_I]: ... def __contains__(self, x: object, /) -> bool: ... def __iter__(self) -> Iterator[_I]: ... def __len__(self) -> int: ... def __eq__(self, value: object, /) -> bool: ... def __hash__(self) -> int: ... @overload - def __setitem__(self, key: slice, value: ReadableBuffer, /) -> None: ... + def __setitem__(self, key: IndexSlice, value: ReadableBuffer, /) -> None: ... @overload def __setitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...], value: _I, /) -> None: ... if sys.version_info >= (3, 10): @@ -1010,7 +1010,7 @@ class tuple(Sequence[_T_co]): @overload def __getitem__(self, key: SupportsIndex, /) -> _T_co: ... @overload - def __getitem__(self, key: slice, /) -> tuple[_T_co, ...]: ... + def __getitem__(self, key: IndexSlice, /) -> tuple[_T_co, ...]: ... def __iter__(self) -> Iterator[_T_co]: ... def __lt__(self, value: tuple[_T_co, ...], /) -> bool: ... def __le__(self, value: tuple[_T_co, ...], /) -> bool: ... @@ -1109,12 +1109,12 @@ class list(MutableSequence[_T]): @overload def __getitem__(self, i: SupportsIndex, /) -> _T: ... @overload - def __getitem__(self, s: slice, /) -> list[_T]: ... + def __getitem__(self, s: IndexSlice, /) -> list[_T]: ... @overload def __setitem__(self, key: SupportsIndex, value: _T, /) -> None: ... @overload - def __setitem__(self, key: slice, value: Iterable[_T], /) -> None: ... - def __delitem__(self, key: SupportsIndex | slice, /) -> None: ... + def __setitem__(self, key: IndexSlice, value: Iterable[_T], /) -> None: ... + def __delitem__(self, key: SupportsIndex | IndexSlice, /) -> None: ... # Overloading looks unnecessary, but is needed to work around complex mypy problems @overload def __add__(self, value: list[_T], /) -> list[_T]: ... @@ -1310,7 +1310,7 @@ class range(Sequence[int]): @overload def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: slice, /) -> range: ... + def __getitem__(self, key: IndexSlice, /) -> range: ... def __reversed__(self) -> Iterator[int]: ... class property: diff --git a/stdlib/collections/__init__.pyi b/stdlib/collections/__init__.pyi index bc33d91caa1d..a167ffab53fc 100644 --- a/stdlib/collections/__init__.pyi +++ b/stdlib/collections/__init__.pyi @@ -129,12 +129,12 @@ class UserList(MutableSequence[_T]): @overload def __getitem__(self, i: SupportsIndex) -> _T: ... @overload - def __getitem__(self, i: slice) -> Self: ... + def __getitem__(self, i: IndexSlice) -> Self: ... @overload def __setitem__(self, i: SupportsIndex, item: _T) -> None: ... @overload - def __setitem__(self, i: slice, item: Iterable[_T]) -> None: ... - def __delitem__(self, i: SupportsIndex | slice) -> None: ... + def __setitem__(self, i: IndexSlice, item: Iterable[_T]) -> None: ... + def __delitem__(self, i: SupportsIndex | IndexSlice) -> None: ... def __add__(self, other: Iterable[_T]) -> Self: ... def __radd__(self, other: Iterable[_T]) -> Self: ... def __iadd__(self, other: Iterable[_T]) -> Self: ... @@ -174,7 +174,7 @@ class UserString(Sequence[UserString]): def __hash__(self) -> int: ... def __contains__(self, char: object) -> bool: ... def __len__(self) -> int: ... - def __getitem__(self, index: SupportsIndex | slice) -> Self: ... + def __getitem__(self, index: SupportsIndex | IndexSlice) -> Self: ... def __iter__(self) -> Iterator[Self]: ... def __reversed__(self) -> Iterator[Self]: ... def __add__(self, other: object) -> Self: ... diff --git a/stdlib/typing.pyi b/stdlib/typing.pyi index d296c8d92149..1b1d2d405094 100644 --- a/stdlib/typing.pyi +++ b/stdlib/typing.pyi @@ -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, SupportsKeysAndGetItem +from _typeshed import IdentityFunction, IndexSlice, ReadableBuffer, SupportsKeysAndGetItem from abc import ABCMeta, abstractmethod from re import Match as Match, Pattern as Pattern from types import ( @@ -633,7 +633,7 @@ class Sequence(Reversible[_T_co], Collection[_T_co]): def __getitem__(self, index: int) -> _T_co: ... @overload @abstractmethod - def __getitem__(self, index: slice) -> Sequence[_T_co]: ... + def __getitem__(self, index: IndexSlice) -> Sequence[_T_co]: ... # Mixin methods def index(self, value: Any, start: int = 0, stop: int = ...) -> int: ... def count(self, value: Any) -> int: ... @@ -649,19 +649,19 @@ class MutableSequence(Sequence[_T]): def __getitem__(self, index: int) -> _T: ... @overload @abstractmethod - def __getitem__(self, index: slice) -> MutableSequence[_T]: ... + def __getitem__(self, index: IndexSlice) -> MutableSequence[_T]: ... @overload @abstractmethod def __setitem__(self, index: int, value: _T) -> None: ... @overload @abstractmethod - def __setitem__(self, index: slice, value: Iterable[_T]) -> None: ... + def __setitem__(self, index: IndexSlice, value: Iterable[_T]) -> None: ... @overload @abstractmethod def __delitem__(self, index: int) -> None: ... @overload @abstractmethod - def __delitem__(self, index: slice) -> None: ... + def __delitem__(self, index: IndexSlice) -> None: ... # Mixin methods def append(self, value: _T) -> None: ... def clear(self) -> None: ... From 90154fed860541437d955f8e71c7dfd8505de1bd Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Wed, 16 Jul 2025 09:07:15 +0200 Subject: [PATCH 2/4] replace alias with plain slice[SupportsIndex | none] --- stdlib/_ctypes.pyi | 8 ++++---- stdlib/_operator.pyi | 8 ++++---- stdlib/_typeshed/__init__.pyi | 7 ++----- stdlib/array.pyi | 6 +++--- stdlib/builtins.pyi | 26 +++++++++++++------------- stdlib/collections/__init__.pyi | 8 ++++---- stdlib/typing.pyi | 10 +++++----- 7 files changed, 35 insertions(+), 38 deletions(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index 85997c718035..3bcecc33e9d6 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -5,7 +5,7 @@ from abc import abstractmethod from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence from ctypes import CDLL, ArgumentError as ArgumentError, c_void_p from types import GenericAlias -from typing import Any, ClassVar, Generic, TypeVar, final, overload, type_check_only +from typing import Any, ClassVar, Generic, SupportsIndex, TypeVar, final, overload, type_check_only from typing_extensions import Self, TypeAlias _T = TypeVar("_T") @@ -130,7 +130,7 @@ class _Pointer(_PointerLike, _CData, Generic[_CT], metaclass=_PyCPointerType): @overload def __getitem__(self, key: int, /) -> Any: ... @overload - def __getitem__(self, key: IndexSlice, /) -> list[Any]: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> list[Any]: ... def __setitem__(self, key: int, value: Any, /) -> None: ... if sys.version_info < (3, 14): @@ -313,11 +313,11 @@ class Array(_CData, Generic[_CT], metaclass=_PyCArrayType): @overload def __getitem__(self, key: int, /) -> Any: ... @overload - def __getitem__(self, key: IndexSlice, /) -> list[Any]: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> list[Any]: ... @overload def __setitem__(self, key: int, value: Any, /) -> None: ... @overload - def __setitem__(self, key: IndexSlice, value: Iterable[Any], /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: Iterable[Any], /) -> None: ... def __iter__(self) -> Iterator[Any]: ... # Can't inherit from Sized because the metaclass conflict between # Sized and _CData prevents using _CDataMeta. diff --git a/stdlib/_operator.pyi b/stdlib/_operator.pyi index e72922976521..16fa2146f4d2 100644 --- a/stdlib/_operator.pyi +++ b/stdlib/_operator.pyi @@ -1,5 +1,5 @@ import sys -from _typeshed import IndexSlice, SupportsGetItem +from _typeshed import SupportsGetItem from collections.abc import Callable, Container, Iterable, MutableMapping, MutableSequence, Sequence from operator import attrgetter as attrgetter, itemgetter as itemgetter, methodcaller as methodcaller from typing import Any, AnyStr, Protocol, SupportsAbs, SupportsIndex, TypeVar, overload @@ -75,18 +75,18 @@ def countOf(a: Iterable[object], b: object, /) -> int: ... @overload def delitem(a: MutableSequence[Any], b: SupportsIndex, /) -> None: ... @overload -def delitem(a: MutableSequence[Any], b: IndexSlice, /) -> None: ... +def delitem(a: MutableSequence[Any], b: slice[SupportsIndex | None], /) -> None: ... @overload def delitem(a: MutableMapping[_K, Any], b: _K, /) -> None: ... @overload -def getitem(a: Sequence[_T], b: IndexSlice, /) -> Sequence[_T]: ... +def getitem(a: Sequence[_T], b: slice[SupportsIndex | None], /) -> Sequence[_T]: ... @overload def getitem(a: SupportsGetItem[_K, _V], b: _K, /) -> _V: ... def indexOf(a: Iterable[_T], b: _T, /) -> int: ... @overload def setitem(a: MutableSequence[_T], b: SupportsIndex, c: _T, /) -> None: ... @overload -def setitem(a: MutableSequence[_T], b: IndexSlice, c: Sequence[_T], /) -> None: ... +def setitem(a: MutableSequence[_T], b: slice[SupportsIndex | None], c: Sequence[_T], /) -> None: ... @overload def setitem(a: MutableMapping[_K, _V], b: _K, c: _V, /) -> None: ... def length_hint(obj: object, default: int = 0, /) -> int: ... diff --git a/stdlib/_typeshed/__init__.pyi b/stdlib/_typeshed/__init__.pyi index 19c41a5054d1..f60a1a3e8e04 100644 --- a/stdlib/_typeshed/__init__.pyi +++ b/stdlib/_typeshed/__init__.pyi @@ -70,9 +70,6 @@ MaybeNone: TypeAlias = Any # stable # def foo(x: int | None | _SentinelType = ...) -> None: ... sentinel: Any -IndexSlice: TypeAlias = slice[SupportsIndex | None, SupportsIndex | None, SupportsIndex | None] -IntSlice: TypeAlias = slice[int | None, int | None, int | None] - # stable class IdentityFunction(Protocol): def __call__(self, x: _T, /) -> _T: ... @@ -287,7 +284,7 @@ WriteableBuffer: TypeAlias = Buffer ReadableBuffer: TypeAlias = Buffer # stable class SliceableBuffer(Buffer, Protocol): - def __getitem__(self, slice: IndexSlice, /) -> Sequence[int]: ... + def __getitem__(self, slice: slice[SupportsIndex | None], /) -> Sequence[int]: ... class IndexableBuffer(Buffer, Protocol): def __getitem__(self, i: int, /) -> int: ... @@ -295,7 +292,7 @@ class IndexableBuffer(Buffer, Protocol): class SupportsGetItemBuffer(SliceableBuffer, IndexableBuffer, Protocol): def __contains__(self, x: Any, /) -> bool: ... @overload - def __getitem__(self, slice: IndexSlice, /) -> Sequence[int]: ... + def __getitem__(self, slice: slice[SupportsIndex | None], /) -> Sequence[int]: ... @overload def __getitem__(self, i: int, /) -> int: ... diff --git a/stdlib/array.pyi b/stdlib/array.pyi index 2149d385475d..dc11dfacb90e 100644 --- a/stdlib/array.pyi +++ b/stdlib/array.pyi @@ -62,12 +62,12 @@ class array(MutableSequence[_T]): @overload def __getitem__(self, key: SupportsIndex, /) -> _T: ... @overload - def __getitem__(self, key: IndexSlice, /) -> array[_T]: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> array[_T]: ... @overload # type: ignore[override] def __setitem__(self, key: SupportsIndex, value: _T, /) -> None: ... @overload - def __setitem__(self, key: IndexSlice, value: array[_T], /) -> None: ... - def __delitem__(self, key: SupportsIndex | IndexSlice, /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: array[_T], /) -> None: ... + def __delitem__(self, key: SupportsIndex | slice[SupportsIndex | None], /) -> None: ... def __add__(self, value: array[_T], /) -> array[_T]: ... def __eq__(self, value: object, /) -> bool: ... def __ge__(self, value: array[_T], /) -> bool: ... diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index db0e90377d6e..e627b9dd785f 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -614,9 +614,9 @@ class str(Sequence[str]): def __eq__(self, value: object, /) -> bool: ... def __ge__(self, value: str, /) -> bool: ... @overload - def __getitem__(self: LiteralString, key: SupportsIndex | IndexSlice, /) -> LiteralString: ... + def __getitem__(self: LiteralString, key: SupportsIndex | slice[SupportsIndex | None], /) -> LiteralString: ... @overload - def __getitem__(self, key: SupportsIndex | IndexSlice, /) -> str: ... # type: ignore[misc] + def __getitem__(self, key: SupportsIndex | slice[SupportsIndex | None], /) -> str: ... # type: ignore[misc] def __gt__(self, value: str, /) -> bool: ... def __hash__(self) -> int: ... @overload @@ -720,7 +720,7 @@ class bytes(Sequence[int]): @overload def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: IndexSlice, /) -> bytes: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> bytes: ... def __add__(self, value: ReadableBuffer, /) -> bytes: ... def __mul__(self, value: SupportsIndex, /) -> bytes: ... def __rmul__(self, value: SupportsIndex, /) -> bytes: ... @@ -824,12 +824,12 @@ class bytearray(MutableSequence[int]): @overload def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: IndexSlice, /) -> bytearray: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> bytearray: ... @overload def __setitem__(self, key: SupportsIndex, value: SupportsIndex, /) -> None: ... @overload - def __setitem__(self, key: IndexSlice, value: Iterable[SupportsIndex] | bytes, /) -> None: ... - def __delitem__(self, key: SupportsIndex | IndexSlice, /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: Iterable[SupportsIndex] | bytes, /) -> None: ... + def __delitem__(self, key: SupportsIndex | slice[SupportsIndex | None], /) -> None: ... def __add__(self, value: ReadableBuffer, /) -> bytearray: ... # The superclass wants us to accept Iterable[int], but that fails at runtime. def __iadd__(self, value: ReadableBuffer, /) -> Self: ... # type: ignore[override] @@ -901,14 +901,14 @@ class memoryview(Sequence[_I]): @overload def __getitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...], /) -> _I: ... @overload - def __getitem__(self, key: IndexSlice, /) -> memoryview[_I]: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> memoryview[_I]: ... def __contains__(self, x: object, /) -> bool: ... def __iter__(self) -> Iterator[_I]: ... def __len__(self) -> int: ... def __eq__(self, value: object, /) -> bool: ... def __hash__(self) -> int: ... @overload - def __setitem__(self, key: IndexSlice, value: ReadableBuffer, /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: ReadableBuffer, /) -> None: ... @overload def __setitem__(self, key: SupportsIndex | tuple[SupportsIndex, ...], value: _I, /) -> None: ... if sys.version_info >= (3, 10): @@ -1010,7 +1010,7 @@ class tuple(Sequence[_T_co]): @overload def __getitem__(self, key: SupportsIndex, /) -> _T_co: ... @overload - def __getitem__(self, key: IndexSlice, /) -> tuple[_T_co, ...]: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> tuple[_T_co, ...]: ... def __iter__(self) -> Iterator[_T_co]: ... def __lt__(self, value: tuple[_T_co, ...], /) -> bool: ... def __le__(self, value: tuple[_T_co, ...], /) -> bool: ... @@ -1109,12 +1109,12 @@ class list(MutableSequence[_T]): @overload def __getitem__(self, i: SupportsIndex, /) -> _T: ... @overload - def __getitem__(self, s: IndexSlice, /) -> list[_T]: ... + def __getitem__(self, s: slice[SupportsIndex | None], /) -> list[_T]: ... @overload def __setitem__(self, key: SupportsIndex, value: _T, /) -> None: ... @overload - def __setitem__(self, key: IndexSlice, value: Iterable[_T], /) -> None: ... - def __delitem__(self, key: SupportsIndex | IndexSlice, /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: Iterable[_T], /) -> None: ... + def __delitem__(self, key: SupportsIndex | slice[SupportsIndex | None], /) -> None: ... # Overloading looks unnecessary, but is needed to work around complex mypy problems @overload def __add__(self, value: list[_T], /) -> list[_T]: ... @@ -1310,7 +1310,7 @@ class range(Sequence[int]): @overload def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: IndexSlice, /) -> range: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> range: ... def __reversed__(self) -> Iterator[int]: ... class property: diff --git a/stdlib/collections/__init__.pyi b/stdlib/collections/__init__.pyi index a167ffab53fc..eb11eea01763 100644 --- a/stdlib/collections/__init__.pyi +++ b/stdlib/collections/__init__.pyi @@ -129,12 +129,12 @@ class UserList(MutableSequence[_T]): @overload def __getitem__(self, i: SupportsIndex) -> _T: ... @overload - def __getitem__(self, i: IndexSlice) -> Self: ... + def __getitem__(self, i: slice[SupportsIndex | None]) -> Self: ... @overload def __setitem__(self, i: SupportsIndex, item: _T) -> None: ... @overload - def __setitem__(self, i: IndexSlice, item: Iterable[_T]) -> None: ... - def __delitem__(self, i: SupportsIndex | IndexSlice) -> None: ... + def __setitem__(self, i: slice[SupportsIndex | None], item: Iterable[_T]) -> None: ... + def __delitem__(self, i: SupportsIndex | slice[SupportsIndex | None]) -> None: ... def __add__(self, other: Iterable[_T]) -> Self: ... def __radd__(self, other: Iterable[_T]) -> Self: ... def __iadd__(self, other: Iterable[_T]) -> Self: ... @@ -174,7 +174,7 @@ class UserString(Sequence[UserString]): def __hash__(self) -> int: ... def __contains__(self, char: object) -> bool: ... def __len__(self) -> int: ... - def __getitem__(self, index: SupportsIndex | IndexSlice) -> Self: ... + def __getitem__(self, index: SupportsIndex | slice[SupportsIndex | None]) -> Self: ... def __iter__(self) -> Iterator[Self]: ... def __reversed__(self) -> Iterator[Self]: ... def __add__(self, other: object) -> Self: ... diff --git a/stdlib/typing.pyi b/stdlib/typing.pyi index 1b1d2d405094..6c6cea38a50c 100644 --- a/stdlib/typing.pyi +++ b/stdlib/typing.pyi @@ -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, IndexSlice, ReadableBuffer, SupportsKeysAndGetItem +from _typeshed import IdentityFunction, ReadableBuffer, SupportsKeysAndGetItem from abc import ABCMeta, abstractmethod from re import Match as Match, Pattern as Pattern from types import ( @@ -633,7 +633,7 @@ class Sequence(Reversible[_T_co], Collection[_T_co]): def __getitem__(self, index: int) -> _T_co: ... @overload @abstractmethod - def __getitem__(self, index: IndexSlice) -> Sequence[_T_co]: ... + def __getitem__(self, index: slice[SupportsIndex | None]) -> Sequence[_T_co]: ... # Mixin methods def index(self, value: Any, start: int = 0, stop: int = ...) -> int: ... def count(self, value: Any) -> int: ... @@ -649,19 +649,19 @@ class MutableSequence(Sequence[_T]): def __getitem__(self, index: int) -> _T: ... @overload @abstractmethod - def __getitem__(self, index: IndexSlice) -> MutableSequence[_T]: ... + def __getitem__(self, index: slice[SupportsIndex | None]) -> MutableSequence[_T]: ... @overload @abstractmethod def __setitem__(self, index: int, value: _T) -> None: ... @overload @abstractmethod - def __setitem__(self, index: IndexSlice, value: Iterable[_T]) -> None: ... + def __setitem__(self, index: slice[SupportsIndex | None], value: Iterable[_T]) -> None: ... @overload @abstractmethod def __delitem__(self, index: int) -> None: ... @overload @abstractmethod - def __delitem__(self, index: IndexSlice) -> None: ... + def __delitem__(self, index: slice[SupportsIndex | None]) -> None: ... # Mixin methods def append(self, value: _T) -> None: ... def clear(self) -> None: ... From d84ab491c9c529130defba4cddb48317eac72a67 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Wed, 30 Jul 2025 19:21:18 +0200 Subject: [PATCH 3/4] Use `slice[SupportesIndex | None] in more places that support it --- stdlib/logging/config.pyi | 4 ++-- stdlib/mmap.pyi | 12 ++++++------ stdlib/multiprocessing/managers.pyi | 6 +++--- stdlib/multiprocessing/sharedctypes.pyi | 26 ++++++++++++------------- stdlib/sqlite3/__init__.pyi | 6 +++--- stdlib/traceback.pyi | 6 +++--- stdlib/tracemalloc.pyi | 2 +- stdlib/xml/etree/ElementTree.pyi | 4 ++-- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/stdlib/logging/config.pyi b/stdlib/logging/config.pyi index 000ba1ebb06e..cffa789ae897 100644 --- a/stdlib/logging/config.pyi +++ b/stdlib/logging/config.pyi @@ -97,14 +97,14 @@ class ConvertingList(list[Any], ConvertingMixin): # undocumented @overload def __getitem__(self, key: SupportsIndex) -> Any: ... @overload - def __getitem__(self, key: slice) -> Any: ... + def __getitem__(self, key: slice[SupportsIndex | None]) -> Any: ... def pop(self, idx: SupportsIndex = -1) -> Any: ... class ConvertingTuple(tuple[Any, ...], ConvertingMixin): # undocumented @overload def __getitem__(self, key: SupportsIndex) -> Any: ... @overload - def __getitem__(self, key: slice) -> Any: ... + def __getitem__(self, key: slice[SupportsIndex | None]) -> Any: ... class BaseConfigurator: # undocumented CONVERT_PATTERN: Pattern[str] diff --git a/stdlib/mmap.pyi b/stdlib/mmap.pyi index 261a2bfdfc44..2a9b9e0f140b 100644 --- a/stdlib/mmap.pyi +++ b/stdlib/mmap.pyi @@ -2,7 +2,7 @@ import os import sys from _typeshed import ReadableBuffer, Unused from collections.abc import Iterator -from typing import Final, Literal, NoReturn, overload +from typing import Final, Literal, NoReturn, SupportsIndex, overload from typing_extensions import Self ACCESS_DEFAULT: Final = 0 @@ -76,14 +76,14 @@ class mmap: def read(self, n: int | None = None) -> bytes: ... def write(self, bytes: ReadableBuffer) -> int: ... @overload - def __getitem__(self, key: int, /) -> int: ... + def __getitem__(self, key: SupportsIndex, /) -> int: ... @overload - def __getitem__(self, key: slice, /) -> bytes: ... - def __delitem__(self, key: int | slice, /) -> NoReturn: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> bytes: ... + def __delitem__(self, key: SupportsIndex | slice[SupportsIndex | None], /) -> NoReturn: ... @overload - def __setitem__(self, key: int, value: int, /) -> None: ... + def __setitem__(self, key: SupportsIndex, value: int, /) -> None: ... @overload - def __setitem__(self, key: slice, value: ReadableBuffer, /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: ReadableBuffer, /) -> None: ... # Doesn't actually exist, but the object actually supports "in" because it has __getitem__, # so we claim that there is also a __contains__ to help type checkers. def __contains__(self, o: object, /) -> bool: ... diff --git a/stdlib/multiprocessing/managers.pyi b/stdlib/multiprocessing/managers.pyi index b0ccac41b925..b018135e4ebe 100644 --- a/stdlib/multiprocessing/managers.pyi +++ b/stdlib/multiprocessing/managers.pyi @@ -171,15 +171,15 @@ class BaseListProxy(BaseProxy, MutableSequence[_T]): __builtins__: ClassVar[dict[str, Any]] def __len__(self) -> int: ... def __add__(self, x: list[_T], /) -> list[_T]: ... - def __delitem__(self, i: SupportsIndex | slice, /) -> None: ... + def __delitem__(self, i: SupportsIndex | slice[SupportsIndex | None], /) -> None: ... @overload def __getitem__(self, i: SupportsIndex, /) -> _T: ... @overload - def __getitem__(self, s: slice, /) -> list[_T]: ... + def __getitem__(self, s: slice[SupportsIndex | None], /) -> list[_T]: ... @overload def __setitem__(self, i: SupportsIndex, o: _T, /) -> None: ... @overload - def __setitem__(self, s: slice, o: Iterable[_T], /) -> None: ... + def __setitem__(self, s: slice[SupportsIndex | None], o: Iterable[_T], /) -> None: ... def __mul__(self, n: SupportsIndex, /) -> list[_T]: ... def __rmul__(self, n: SupportsIndex, /) -> list[_T]: ... def __imul__(self, value: SupportsIndex, /) -> Self: ... diff --git a/stdlib/multiprocessing/sharedctypes.pyi b/stdlib/multiprocessing/sharedctypes.pyi index 5283445d8545..e81792502f87 100644 --- a/stdlib/multiprocessing/sharedctypes.pyi +++ b/stdlib/multiprocessing/sharedctypes.pyi @@ -5,7 +5,7 @@ from ctypes import _SimpleCData, c_char from multiprocessing.context import BaseContext from multiprocessing.synchronize import _LockLike from types import TracebackType -from typing import Any, Generic, Literal, Protocol, TypeVar, overload +from typing import Any, Generic, Literal, Protocol, SupportsIndex, TypeVar, overload __all__ = ["RawValue", "RawArray", "Value", "Array", "copy", "synchronized"] @@ -103,27 +103,27 @@ class Synchronized(SynchronizedBase[_SimpleCData[_T]], Generic[_T]): class SynchronizedArray(SynchronizedBase[ctypes.Array[_SimpleCData[_T]]], Generic[_T]): def __len__(self) -> int: ... @overload - def __getitem__(self, i: slice) -> list[_T]: ... + def __getitem__(self, i: slice[SupportsIndex | None]) -> list[_T]: ... @overload - def __getitem__(self, i: int) -> _T: ... + def __getitem__(self, i: SupportsIndex) -> _T: ... @overload - def __setitem__(self, i: slice, value: Iterable[_T]) -> None: ... + def __setitem__(self, i: slice[SupportsIndex | None], value: Iterable[_T]) -> None: ... @overload - def __setitem__(self, i: int, value: _T) -> None: ... - def __getslice__(self, start: int, stop: int) -> list[_T]: ... - def __setslice__(self, start: int, stop: int, values: Iterable[_T]) -> None: ... + def __setitem__(self, i: SupportsIndex, value: _T) -> None: ... + def __getslice__(self, start: SupportsIndex, stop: SupportsIndex) -> list[_T]: ... + def __setslice__(self, start: SupportsIndex, stop: SupportsIndex, values: Iterable[_T]) -> None: ... class SynchronizedString(SynchronizedArray[bytes]): @overload # type: ignore[override] - def __getitem__(self, i: slice) -> bytes: ... + def __getitem__(self, i: slice[SupportsIndex | None]) -> bytes: ... @overload - def __getitem__(self, i: int) -> bytes: ... + def __getitem__(self, i: SupportsIndex) -> bytes: ... @overload # type: ignore[override] - def __setitem__(self, i: slice, value: bytes) -> None: ... + def __setitem__(self, i: slice[SupportsIndex | None], value: bytes) -> None: ... @overload - def __setitem__(self, i: int, value: bytes) -> None: ... - def __getslice__(self, start: int, stop: int) -> bytes: ... # type: ignore[override] - def __setslice__(self, start: int, stop: int, values: bytes) -> None: ... # type: ignore[override] + def __setitem__(self, i: SupportsIndex, value: bytes) -> None: ... + def __getslice__(self, start: SupportsIndex, stop: SupportsIndex) -> bytes: ... # type: ignore[override] + def __setslice__(self, start: SupportsIndex, stop: SupportsIndex, values: bytes) -> None: ... # type: ignore[override] value: bytes raw: bytes diff --git a/stdlib/sqlite3/__init__.pyi b/stdlib/sqlite3/__init__.pyi index 0e5edd309f6a..d663c1f08830 100644 --- a/stdlib/sqlite3/__init__.pyi +++ b/stdlib/sqlite3/__init__.pyi @@ -435,10 +435,10 @@ class PrepareProtocol: class Row(Sequence[Any]): def __new__(cls, cursor: Cursor, data: tuple[Any, ...], /) -> Self: ... def keys(self) -> list[str]: ... - @overload + @overload # Note: really needs int instead of SupportsIndex def __getitem__(self, key: int | str, /) -> Any: ... - @overload - def __getitem__(self, key: slice, /) -> tuple[Any, ...]: ... + @overload # Note: SupportsIndex does work within slices. + def __getitem__(self, key: slice[SupportsIndex | None], /) -> tuple[Any, ...]: ... def __hash__(self) -> int: ... def __iter__(self) -> Iterator[Any]: ... def __len__(self) -> int: ... diff --git a/stdlib/traceback.pyi b/stdlib/traceback.pyi index 4553dbd08384..25fa13d80051 100644 --- a/stdlib/traceback.pyi +++ b/stdlib/traceback.pyi @@ -2,7 +2,7 @@ import sys from _typeshed import SupportsWrite, Unused from collections.abc import Generator, Iterable, Iterator, Mapping from types import FrameType, TracebackType -from typing import Any, ClassVar, Literal, overload +from typing import Any, ClassVar, Literal, SupportsIndex, overload from typing_extensions import Self, TypeAlias, deprecated __all__ = [ @@ -288,9 +288,9 @@ class FrameSummary: @overload def __getitem__(self, pos: Literal[3]) -> str | None: ... @overload - def __getitem__(self, pos: int) -> Any: ... + def __getitem__(self, pos: SupportsIndex) -> Any: ... @overload - def __getitem__(self, pos: slice) -> tuple[Any, ...]: ... + def __getitem__(self, pos: slice[SupportsIndex | None]) -> tuple[Any, ...]: ... def __iter__(self) -> Iterator[Any]: ... def __eq__(self, other: object) -> bool: ... def __len__(self) -> Literal[4]: ... diff --git a/stdlib/tracemalloc.pyi b/stdlib/tracemalloc.pyi index 05d98ae127d8..672408bfa5c8 100644 --- a/stdlib/tracemalloc.pyi +++ b/stdlib/tracemalloc.pyi @@ -90,7 +90,7 @@ class Traceback(Sequence[Frame]): @overload def __getitem__(self, index: SupportsIndex) -> Frame: ... @overload - def __getitem__(self, index: slice) -> Sequence[Frame]: ... + def __getitem__(self, index: slice[SupportsIndex | None]) -> Sequence[Frame]: ... def __contains__(self, frame: Frame) -> bool: ... # type: ignore[override] def __len__(self) -> int: ... def __eq__(self, other: object) -> bool: ... diff --git a/stdlib/xml/etree/ElementTree.pyi b/stdlib/xml/etree/ElementTree.pyi index 4c55a1a7452e..27795a0f6a91 100644 --- a/stdlib/xml/etree/ElementTree.pyi +++ b/stdlib/xml/etree/ElementTree.pyi @@ -124,14 +124,14 @@ class Element(Generic[_Tag]): @overload def __getitem__(self, key: SupportsIndex, /) -> Element: ... @overload - def __getitem__(self, key: slice, /) -> list[Element]: ... + def __getitem__(self, key: slice[SupportsIndex | None], /) -> list[Element]: ... def __len__(self) -> int: ... # Doesn't actually exist at runtime, but instance of the class are indeed iterable due to __getitem__. def __iter__(self) -> Iterator[Element]: ... @overload def __setitem__(self, key: SupportsIndex, value: Element, /) -> None: ... @overload - def __setitem__(self, key: slice, value: Iterable[Element], /) -> None: ... + def __setitem__(self, key: slice[SupportsIndex | None], value: Iterable[Element], /) -> None: ... # Doesn't really exist in earlier versions, where __len__ is called implicitly instead @deprecated("Testing an element's truth value is deprecated.") From 0e8ee4c356f92445a3ec1a7771eb9b3b7eb0f477 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Wed, 30 Jul 2025 19:23:50 +0200 Subject: [PATCH 4/4] Use weaker `slice[int | None]` for collections.abc.Sequence --- stdlib/_operator.pyi | 10 +++++----- stdlib/typing.pyi | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/stdlib/_operator.pyi b/stdlib/_operator.pyi index 41d6cd4e3c32..0b1e0f216493 100644 --- a/stdlib/_operator.pyi +++ b/stdlib/_operator.pyi @@ -79,20 +79,20 @@ def concat(a: Sequence[_T], b: Sequence[_T], /) -> Sequence[_T]: ... def contains(a: Container[object], b: object, /) -> bool: ... def countOf(a: Iterable[object], b: object, /) -> int: ... @overload -def delitem(a: MutableSequence[Any], b: SupportsIndex, /) -> None: ... +def delitem(a: MutableSequence[Any], b: int, /) -> None: ... @overload -def delitem(a: MutableSequence[Any], b: slice[SupportsIndex | None], /) -> None: ... +def delitem(a: MutableSequence[Any], b: slice[int | None], /) -> None: ... @overload def delitem(a: MutableMapping[_K, Any], b: _K, /) -> None: ... @overload -def getitem(a: Sequence[_T], b: slice[SupportsIndex | None], /) -> Sequence[_T]: ... +def getitem(a: Sequence[_T], b: slice[int | None], /) -> Sequence[_T]: ... @overload def getitem(a: SupportsGetItem[_K, _V], b: _K, /) -> _V: ... def indexOf(a: Iterable[_T], b: _T, /) -> int: ... @overload -def setitem(a: MutableSequence[_T], b: SupportsIndex, c: _T, /) -> None: ... +def setitem(a: MutableSequence[_T], b: int, c: _T, /) -> None: ... @overload -def setitem(a: MutableSequence[_T], b: slice[SupportsIndex | None], c: Sequence[_T], /) -> None: ... +def setitem(a: MutableSequence[_T], b: slice[int | None], c: Sequence[_T], /) -> None: ... @overload def setitem(a: MutableMapping[_K, _V], b: _K, c: _V, /) -> None: ... def length_hint(obj: object, default: int = 0, /) -> int: ... diff --git a/stdlib/typing.pyi b/stdlib/typing.pyi index 6c6cea38a50c..335d9014c122 100644 --- a/stdlib/typing.pyi +++ b/stdlib/typing.pyi @@ -633,7 +633,7 @@ class Sequence(Reversible[_T_co], Collection[_T_co]): def __getitem__(self, index: int) -> _T_co: ... @overload @abstractmethod - def __getitem__(self, index: slice[SupportsIndex | None]) -> Sequence[_T_co]: ... + def __getitem__(self, index: slice[int | None]) -> Sequence[_T_co]: ... # Mixin methods def index(self, value: Any, start: int = 0, stop: int = ...) -> int: ... def count(self, value: Any) -> int: ... @@ -649,19 +649,19 @@ class MutableSequence(Sequence[_T]): def __getitem__(self, index: int) -> _T: ... @overload @abstractmethod - def __getitem__(self, index: slice[SupportsIndex | None]) -> MutableSequence[_T]: ... + def __getitem__(self, index: slice[int | None]) -> MutableSequence[_T]: ... @overload @abstractmethod def __setitem__(self, index: int, value: _T) -> None: ... @overload @abstractmethod - def __setitem__(self, index: slice[SupportsIndex | None], value: Iterable[_T]) -> None: ... + def __setitem__(self, index: slice[int | None], value: Iterable[_T]) -> None: ... @overload @abstractmethod def __delitem__(self, index: int) -> None: ... @overload @abstractmethod - def __delitem__(self, index: slice[SupportsIndex | None]) -> None: ... + def __delitem__(self, index: slice[int | None]) -> None: ... # Mixin methods def append(self, value: _T) -> None: ... def clear(self) -> None: ...