Skip to content

Commit 68fe8c2

Browse files
authored
Update type hints to use Hashable for sets
1 parent a58999c commit 68fe8c2

1 file changed

Lines changed: 68 additions & 63 deletions

File tree

stdlib/builtins.pyi

Lines changed: 68 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ from _typeshed import (
3030
SupportsRichComparisonT,
3131
SupportsWrite,
3232
)
33-
from collections.abc import Awaitable, Callable, Iterable, Iterator, MutableSet, Reversible, Set as AbstractSet, Sized
33+
from collections.abc import Awaitable, Callable, Hashable, Iterable, Iterator, MutableSet, Reversible, Set as AbstractSet, Sized
3434
from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper
3535
from os import PathLike
3636
from types import CellType, CodeType, EllipsisType, GenericAlias, NotImplementedType, TracebackType
@@ -75,14 +75,19 @@ _I = TypeVar("_I", default=int)
7575
_T_co = TypeVar("_T_co", covariant=True)
7676
_T_contra = TypeVar("_T_contra", contravariant=True)
7777
_R_co = TypeVar("_R_co", covariant=True)
78-
_KT = TypeVar("_KT")
78+
_KT = TypeVar("_KT", bound=Hashable)
7979
_VT = TypeVar("_VT")
8080
_S = TypeVar("_S")
8181
_T1 = TypeVar("_T1")
8282
_T2 = TypeVar("_T2")
8383
_T3 = TypeVar("_T3")
8484
_T4 = TypeVar("_T4")
8585
_T5 = TypeVar("_T5")
86+
_H1 = TypeVar("_H1", bound=Hashable)
87+
_H2 = TypeVar("_H2", bound=Hashable)
88+
_H1_co = TypeVar("_H1_co", bound=Hashable)
89+
_H2_co = TypeVar("_H2_co", bound=Hashable)
90+
8691
_SupportsNextT_co = TypeVar("_SupportsNextT_co", bound=SupportsNext[Any], covariant=True)
8792
_SupportsAnextT_co = TypeVar("_SupportsAnextT_co", bound=SupportsAnext[Any], covariant=True)
8893
_AwaitableT = TypeVar("_AwaitableT", bound=Awaitable[Any])
@@ -1226,10 +1231,10 @@ class dict(MutableMapping[_KT, _VT]):
12261231
# See #3800 & https://github.com/python/typing/issues/548#issuecomment-683336963.
12271232
@classmethod
12281233
@overload
1229-
def fromkeys(cls, iterable: Iterable[_T], value: None = None, /) -> dict[_T, Any | None]: ...
1234+
def fromkeys(cls, iterable: Iterable[_H1], value: None = None, /) -> dict[_H1, Any | None]: ...
12301235
@classmethod
12311236
@overload
1232-
def fromkeys(cls, iterable: Iterable[_T], value: _S, /) -> dict[_T, _S]: ...
1237+
def fromkeys(cls, iterable: Iterable[_H1], value: _T, /) -> dict[_H1, _T]: ...
12331238
# Positional-only in dict, but not in MutableMapping
12341239
@overload # type: ignore[override]
12351240
def get(self, key: _KT, default: None = None, /) -> _VT | None: ...
@@ -1253,14 +1258,14 @@ class dict(MutableMapping[_KT, _VT]):
12531258
__hash__: ClassVar[None] # type: ignore[assignment]
12541259
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...
12551260
if sys.version_info >= (3, 15):
1256-
def __or__(self, value: dict[_T1, _T2] | frozendict[_T1, _T2], /) -> dict[_KT | _T1, _VT | _T2]: ...
1261+
def __or__(self, value: dict[_H1, _T] | frozendict[_H1, _T], /) -> dict[_KT | _H1, _VT | _T]: ...
12571262
@overload
1258-
def __ror__(self, value: dict[_T1, _T2], /) -> dict[_KT | _T1, _VT | _T2]: ...
1263+
def __ror__(self, value: dict[_H1, _T], /) -> dict[_KT | _H1, _VT | _T]: ...
12591264
@overload
1260-
def __ror__(self, value: frozendict[_T1, _T2], /) -> frozendict[_KT | _T1, _VT | _T2]: ...
1265+
def __ror__(self, value: frozendict[_H1, _T], /) -> frozendict[_KT | _H1, _VT | _T]: ...
12611266
else:
1262-
def __or__(self, value: dict[_T1, _T2], /) -> dict[_KT | _T1, _VT | _T2]: ...
1263-
def __ror__(self, value: dict[_T1, _T2], /) -> dict[_KT | _T1, _VT | _T2]: ...
1267+
def __or__(self, value: dict[_H1, _T], /) -> dict[_KT | _H1, _VT | _T]: ...
1268+
def __ror__(self, value: dict[_H1, _T], /) -> dict[_KT | _H1, _VT | _T]: ...
12641269
# dict.__ior__ should be kept roughly in line with MutableMapping.update()
12651270
@overload # type: ignore[misc]
12661271
def __ior__(self, value: SupportsKeysAndGetItem[_KT, _VT], /) -> Self: ...
@@ -1271,7 +1276,7 @@ if sys.version_info >= (3, 15):
12711276
@disjoint_base
12721277
class frozendict(Mapping[_KT, _VT]):
12731278
@overload
1274-
def __new__(cls, /) -> frozendict[Any, Any]: ...
1279+
def __new__(cls, /) -> frozendict[Hashable, Any]: ...
12751280
@overload
12761281
def __new__(cls: type[frozendict[str, _VT]], /, **kwargs: _VT) -> frozendict[str, _VT]: ...
12771282
@overload
@@ -1290,10 +1295,10 @@ if sys.version_info >= (3, 15):
12901295
def copy(self) -> frozendict[_KT, _VT]: ...
12911296
@overload
12921297
@classmethod
1293-
def fromkeys(cls, iterable: Iterable[_T], value: None = None, /) -> frozendict[_T, Any | None]: ...
1298+
def fromkeys(cls, iterable: Iterable[_H1], value: None = None, /) -> frozendict[_H1, Any | None]: ...
12941299
@overload
12951300
@classmethod
1296-
def fromkeys(cls, iterable: Iterable[_T], value: _S, /) -> frozendict[_T, _S]: ...
1301+
def fromkeys(cls, iterable: Iterable[_H1], value: _T, /) -> frozendict[_H1, _T]: ...
12971302
@overload # type: ignore[override]
12981303
def get(self, key: _KT, default: None = None, /) -> _VT | None: ...
12991304
@overload
@@ -1316,70 +1321,70 @@ if sys.version_info >= (3, 15):
13161321
def __ror__(self, value: frozendict[_T1, _T2], /) -> frozendict[_KT | _T1, _VT | _T2]: ...
13171322

