Skip to content

Make the built-in slice type generic in terms of its start, stop, and step #10174

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions stdlib/_ctypes.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class _Pointer(Generic[_CT], _PointerLike, _CData):
@overload
def __getitem__(self, __key: int) -> Any: ...
@overload
def __getitem__(self, __key: slice) -> list[Any]: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> list[Any]: ...
def __setitem__(self, __key: int, __value: Any) -> None: ...

def POINTER(type: type[_CT]) -> type[_Pointer[_CT]]: ...
Expand Down Expand Up @@ -168,11 +168,11 @@ class Array(Generic[_CT], _CData):
@overload
def __getitem__(self, __key: int) -> Any: ...
@overload
def __getitem__(self, __key: slice) -> list[Any]: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], __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.
Expand Down
6 changes: 3 additions & 3 deletions stdlib/_operator.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,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: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], __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: ...
Expand Down
6 changes: 3 additions & 3 deletions stdlib/array.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,12 @@ class array(MutableSequence[_T], Generic[_T]):
@overload
def __getitem__(self, __key: SupportsIndex) -> _T: ...
@overload
def __getitem__(self, __key: slice) -> array[_T]: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], __value: array[_T]) -> None: ...
def __delitem__(self, __key: SupportsIndex | slice[Any, Any, Any]) -> None: ...
def __add__(self, __value: array[_T]) -> array[_T]: ...
def __ge__(self, __value: array[_T]) -> bool: ...
def __gt__(self, __value: array[_T]) -> bool: ...
Expand Down
36 changes: 18 additions & 18 deletions stdlib/builtins.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -568,7 +568,7 @@ class str(Sequence[str]):
def __contains__(self, __key: str) -> bool: ... # type: ignore[override]
def __eq__(self, __value: object) -> bool: ...
def __ge__(self, __value: str) -> bool: ...
def __getitem__(self, __key: SupportsIndex | slice) -> str: ...
def __getitem__(self, __key: SupportsIndex | slice[Any, Any, Any]) -> str: ...
def __gt__(self, __value: str) -> bool: ...
@overload
def __iter__(self: LiteralString) -> Iterator[LiteralString]: ...
Expand Down Expand Up @@ -678,7 +678,7 @@ class bytes(ByteString):
@overload
def __getitem__(self, __key: SupportsIndex) -> int: ...
@overload
def __getitem__(self, __key: slice) -> bytes: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> bytes: ...
def __add__(self, __value: ReadableBuffer) -> bytes: ...
def __mul__(self, __value: SupportsIndex) -> bytes: ...
def __rmul__(self, __value: SupportsIndex) -> bytes: ...
Expand Down Expand Up @@ -788,12 +788,12 @@ class bytearray(MutableSequence[int], ByteString):
@overload
def __getitem__(self, __key: SupportsIndex) -> int: ...
@overload
def __getitem__(self, __key: slice) -> bytearray: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], __value: Iterable[SupportsIndex] | bytes) -> None: ...
def __delitem__(self, __key: SupportsIndex | slice[Any, Any, Any]) -> 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]
Expand Down Expand Up @@ -846,12 +846,12 @@ class memoryview(Sequence[int]):
@overload
def __getitem__(self, __key: SupportsIndex) -> int: ...
@overload
def __getitem__(self, __key: slice) -> memoryview: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> memoryview: ...
def __contains__(self, __x: object) -> bool: ...
def __iter__(self) -> Iterator[int]: ...
def __len__(self) -> int: ...
@overload
def __setitem__(self, __key: slice, __value: ReadableBuffer) -> None: ...
def __setitem__(self, __key: slice[Any, Any, Any], __value: ReadableBuffer) -> None: ...
@overload
def __setitem__(self, __key: SupportsIndex, __value: SupportsIndex) -> None: ...
if sys.version_info >= (3, 10):
Expand Down Expand Up @@ -903,17 +903,17 @@ class bool(int):
def __getnewargs__(self) -> tuple[int]: ...

