Skip to content

Commit 03b4bb9

Browse files
authored
Stdlib: add many missing __hash__ and __eq__ methods (#10464)
1 parent a048220 commit 03b4bb9

22 files changed

+78
-2
lines changed

stdlib/_collections_abc.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ _VT_co = TypeVar("_VT_co", covariant=True) # Value type covariant containers.
6969

7070
@final
7171
class dict_keys(KeysView[_KT_co], Generic[_KT_co, _VT_co]): # undocumented
72+
def __eq__(self, __value: object) -> bool: ...
7273
if sys.version_info >= (3, 10):
7374
@property
7475
def mapping(self) -> MappingProxyType[_KT_co, _VT_co]: ...
@@ -81,6 +82,7 @@ class dict_values(ValuesView[_VT_co], Generic[_KT_co, _VT_co]): # undocumented
8182

8283
@final
8384
class dict_items(ItemsView[_KT_co, _VT_co], Generic[_KT_co, _VT_co]): # undocumented
85+
def __eq__(self, __value: object) -> bool: ...
8486
if sys.version_info >= (3, 10):
8587
@property
8688
def mapping(self) -> MappingProxyType[_KT_co, _VT_co]: ...

stdlib/_weakref.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,20 @@ _T = TypeVar("_T")
1111

1212
@final
1313
class CallableProxyType(Generic[_C]): # "weakcallableproxy"
14+
def __eq__(self, __value: object) -> bool: ...
1415
def __getattr__(self, attr: str) -> Any: ...
1516
__call__: _C
1617

1718
@final
1819
class ProxyType(Generic[_T]): # "weakproxy"
20+
def __eq__(self, __value: object) -> bool: ...
1921
def __getattr__(self, attr: str) -> Any: ...
2022

2123
class ReferenceType(Generic[_T]):
2224
__callback__: Callable[[ReferenceType[_T]], Any]
2325
def __new__(cls, __o: _T, __callback: Callable[[ReferenceType[_T]], Any] | None = ...) -> Self: ...
2426
def __call__(self) -> _T | None: ...
27+
def __eq__(self, __value: object) -> bool: ...
2528
def __hash__(self) -> int: ...
2629
if sys.version_info >= (3, 9):
2730
def __class_getitem__(cls, item: Any) -> GenericAlias: ...

stdlib/array.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class array(MutableSequence[_T], Generic[_T]):
7070
def __setitem__(self, __key: slice, __value: array[_T]) -> None: ...
7171
def __delitem__(self, __key: SupportsIndex | slice) -> None: ...
7272
def __add__(self, __value: array[_T]) -> array[_T]: ...
73+
def __eq__(self, __value: object) -> bool: ...
7374
def __ge__(self, __value: array[_T]) -> bool: ...
7475
def __gt__(self, __value: array[_T]) -> bool: ...
7576
def __iadd__(self, __value: array[_T]) -> Self: ... # type: ignore[override]

stdlib/builtins.pyi

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,8 @@ class memoryview(Sequence[int]):
874874
def __contains__(self, __x: object) -> bool: ...
875875
def __iter__(self) -> Iterator[int]: ...
876876
def __len__(self) -> int: ...
877+
def __eq__(self, __value: object) -> bool: ...
878+
def __hash__(self) -> int: ...
877879
@overload
878880
def __setitem__(self, __key: slice, __value: ReadableBuffer) -> None: ...
879881
@overload
@@ -941,6 +943,7 @@ class slice:
941943
def __init__(self, __stop: Any) -> None: ...
942944
@overload
943945
def __init__(self, __start: Any, __stop: Any, __step: Any = ...) -> None: ...
946+
def __eq__(self, __value: object) -> bool: ...
944947
__hash__: ClassVar[None] # type: ignore[assignment]
945948
def indices(self, __len: SupportsIndex) -> tuple[int, int, int]: ...
946949

@@ -957,6 +960,8 @@ class tuple(Sequence[_T_co], Generic[_T_co]):
957960
def __le__(self, __value: tuple[_T_co, ...]) -> bool: ...
958961
def __gt__(self, __value: tuple[_T_co, ...]) -> bool: ...
959962
def __ge__(self, __value: tuple[_T_co, ...]) -> bool: ...
963+
def __eq__(self, __value: object) -> bool: ...
964+
def __hash__(self) -> int: ...
960965
@overload
961966
def __add__(self, __value: tuple[_T_co, ...]) -> tuple[_T_co, ...]: ...
962967
@overload
@@ -1045,6 +1050,7 @@ class list(MutableSequence[_T], Generic[_T]):
10451050
def __ge__(self, __value: list[_T]) -> bool: ...
10461051
def __lt__(self, __value: list[_T]) -> bool: ...
10471052
def __le__(self, __value: list[_T]) -> bool: ...
1053+
def __eq__(self, __value: object) -> bool: ...
10481054
if sys.version_info >= (3, 9):
10491055
def __class_getitem__(cls, __item: Any) -> GenericAlias: ...
10501056

@@ -1097,6 +1103,7 @@ class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
10971103
def __setitem__(self, __key: _KT, __value: _VT) -> None: ...
10981104
def __delitem__(self, __key: _KT) -> None: ...
10991105
def __iter__(self) -> Iterator[_KT]: ...
1106+
def __eq__(self, __value: object) -> bool: ...
11001107
if sys.version_info >= (3, 8):
11011108
def __reversed__(self) -> Iterator[_KT]: ...
11021109
__hash__: ClassVar[None] # type: ignore[assignment]
@@ -1151,6 +1158,7 @@ class set(MutableSet[_T], Generic[_T]):
11511158
def __lt__(self, __value: AbstractSet[object]) -> bool: ...
11521159
def __ge__(self, __value: AbstractSet[object]) -> bool: ...
11531160
def __gt__(self, __value: AbstractSet[object]) -> bool: ...
1161+
def __eq__(self, __value: object) -> bool: ...
11541162
__hash__: ClassVar[None] # type: ignore[assignment]
11551163
if sys.version_info >= (3, 9):
11561164
def __class_getitem__(cls, __item: Any) -> GenericAlias: ...
@@ -1179,6 +1187,8 @@ class frozenset(AbstractSet[_T_co], Generic[_T_co]):
11791187
def __lt__(self, __value: AbstractSet[object]) -> bool: ...
11801188
def __ge__(self, __value: AbstractSet[object]) -> bool: ...
11811189
def __gt__(self, __value: AbstractSet[object]) -> bool: ...
1190+
def __eq__(self, __value: object) -> bool: ...
1191+
def __hash__(self) -> int: ...
11821192
if sys.version_info >= (3, 9):
11831193
def __class_getitem__(cls, __item: Any) -> GenericAlias: ...
11841194

@@ -1204,6 +1214,8 @@ class range(Sequence[int]):
12041214
def count(self, __value: int) -> int: ...
12051215
def index(self, __value: int) -> int: ... # type: ignore[override]
12061216
def __len__(self) -> int: ...
1217+
def __eq__(self, __value: object) -> bool: ...
1218+
def __hash__(self) -> int: ...
12071219
def __contains__(self, __key: object) -> bool: ...
12081220
def __iter__(self) -> Iterator[int]: ...
12091221
@overload

stdlib/collections/__init__.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class UserString(Sequence[UserString]):
153153
def __gt__(self, string: str | UserString) -> bool: ...
154154
def __ge__(self, string: str | UserString) -> bool: ...
155155
def __eq__(self, string: object) -> bool: ...
156+
def __hash__(self) -> int: ...
156157
def __contains__(self, char: object) -> bool: ...
157158
def __len__(self) -> int: ...
158159
def __getitem__(self, index: SupportsIndex | slice) -> Self: ...
@@ -257,6 +258,7 @@ class deque(MutableSequence[_T], Generic[_T]):
257258
def __le__(self, __value: deque[_T]) -> bool: ...
258259
def __gt__(self, __value: deque[_T]) -> bool: ...
259260
def __ge__(self, __value: deque[_T]) -> bool: ...
261+
def __eq__(self, __value: object) -> bool: ...
260262
if sys.version_info >= (3, 9):
261263
def __class_getitem__(cls, __item: Any) -> GenericAlias: ...
262264

@@ -365,6 +367,7 @@ class OrderedDict(dict[_KT, _VT], Reversible[_KT], Generic[_KT, _VT]):
365367
def setdefault(self: OrderedDict[_KT, _T | None], key: _KT, default: None = None) -> _T | None: ...
366368
@overload
367369
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
370+
def __eq__(self, __value: object) -> bool: ...
368371

369372
class defaultdict(dict[_KT, _VT], Generic[_KT, _VT]):
370373
default_factory: Callable[[], _VT] | None

stdlib/contextvars.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class ContextVar(Generic[_T]):
1818
def __init__(self, name: str) -> None: ...
1919
@overload
2020
def __init__(self, name: str, *, default: _T) -> None: ...
21+
def __hash__(self) -> int: ...
2122
@property
2223
def name(self) -> str: ...
2324
@overload
@@ -60,3 +61,4 @@ class Context(Mapping[ContextVar[Any], Any]):
6061
def __getitem__(self, __key: ContextVar[_T]) -> _T: ...
6162
def __iter__(self) -> Iterator[ContextVar[Any]]: ...
6263
def __len__(self) -> int: ...
64+
def __eq__(self, __value: object) -> bool: ...

stdlib/datetime.pyi

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class timezone(tzinfo):
3636
def utcoffset(self, __dt: datetime | None) -> timedelta: ...
3737
def dst(self, __dt: datetime | None) -> None: ...
3838
def __hash__(self) -> int: ...
39+
def __eq__(self, __value: object) -> bool: ...
3940

4041
if sys.version_info >= (3, 11):
4142
UTC: timezone
@@ -87,6 +88,7 @@ class date:
8788
def __lt__(self, __value: date) -> bool: ...
8889
def __ge__(self, __value: date) -> bool: ...
8990
def __gt__(self, __value: date) -> bool: ...
91+
def __eq__(self, __value: object) -> bool: ...
9092
if sys.version_info >= (3, 8):
9193
def __add__(self, __value: timedelta) -> Self: ...
9294
def __radd__(self, __value: timedelta) -> Self: ...
@@ -145,6 +147,7 @@ class time:
145147
def __lt__(self, __value: time) -> bool: ...
146148
def __ge__(self, __value: time) -> bool: ...
147149
def __gt__(self, __value: time) -> bool: ...
150+
def __eq__(self, __value: object) -> bool: ...
148151
def __hash__(self) -> int: ...
149152
def isoformat(self, timespec: str = ...) -> str: ...
150153
@classmethod
@@ -219,6 +222,7 @@ class timedelta:
219222
def __lt__(self, __value: timedelta) -> bool: ...
220223
def __ge__(self, __value: timedelta) -> bool: ...
221224
def __gt__(self, __value: timedelta) -> bool: ...
225+
def __eq__(self, __value: object) -> bool: ...
222226
def __bool__(self) -> bool: ...
223227
def __hash__(self) -> int: ...
224228

@@ -310,6 +314,8 @@ class datetime(date):
310314
def __lt__(self, __value: datetime) -> bool: ... # type: ignore[override]
311315
def __ge__(self, __value: datetime) -> bool: ... # type: ignore[override]
312316
def __gt__(self, __value: datetime) -> bool: ... # type: ignore[override]
317+
def __eq__(self, __value: object) -> bool: ...
318+
def __hash__(self) -> int: ...
313319
if sys.version_info >= (3, 8):
314320
@overload # type: ignore[override]
315321
def __sub__(self, __value: timedelta) -> Self: ...

stdlib/enum.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ class Enum(metaclass=EnumMeta):
190190
# and in practice using `object` here has the same effect as using `Any`.
191191
def __new__(cls, value: object) -> Self: ...
192192
def __dir__(self) -> list[str]: ...
193+
def __hash__(self) -> int: ...
193194
def __format__(self, format_spec: str) -> str: ...
194195
def __reduce_ex__(self, proto: Unused) -> tuple[Any, ...]: ...
195196

stdlib/importlib/machinery.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,4 @@ class ExtensionFileLoader(importlib.abc.ExecutionLoader):
148148
def exec_module(self, module: types.ModuleType) -> None: ...
149149
def get_code(self, fullname: str) -> None: ...
150150
def __eq__(self, other: object) -> bool: ...
151+
def __hash__(self) -> int: ...

stdlib/importlib/metadata/__init__.pyi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ class EntryPoint(_EntryPointBase):
6666
extras: list[str] = ...,
6767
) -> bool: ... # undocumented
6868

