Skip to content
Open
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
46 changes: 45 additions & 1 deletion stdlib/_typeshed/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,18 @@
# See the README.md file in this directory for more information.

import sys
from collections.abc import Awaitable, Callable, Iterable, Iterator, Sequence, Set as AbstractSet, Sized
from collections.abc import (
Awaitable,
Callable,
ItemsView,
Iterable,
Iterator,
KeysView,
Sequence,
Set as AbstractSet,
Sized,
ValuesView,
)
from dataclasses import Field
from os import PathLike
from types import FrameType, TracebackType
Expand Down Expand Up @@ -179,6 +190,39 @@ class SupportsItemAccess(Protocol[_KT_contra, _VT]):
def __setitem__(self, key: _KT_contra, value: _VT, /) -> None: ...
def __delitem__(self, key: _KT_contra, /) -> None: ...

# Protocol for sequence-like objects. This includes commonly used methods
# from collections.abc.Sequence, and can be used in argument types when using
# more specific protocols would be cumbersome.
#
# Please note that this protocol is not yet marked as stable, and may be
# extended in the future to include more methods.
class SequenceLike(Protocol[_T_co]):
def __contains__(self, value: object, /) -> bool: ...
Copy link
Contributor

@jorenham jorenham Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe object is a bit too restrictive, seeing as this is a contravariant position? (It's not needed for NumPy or anything, just a thought.)

@overload
def __getitem__(self, index: int, /) -> _T_co: ...
# This does not necessarily return a sequence of the same type.
@overload
def __getitem__(self, index: slice, /) -> Sequence[_T_co]: ...
Comment on lines +203 to +205
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it does return a sequence of the same type, and that sequence is a SequenceLike but not a Sequence, then it would kinda defeat the purpose. For example numpy.ndarray isn't assignable to this SequenceLike[Any] right now.

So how about this?

Suggested change
# This does not necessarily return a sequence of the same type.
@overload
def __getitem__(self, index: slice, /) -> Sequence[_T_co]: ...
# This does not necessarily return a sequence of the same type.
@overload
def __getitem__(self, index: slice, /) -> SequenceLike[_T_co]: ...

I confirmed that with this x: SequenceLike[Any] = a for some a: np.ndarray is accepted (at least mypy and basedpyright).

def __iter__(self) -> Iterator[_T_co]: ...
def __len__(self) -> int: ...

# Protocol for mapping-like objects. This includes the methods from
# collections.abc.Mapping, and can be used in argument types when using
# more specific protocols would be cumbersome.
class MappingLike(Protocol[_KT, _VT_co]):
def __contains__(self, key: object, /) -> bool: ...
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see my comment at SequenceLike.__contains__

def __getitem__(self, key: _KT, /) -> _VT_co: ...
def __len__(self) -> int: ...
@overload
def get(self, key: _KT, /) -> _VT_co | None: ...
@overload
def get(self, key: _KT, default: _VT, /) -> _VT_co | _VT: ...
def items(self) -> ItemsView[_KT, _VT_co]: ...
def keys(self) -> KeysView[_KT]: ...
def values(self) -> ValuesView[_VT_co]: ...

# Path- and I/O-related types

StrPath: TypeAlias = str | PathLike[str] # stable
BytesPath: TypeAlias = bytes | PathLike[bytes] # stable
GenericPath: TypeAlias = AnyStr | PathLike[AnyStr]
Expand Down