13181323
@disjoint_base
1319-
class set(MutableSet[_T]):
1324+
class set(MutableSet[_H1]):
13201325
@overload
13211326
def __init__(self) -> None: ...
13221327
@overload
1323-
def __init__(self, iterable: Iterable[_T], /) -> None: ...
1324-
def add(self, element: _T, /) -> None: ...
1325-
def copy(self) -> set[_T]: ...
1326-
def difference(self, *s: Iterable[object]) -> set[_T]: ...
1327-
def difference_update(self, *s: Iterable[object]) -> None: ...
1328-
def discard(self, element: object, /) -> None: ...
1329-
def intersection(self, *s: Iterable[object]) -> set[_T]: ...
1330-
def intersection_update(self, *s: Iterable[object]) -> None: ...
1331-
def isdisjoint(self, s: Iterable[object], /) -> bool: ...
1332-
def issubset(self, s: Iterable[object], /) -> bool: ...
1333-
def issuperset(self, s: Iterable[object], /) -> bool: ...
1334-
def remove(self, element: _T, /) -> None: ...
1335-
def symmetric_difference(self, s: Iterable[_S], /) -> set[_T | _S]: ...
1336-
def symmetric_difference_update(self, s: Iterable[_T], /) -> None: ...
1337-
def union(self, *s: Iterable[_S]) -> set[_T | _S]: ...
1338-
def update(self, *s: Iterable[_T]) -> None: ...
1328+
def __init__(self, iterable: Iterable[_H1], /) -> None: ...
1329+
def add(self, element: _H1, /) -> None: ...
1330+
def copy(self) -> set[_H1]: ...
1331+
def difference(self, *s: Iterable[Hashable]) -> set[_H1]: ...
1332+
def difference_update(self, *s: Iterable[Hashable]) -> None: ...
1333+
def discard(self, element: Hashable, /) -> None: ...
1334+
def intersection(self, *s: Iterable[Hashable]) -> set[_H1]: ...
1335+
def intersection_update(self, *s: Iterable[Hashable]) -> None: ...
1336+
def isdisjoint(self, s: Iterable[Hashable], /) -> bool: ...
1337+
def issubset(self, s: Iterable[Hashable], /) -> bool: ...
1338+
def issuperset(self, s: Iterable[Hashable], /) -> bool: ...
1339+
def remove(self, element: _H1, /) -> None: ...
1340+
def symmetric_difference(self, s: Iterable[_H2], /) -> set[_H1 | _H2]: ...
1341+
def symmetric_difference_update(self, s: Iterable[_H1], /) -> None: ...
1342+
def union(self, *s: Iterable[_H2]) -> set[_H1 | _H2]: ...
1343+
def update(self, *s: Iterable[_H1]) -> None: ...
13391344
def __len__(self) -> int: ...
1340-
def __contains__(self, o: object, /) -> bool: ...
1341-
def __iter__(self) -> Iterator[_T]: ...
1342-
def __and__(self, value: AbstractSet[object], /) -> set[_T]: ...
1343-
def __iand__(self, value: AbstractSet[object], /) -> Self: ...
1344-
def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ...
1345-
def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc]
1346-
def __sub__(self, value: AbstractSet[object], /) -> set[_T]: ...
1347-
def __isub__(self, value: AbstractSet[object], /) -> Self: ...
1348-
def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ...
1349-
def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc]
1350-
def __le__(self, value: AbstractSet[object], /) -> bool: ...
1351-
def __lt__(self, value: AbstractSet[object], /) -> bool: ...
1352-
def __ge__(self, value: AbstractSet[object], /) -> bool: ...
1353-
def __gt__(self, value: AbstractSet[object], /) -> bool: ...
1345+
def __contains__(self, o: Hashable, /) -> bool: ...
1346+
def __iter__(self) -> Iterator[_H1]: ...
1347+
def __and__(self, value: AbstractSet[Hashable], /) -> set[_H1]: ...
1348+
def __iand__(self, value: AbstractSet[Hashable], /) -> Self: ...
1349+
def __or__(self, value: AbstractSet[_H2], /) -> set[_H1 | _H2]: ...
1350+
def __ior__(self, value: AbstractSet[_H1], /) -> Self: ... # type: ignore[override,misc]
1351+
def __sub__(self, value: AbstractSet[Hashable], /) -> set[_H1]: ...
1352+
def __isub__(self, value: AbstractSet[Hashable], /) -> Self: ...
1353+
def __xor__(self, value: AbstractSet[_H2], /) -> set[_H1 | _H2]: ...
1354+
def __ixor__(self, value: AbstractSet[_H1], /) -> Self: ... # type: ignore[override,misc]
1355+
def __le__(self, value: AbstractSet[Hashable], /) -> bool: ...
1356+
def __lt__(self, value: AbstractSet[Hashable], /) -> bool: ...
1357+
def __ge__(self, value: AbstractSet[Hashable], /) -> bool: ...
1358+
def __gt__(self, value: AbstractSet[Hashable], /) -> bool: ...
13541359
def __eq__(self, value: object, /) -> bool: ...
13551360
__hash__: ClassVar[None] # type: ignore[assignment]
13561361
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...
13571362