69+
def __hash__(self) -> int: ...
70+
def __eq__(self, other: object) -> bool: ...
71+
6972
if sys.version_info >= (3, 10):
7073
class EntryPoints(list[EntryPoint]): # use as list is deprecated since 3.10
7174
# int argument is deprecated since 3.10

stdlib/inspect.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ class Signature:
354354
def from_callable(cls, obj: _IntrospectableCallable, *, follow_wrapped: bool = True) -> Self: ...
355355

356356
def __eq__(self, other: object) -> bool: ...
357+
def __hash__(self) -> int: ...
357358

358359
if sys.version_info >= (3, 10):
359360
def get_annotations(
@@ -413,6 +414,7 @@ class Parameter:
413414
annotation: Any = ...,
414415
) -> Self: ...
415416
def __eq__(self, other: object) -> bool: ...
417+
def __hash__(self) -> int: ...
416418

417419
class BoundArguments:
418420
arguments: OrderedDict[str, Any]

stdlib/ipaddress.pyi

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class _BaseNetwork(_IPAddressBase, Container[_A], Iterable[_A], Generic[_A]):
7878
def __getitem__(self, n: int) -> _A: ...
7979
def __iter__(self) -> Iterator[_A]: ...
8080
def __eq__(self, other: object) -> bool: ...
81+
def __hash__(self) -> int: ...
8182
def __lt__(self, other: Self) -> bool: ...
8283
if sys.version_info >= (3, 11):
8384
def __ge__(self, other: Self) -> bool: ...
@@ -148,7 +149,10 @@ class _BaseV4:
148149