@final
class slice:
class slice(Generic[_T1, _T2, _T3]):
@property
def start(self) -> Any: ...
def start(self) -> _T1: ...
@property
def step(self) -> Any: ...
def step(self) -> _T3: ...
@property
def stop(self) -> Any: ...
def stop(self) -> _T2: ...
@overload
def __init__(self, __stop: Any) -> None: ...
def __init__(self, __stop: _T2) -> None: ...
@overload
def __init__(self, __start: Any, __stop: Any, __step: Any = ...) -> None: ...
def __init__(self, __start: _T1, __stop: _T2, __step: _T3 = ...) -> None: ... # pyright: ignore[reportInvalidTypeVarUse]
__hash__: ClassVar[None] # type: ignore[assignment]
def indices(self, __len: SupportsIndex) -> tuple[int, int, int]: ...

Expand All @@ -924,7 +924,7 @@ class tuple(Sequence[_T_co], Generic[_T_co]):
@overload
def __getitem__(self, __key: SupportsIndex) -> _T_co: ...
@overload
def __getitem__(self, __key: slice) -> tuple[_T_co, ...]: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> 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: ...
Expand Down Expand Up @@ -995,12 +995,12 @@ class list(MutableSequence[_T], Generic[_T]):
@overload
def __getitem__(self, __i: SupportsIndex) -> _T: ...
@overload
def __getitem__(self, __s: slice) -> list[_T]: ...
def __getitem__(self, __s: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], __value: Iterable[_T]) -> None: ...
def __delitem__(self, __key: SupportsIndex | slice[Any, Any, Any]) -> None: ...
# Overloading looks unnecessary, but is needed to work around complex mypy problems
@overload
def __add__(self, __value: list[_T]) -> list[_T]: ...
Expand Down Expand Up @@ -1174,7 +1174,7 @@ class range(Sequence[int]):
@overload
def __getitem__(self, __key: SupportsIndex) -> int: ...
@overload
def __getitem__(self, __key: slice) -> range: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> range: ...
def __reversed__(self) -> Iterator[int]: ...

class property:
Expand Down
8 changes: 4 additions & 4 deletions stdlib/collections/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,12 @@ class UserList(MutableSequence[_T]):
@overload
def __getitem__(self, i: SupportsIndex) -> _T: ...
@overload
def __getitem__(self, i: slice) -> Self: ...
def __getitem__(self, i: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], item: Iterable[_T]) -> None: ...
def __delitem__(self, i: SupportsIndex | slice[Any, Any, Any]) -> None: ...
def __add__(self, other: Iterable[_T]) -> Self: ...
def __radd__(self, other: Iterable[_T]) -> Self: ...
def __iadd__(self, other: Iterable[_T]) -> Self: ...
Expand Down Expand Up @@ -149,7 +149,7 @@ class UserString(Sequence[UserString]):
def __eq__(self, string: object) -> bool: ...
def __contains__(self, char: object) -> bool: ...
def __len__(self) -> int: ...
def __getitem__(self, index: SupportsIndex | slice) -> Self: ...
def __getitem__(self, index: SupportsIndex | slice[Any, Any, Any]) -> Self: ...
def __iter__(self) -> Iterator[Self]: ...
def __reversed__(self) -> Iterator[Self]: ...
def __add__(self, other: object) -> Self: ...
Expand Down
3 changes: 2 additions & 1 deletion stdlib/lib2to3/btm_matcher.pyi
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from _typeshed import Incomplete, SupportsGetItem
from collections import defaultdict
from collections.abc import Iterable
from typing import Any

from .fixer_base import BaseFix
from .pytree import Leaf, Node
Expand All @@ -21,7 +22,7 @@ class BottomMatcher:
logger: Incomplete
def __init__(self) -> None: ...
def add_fixer(self, fixer: BaseFix) -> None: ...
def add(self, pattern: SupportsGetItem[int | slice, Incomplete] | None, start: BMNode) -> list[BMNode]: ...
def add(self, pattern: SupportsGetItem[int | slice[Any, Any, Any], Incomplete] | None, start: BMNode) -> list[BMNode]: ...
def run(self, leaves: Iterable[Leaf]) -> defaultdict[BaseFix, list[Node | Leaf]]: ...
def print_ac(self) -> None: ...

