Skip to content

added hashability requirement to set/frozenset typevar #11854

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
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
69 changes: 37 additions & 32 deletions stdlib/builtins.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ from typing import ( # noqa: Y022
BinaryIO,
ClassVar,
Generic,
Hashable,
Mapping,
MutableMapping,
MutableSequence,
Expand Down Expand Up @@ -90,6 +91,9 @@ _SupportsNextT = TypeVar("_SupportsNextT", bound=SupportsNext[Any], covariant=Tr
_SupportsAnextT = TypeVar("_SupportsAnextT", bound=SupportsAnext[Any], covariant=True)
_AwaitableT = TypeVar("_AwaitableT", bound=Awaitable[Any])
_AwaitableT_co = TypeVar("_AwaitableT_co", bound=Awaitable[Any], covariant=True)
_H = TypeVar("_H", bound=Hashable)
_H_co = TypeVar("_H_co", bound=Hashable, covariant=True)
_H2 = TypeVar("_H2", bound=Hashable)
_P = ParamSpec("_P")

class object:
Expand Down Expand Up @@ -162,6 +166,7 @@ class classmethod(Generic[_T, _P, _R_co]):

class type:
# object.__base__ is None. Otherwise, it would be a type.
def __hash__(self) -> int: ...
@property
def __base__(self) -> type | None: ...
__bases__: tuple[type, ...]
Expand Down Expand Up @@ -1108,37 +1113,37 @@ class dict(MutableMapping[_KT, _VT]):
@overload
def __ior__(self, value: Iterable[tuple[_KT, _VT]], /) -> Self: ...

class set(MutableSet[_T]):
class set(MutableSet[_H]):
@overload
def __init__(self) -> None: ...
@overload
def __init__(self, iterable: Iterable[_T], /) -> None: ...
def add(self, element: _T, /) -> None: ...
def copy(self) -> set[_T]: ...
def difference(self, *s: Iterable[Any]) -> set[_T]: ...
def __init__(self, iterable: Iterable[_H], /) -> None: ...
def add(self, element: _H, /) -> None: ...
def copy(self) -> set[_H]: ...
def difference(self, *s: Iterable[Any]) -> set[_H]: ...
def difference_update(self, *s: Iterable[Any]) -> None: ...
def discard(self, element: _T, /) -> None: ...
def intersection(self, *s: Iterable[Any]) -> set[_T]: ...
def discard(self, element: _H, /) -> None: ...
def intersection(self, *s: Iterable[Any]) -> set[_H]: ...
def intersection_update(self, *s: Iterable[Any]) -> None: ...
def isdisjoint(self, s: Iterable[Any], /) -> bool: ...
def issubset(self, s: Iterable[Any], /) -> bool: ...
def issuperset(self, s: Iterable[Any], /) -> bool: ...
def remove(self, element: _T, /) -> None: ...
def symmetric_difference(self, s: Iterable[_T], /) -> set[_T]: ...
def symmetric_difference_update(self, s: Iterable[_T], /) -> None: ...
def union(self, *s: Iterable[_S]) -> set[_T | _S]: ...
def update(self, *s: Iterable[_T]) -> None: ...
def remove(self, element: _H, /) -> None: ...
def symmetric_difference(self, s: Iterable[_H], /) -> set[_H]: ...
def symmetric_difference_update(self, s: Iterable[_H], /) -> None: ...
def union(self, *s: Iterable[_H2]) -> set[_H | _H2]: ...
def update(self, *s: Iterable[_H]) -> None: ...
def __len__(self) -> int: ...
def __contains__(self, o: object, /) -> bool: ...
def __iter__(self) -> Iterator[_T]: ...
def __and__(self, value: AbstractSet[object], /) -> set[_T]: ...
def __iter__(self) -> Iterator[_H]: ...
def __and__(self, value: AbstractSet[object], /) -> set[_H]: ...
def __iand__(self, value: AbstractSet[object], /) -> Self: ...
def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ...
def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc]
def __sub__(self, value: AbstractSet[_T | None], /) -> set[_T]: ...
def __or__(self, value: AbstractSet[_H2], /) -> set[_H | _H2]: ...
def __ior__(self, value: AbstractSet[_H], /) -> Self: ... # type: ignore[override,misc]
def __sub__(self, value: AbstractSet[_H | None], /) -> set[_H]: ...
def __isub__(self, value: AbstractSet[object], /) -> Self: ...
def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ...
def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc]
def __xor__(self, value: AbstractSet[_H2], /) -> set[_H | _H2]: ...
def __ixor__(self, value: AbstractSet[_H], /) -> Self: ... # type: ignore[override,misc]
def __le__(self, value: AbstractSet[object], /) -> bool: ...
def __lt__(self, value: AbstractSet[object], /) -> bool: ...
def __ge__(self, value: AbstractSet[object], /) -> bool: ...
Expand All @@ -1148,26 +1153,26 @@ class set(MutableSet[_T]):
if sys.version_info >= (3, 9):
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...