149150
class IPv4Address(_BaseV4, _BaseAddress): ...
150151
class IPv4Network(_BaseV4, _BaseNetwork[IPv4Address]): ...
151-
class IPv4Interface(IPv4Address, _BaseInterface[IPv4Address, IPv4Network]): ...
152+
153+
class IPv4Interface(IPv4Address, _BaseInterface[IPv4Address, IPv4Network]):
154+
def __eq__(self, other: object) -> bool: ...
155+
def __hash__(self) -> int: ...
152156

153157
class _BaseV6:
154158
@property
@@ -169,11 +173,16 @@ class IPv6Address(_BaseV6, _BaseAddress):
169173
@property
170174
def scope_id(self) -> str | None: ...
171175

176+
def __hash__(self) -> int: ...
177+
def __eq__(self, other: object) -> bool: ...
178+
172179
class IPv6Network(_BaseV6, _BaseNetwork[IPv6Address]):
173180
@property
174181
def is_site_local(self) -> bool: ...
175182

176-
class IPv6Interface(IPv6Address, _BaseInterface[IPv6Address, IPv6Network]): ...
183+
class IPv6Interface(IPv6Address, _BaseInterface[IPv6Address, IPv6Network]):
184+
def __eq__(self, other: object) -> bool: ...
185+
def __hash__(self) -> int: ...
177186