13581363
@disjoint_base
1359-
class frozenset(AbstractSet[_T_co]):
1364+
class frozenset(AbstractSet[_H1_co]):
13601365
@overload
13611366
def __new__(cls) -> Self: ...
13621367
@overload
1363-
def __new__(cls, iterable: Iterable[_T_co], /) -> Self: ...
1364-
def copy(self) -> frozenset[_T_co]: ...
1365-
def difference(self, *s: Iterable[object]) -> frozenset[_T_co]: ...
1366-
def intersection(self, *s: Iterable[object]) -> frozenset[_T_co]: ...
1367-
def isdisjoint(self, s: Iterable[object], /) -> bool: ...
1368-
def issubset(self, s: Iterable[object], /) -> bool: ...
1369-
def issuperset(self, s: Iterable[object], /) -> bool: ...
1370-
def symmetric_difference(self, s: Iterable[_S], /) -> frozenset[_T_co | _S]: ...
1371-
def union(self, *s: Iterable[_S]) -> frozenset[_T_co | _S]: ...
1368+
def __new__(cls, iterable: Iterable[_H1_co], /) -> Self: ...
1369+
def copy(self) -> frozenset[_H1_co]: ...
1370+
def difference(self, *s: Iterable[Hashable]) -> frozenset[_H1_co]: ...
1371+
def intersection(self, *s: Iterable[Hashable]) -> frozenset[_H1_co]: ...
1372+
def isdisjoint(self, s: Iterable[Hashable], /) -> bool: ...
1373+
def issubset(self, s: Iterable[Hashable], /) -> bool: ...
1374+
def issuperset(self, s: Iterable[Hashable], /) -> bool: ...
1375+
def symmetric_difference(self, s: Iterable[_H1], /) -> frozenset[_H1_co | _H1]: ...
1376+
def union(self, *s: Iterable[_H1]) -> frozenset[_H1_co | _H1]: ...
13721377
def __len__(self) -> int: ...
1373-
def __contains__(self, o: object, /) -> bool: ...
1374-
def __iter__(self) -> Iterator[_T_co]: ...
1375-
def __and__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ...
1376-
def __or__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ...
1377-
def __sub__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ...
1378-
def __xor__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ...
1379-
def __le__(self, value: AbstractSet[object], /) -> bool: ...
1380-
def __lt__(self, value: AbstractSet[object], /) -> bool: ...
1381-
def __ge__(self, value: AbstractSet[object], /) -> bool: ...
1382-
def __gt__(self, value: AbstractSet[object], /) -> bool: ...
1378+
def __contains__(self, o: Hashable, /) -> bool: ...
1379+
def __iter__(self) -> Iterator[_H1_co]: ...
1380+
def __and__(self, value: AbstractSet[Hashable], /) -> frozenset[_H1_co]: ...
1381+
def __or__(self, value: AbstractSet[_H1], /) -> frozenset[_H1_co | _H1]: ...
1382+
def __sub__(self, value: AbstractSet[Hashable], /) -> frozenset[_H1_co]: ...
1383+
def __xor__(self, value: AbstractSet[_H1], /) -> frozenset[_H1_co | _H1]: ...
1384+
def __le__(self, value: AbstractSet[Hashable], /) -> bool: ...
1385+
def __lt__(self, value: AbstractSet[Hashable], /) -> bool: ...
1386+
def __ge__(self, value: AbstractSet[Hashable], /) -> bool: ...
1387+
def __gt__(self, value: AbstractSet[Hashable], /) -> bool: ...
13831388
def __eq__(self, value: object, /) -> bool: ...
13841389
def __hash__(self) -> int: ...
13851390
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...

0 commit comments

Comments
 (0)