Expand Down
4 changes: 3 additions & 1 deletion stdlib/lib2to3/pytree.pyi
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from _typeshed import Incomplete, SupportsGetItem, SupportsLenAndGetItem, Unused
from abc import abstractmethod
from collections.abc import Iterable, Iterator, MutableSequence
from typing import Any
from typing_extensions import Final, Self, TypeAlias

from .fixer_base import BaseFix
Expand Down Expand Up @@ -112,5 +113,6 @@ class NegatedPattern(BasePattern):
def __init__(self, content: str | None = None) -> None: ...

def generate_matches(
patterns: SupportsGetItem[int | slice, BasePattern] | None, nodes: SupportsGetItem[int | slice, _NL]
patterns: SupportsGetItem[int | slice[Any, Any, Any], BasePattern] | None,
nodes: SupportsGetItem[int | slice[Any, Any, Any], _NL],
) -> Iterator[tuple[int, _Results]]: ...
4 changes: 2 additions & 2 deletions stdlib/logging/config.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -101,14 +101,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[Any, Any, Any]) -> 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[Any, Any, Any]) -> Any: ...

class BaseConfigurator: # undocumented
CONVERT_PATTERN: Pattern[str]
Expand Down
8 changes: 4 additions & 4 deletions stdlib/mmap.pyi
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sys
from _typeshed import ReadableBuffer, Unused
from collections.abc import Iterable, Iterator, Sized
from typing import NoReturn, overload
from typing import Any, NoReturn, overload
from typing_extensions import Self

ACCESS_DEFAULT: int
Expand Down Expand Up @@ -62,12 +62,12 @@ class mmap(Iterable[int], Sized):
@overload
def __getitem__(self, __key: int) -> int: ...
@overload
def __getitem__(self, __key: slice) -> bytes: ...
def __delitem__(self, __key: int | slice) -> NoReturn: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> bytes: ...
def __delitem__(self, __key: int | slice[Any, Any, Any]) -> NoReturn: ...
@overload
def __setitem__(self, __key: int, __value: int) -> None: ...
@overload
def __setitem__(self, __key: slice, __value: ReadableBuffer) -> None: ...
def __setitem__(self, __key: slice[Any, Any, Any], __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: ...
Expand Down
6 changes: 3 additions & 3 deletions stdlib/multiprocessing/managers.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,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[Any, Any, Any]) -> None: ...
@overload
def __getitem__(self, __i: SupportsIndex) -> _T: ...
@overload
def __getitem__(self, __s: slice) -> list[_T]: ...
def __getitem__(self, __s: slice[Any, Any, Any]) -> 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[Any, Any, Any], __o: Iterable[_T]) -> None: ...
def __mul__(self, __n: SupportsIndex) -> list[_T]: ...
def __rmul__(self, __n: SupportsIndex) -> list[_T]: ...
def __reversed__(self) -> Iterator[_T]: ...
Expand Down
6 changes: 3 additions & 3 deletions stdlib/sqlite3/dbapi2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ class Row:
@overload
def __getitem__(self, __key: int | str) -> Any: ...
@overload
def __getitem__(self, __key: slice) -> tuple[Any, ...]: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> tuple[Any, ...]: ...
def __iter__(self) -> Iterator[Any]: ...
def __len__(self) -> int: ...
# These return NotImplemented for anything that is not a Row.
Expand Down Expand Up @@ -453,5 +453,5 @@ if sys.version_info >= (3, 11):
def __len__(self) -> int: ...
def __enter__(self) -> Self: ...
def __exit__(self, __type: object, __val: object, __tb: object) -> Literal[False]: ...
def __getitem__(self, __key: SupportsIndex | slice) -> int: ...
def __setitem__(self, __key: SupportsIndex | slice, __value: int) -> None: ...
def __getitem__(self, __key: SupportsIndex | slice[Any, Any, Any]) -> int: ...
def __setitem__(self, __key: SupportsIndex | slice[Any, Any, Any], __value: int) -> None: ...
6 changes: 3 additions & 3 deletions stdlib/sre_parse.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ class SubPattern:

def dump(self, level: int = 0) -> None: ...
def __len__(self) -> int: ...
def __delitem__(self, index: int | slice) -> None: ...
def __getitem__(self, index: int | slice) -> SubPattern | _CodeType: ...
def __setitem__(self, index: int | slice, code: _CodeType) -> None: ...
def __delitem__(self, index: int | slice[Any, Any, Any]) -> None: ...
def __getitem__(self, index: int | slice[Any, Any, Any]) -> SubPattern | _CodeType: ...
def __setitem__(self, index: int | slice[Any, Any, Any], code: _CodeType) -> None: ...
def insert(self, index: int, code: _CodeType) -> None: ...
def append(self, code: _CodeType) -> None: ...
def getwidth(self) -> tuple[int, int]: ...
Expand Down
2 changes: 1 addition & 1 deletion stdlib/tracemalloc.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,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[Any, Any, Any]) -> Sequence[Frame]: ...
def __contains__(self, frame: Frame) -> bool: ... # type: ignore[override]
def __len__(self) -> int: ...
def __eq__(self, other: object) -> bool: ...
Expand Down
8 changes: 4 additions & 4 deletions stdlib/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ class Sequence(Collection[_T_co], Reversible[_T_co], Generic[_T_co]):
def __getitem__(self, index: int) -> _T_co: ...
@overload
@abstractmethod
def __getitem__(self, index: slice) -> Sequence[_T_co]: ...
def __getitem__(self, index: slice[Any, Any, Any]) -> Sequence[_T_co]: ...
# Mixin methods
def index(self, value: Any, start: int = 0, stop: int = ...) -> int: ...
def count(self, value: Any) -> int: ...
Expand All @@ -480,19 +480,19 @@ class MutableSequence(Sequence[_T], Generic[_T]):
def __getitem__(self, index: int) -> _T: ...
@overload
@abstractmethod
def __getitem__(self, index: slice) -> MutableSequence[_T]: ...
def __getitem__(self, index: slice[Any, Any, Any]) -> 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: slice[Any, Any, Any], value: Iterable[_T]) -> None: ...
@overload
@abstractmethod
def __delitem__(self, index: int) -> None: ...
@overload
@abstractmethod
def __delitem__(self, index: slice) -> None: ...
def __delitem__(self, index: slice[Any, Any, Any]) -> None: ...
# Mixin methods
def append(self, value: _T) -> None: ...
def clear(self) -> None: ...
Expand Down
6 changes: 3 additions & 3 deletions stdlib/xml/etree/ElementTree.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -112,18 +112,18 @@ class Element:
def set(self, __key: str, __value: str) -> None: ...
def __copy__(self) -> Element: ... # returns the type of self in Python impl, but not in C impl
def __deepcopy__(self, __memo: Any) -> Element: ... # Only exists in C impl
def __delitem__(self, __key: SupportsIndex | slice) -> None: ...
def __delitem__(self, __key: SupportsIndex | slice[Any, Any, Any]) -> None: ...
@overload
def __getitem__(self, __key: SupportsIndex) -> Element: ...
@overload
def __getitem__(self, __key: slice) -> list[Element]: ...
def __getitem__(self, __key: slice[Any, Any, Any]) -> 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[Any, Any, Any], __value: Iterable[Element]) -> None: ...
if sys.version_info < (3, 9):
def getchildren(self) -> list[Element]: ...
def getiterator(self, tag: str | None = None) -> list[Element]: ...
Expand Down
4 changes: 2 additions & 2 deletions stubs/JACK-Client/jack/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@ class _CBufferType:
@overload
def __getitem__(self, key: int) -> str: ...
@overload
def __getitem__(self, key: slice) -> bytes: ...
def __getitem__(self, key: slice[Any, Any, Any]) -> bytes: ...
@overload
def __setitem__(self, key: int, val: str) -> None: ...
@overload
def __setitem__(self, key: slice, val: bytes) -> None: ...
def __setitem__(self, key: slice[Any, Any, Any], val: bytes) -> None: ...
def __len__(self) -> int: ...
def __bytes__(self) -> bytes: ...

Expand Down
Loading