178187
def v4_int_to_packed(address: int) -> bytes: ...
179188
def v6_int_to_packed(address: int) -> bytes: ...

stdlib/re.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ class Pattern(Generic[AnyStr]):
175175
def subn(self, repl: AnyStr | Callable[[Match[AnyStr]], AnyStr], string: AnyStr, count: int = 0) -> tuple[AnyStr, int]: ...
176176
def __copy__(self) -> Pattern[AnyStr]: ...
177177
def __deepcopy__(self, __memo: Any) -> Pattern[AnyStr]: ...
178+
def __eq__(self, __value: object) -> bool: ...
179+
def __hash__(self) -> int: ...
178180
if sys.version_info >= (3, 9):
179181
def __class_getitem__(cls, item: Any) -> GenericAlias: ...
180182

stdlib/ssl.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ class SSLSession:
485485
def time(self) -> int: ...
486486
@property
487487
def timeout(self) -> int: ...
488+
def __eq__(self, __value: object) -> bool: ...
488489

489490
class SSLErrorNumber(enum.IntEnum):
490491
SSL_ERROR_EOF: int

stdlib/tracemalloc.pyi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class Statistic:
3737
traceback: Traceback
3838
def __init__(self, traceback: Traceback, size: int, count: int) -> None: ...
3939
def __eq__(self, other: object) -> bool: ...
40+
def __hash__(self) -> int: ...
4041

4142
class StatisticDiff:
4243
count: int
@@ -46,6 +47,7 @@ class StatisticDiff:
4647
traceback: Traceback
4748
def __init__(self, traceback: Traceback, size: int, size_diff: int, count: int, count_diff: int) -> None: ...
4849
def __eq__(self, other: object) -> bool: ...
50+
def __hash__(self) -> int: ...
4951

5052
_FrameTuple: TypeAlias = tuple[str, int]
5153