class frozenset(AbstractSet[_T_co]):
class frozenset(AbstractSet[_H_co]):
@overload
def __new__(cls) -> Self: ...
@overload
def __new__(cls, iterable: Iterable[_T_co], /) -> Self: ...
def copy(self) -> frozenset[_T_co]: ...
def difference(self, *s: Iterable[object]) -> frozenset[_T_co]: ...
def intersection(self, *s: Iterable[object]) -> frozenset[_T_co]: ...
def isdisjoint(self, s: Iterable[_T_co], /) -> bool: ...
def __new__(cls, iterable: Iterable[_H_co], /) -> Self: ...
def copy(self) -> frozenset[_H_co]: ...
def difference(self, *s: Iterable[object]) -> frozenset[_H_co]: ...
def intersection(self, *s: Iterable[object]) -> frozenset[_H_co]: ...
def isdisjoint(self, s: Iterable[_H_co], /) -> bool: ...
def issubset(self, s: Iterable[object], /) -> bool: ...
def issuperset(self, s: Iterable[object], /) -> bool: ...
def symmetric_difference(self, s: Iterable[_T_co], /) -> frozenset[_T_co]: ...
def union(self, *s: Iterable[_S]) -> frozenset[_T_co | _S]: ...
def symmetric_difference(self, s: Iterable[_H_co], /) -> frozenset[_H_co]: ...
def union(self, *s: Iterable[_H2]) -> frozenset[_H_co | _H2]: ...
def __len__(self) -> int: ...
def __contains__(self, o: object, /) -> bool: ...
def __iter__(self) -> Iterator[_T_co]: ...
def __and__(self, value: AbstractSet[_T_co], /) -> frozenset[_T_co]: ...
def __or__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ...
def __sub__(self, value: AbstractSet[_T_co], /) -> frozenset[_T_co]: ...
def __xor__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ...
def __iter__(self) -> Iterator[_H_co]: ...
def __and__(self, value: AbstractSet[_H_co], /) -> frozenset[_H_co]: ...
def __or__(self, value: AbstractSet[_H2], /) -> frozenset[_H_co | _H2]: ...
def __sub__(self, value: AbstractSet[_H_co], /) -> frozenset[_H_co]: ...
def __xor__(self, value: AbstractSet[_H2], /) -> frozenset[_H_co | _H2]: ...
def __le__(self, value: AbstractSet[object], /) -> bool: ...
def __lt__(self, value: AbstractSet[object], /) -> bool: ...
def __ge__(self, value: AbstractSet[object], /) -> bool: ...
Expand Down
2 changes: 1 addition & 1 deletion stdlib/marshal.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ _Marshallable: TypeAlias = (
| list[Any]
| dict[Any, Any]
| set[Any]
| frozenset[_Marshallable]
| frozenset[Any]
| types.CodeType
| ReadableBuffer
)
Expand Down
Loading