@@ -56,6 +58,7 @@ class Frame:
5658
def lineno(self) -> int: ...
5759
def __init__(self, frame: _FrameTuple) -> None: ...
5860
def __eq__(self, other: object) -> bool: ...
61+
def __hash__(self) -> int: ...
5962
def __lt__(self, other: Frame) -> bool: ...
6063
if sys.version_info >= (3, 11):
6164
def __gt__(self, other: Frame) -> bool: ...
@@ -80,6 +83,7 @@ class Trace:
8083
def traceback(self) -> Traceback: ...
8184
def __init__(self, trace: _TraceTuple) -> None: ...
8285
def __eq__(self, other: object) -> bool: ...
86+
def __hash__(self) -> int: ...
8387

8488
class Traceback(Sequence[Frame]):
8589
if sys.version_info >= (3, 9):
@@ -97,6 +101,7 @@ class Traceback(Sequence[Frame]):
97101
def __contains__(self, frame: Frame) -> bool: ... # type: ignore[override]
98102
def __len__(self) -> int: ...
99103
def __eq__(self, other: object) -> bool: ...
104+
def __hash__(self) -> int: ...
100105
def __lt__(self, other: Traceback) -> bool: ...
101106
if sys.version_info >= (3, 11):
102107
def __gt__(self, other: Traceback) -> bool: ...

stdlib/types.pyi

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class _Cell:
7171
if sys.version_info >= (3, 8):
7272
def __init__(self, __contents: object = ...) -> None: ...
7373

74+
def __eq__(self, __value: object) -> bool: ...
7475
__hash__: ClassVar[None] # type: ignore[assignment]
7576
cell_contents: Any
7677

@@ -113,6 +114,8 @@ LambdaType = FunctionType
113114

114115
@final
115116
class CodeType:
117+
def __eq__(self, __value: object) -> bool: ...
118+
def __hash__(self) -> int: ...
116119
@property
117120
def co_argcount(self) -> int: ...
118121
if sys.version_info >= (3, 8):
@@ -326,6 +329,7 @@ class MappingProxyType(Mapping[_KT, _VT_co], Generic[_KT, _VT_co]):
326329
class SimpleNamespace:
327330
__hash__: ClassVar[None] # type: ignore[assignment]
328331
def __init__(self, **kwargs: Any) -> None: ...
332+
def __eq__(self, __value: object) -> bool: ...
329333
def __getattribute__(self, __name: str) -> Any: ...
330334
def __setattr__(self, __name: str, __value: Any) -> None: ...
331335
def __delattr__(self, __name: str) -> None: ...
@@ -442,6 +446,8 @@ class MethodType:
442446
def __qualname__(self) -> str: ... # inherited from the added function
443447
def __init__(self, __func: Callable[..., Any], __obj: object) -> None: ...
444448
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
449+
def __eq__(self, __value: object) -> bool: ...
450+
def __hash__(self) -> int: ...
445451

446452
@final
447453
class BuiltinFunctionType:
@@ -452,6 +458,8 @@ class BuiltinFunctionType:
452458
@property
453459
def __qualname__(self) -> str: ...
454460
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
461+
def __eq__(self, __value: object) -> bool: ...
462+
def __hash__(self) -> int: ...
455463

456464
BuiltinMethodType = BuiltinFunctionType
457465

@@ -479,6 +487,7 @@ class MethodWrapperType:
479487
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
480488
def __eq__(self, __value: object) -> bool: ...
481489
def __ne__(self, __value: object) -> bool: ...
490+
def __hash__(self) -> int: ...
482491

483492
@final
484493
class MethodDescriptorType:
@@ -603,6 +612,8 @@ if sys.version_info >= (3, 9):
603612
def __parameters__(self) -> tuple[Any, ...]: ...
604613
def __init__(self, origin: type, args: Any) -> None: ...
605614
def __getitem__(self, __typeargs: Any) -> GenericAlias: ...
615+
def __eq__(self, __value: object) -> bool: ...
616+
def __hash__(self) -> int: ...
606617
if sys.version_info >= (3, 11):
607618
@property
608619
def __unpacked__(self) -> bool: ...
@@ -626,3 +637,5 @@ if sys.version_info >= (3, 10):
626637
def __args__(self) -> tuple[Any, ...]: ...
627638
def __or__(self, __value: Any) -> UnionType: ...
628639
def __ror__(self, __value: Any) -> UnionType: ...
640+
def __eq__(self, __value: object) -> bool: ...
641+
def __hash__(self) -> int: ...

0 commit comments

Comments
 (0)