From 292e6450f7a16606f9f670320c15617b54ff3cc3 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Tue, 9 Dec 2025 17:04:53 +0100 Subject: [PATCH 1/2] made IntEnum integer interface final --- stdlib/enum.pyi | 118 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 116 insertions(+), 2 deletions(-) diff --git a/stdlib/enum.pyi b/stdlib/enum.pyi index c131c9392393..6a6a8d9165c3 100644 --- a/stdlib/enum.pyi +++ b/stdlib/enum.pyi @@ -2,9 +2,9 @@ import _typeshed import sys import types from _typeshed import SupportsKeysAndGetItem, Unused -from builtins import property as _builtins_property +from builtins import _NegativeInteger, _PositiveInteger, property as _builtins_property from collections.abc import Callable, Iterable, Iterator, Mapping -from typing import Any, Final, Generic, Literal, TypeVar, overload +from typing import Any, Final, Generic, Literal, SupportsIndex, TypeVar, final, overload from typing_extensions import Self, TypeAlias, disjoint_base __all__ = ["EnumMeta", "Enum", "IntEnum", "Flag", "IntFlag", "auto", "unique"] @@ -233,7 +233,121 @@ if sys.version_info >= (3, 12): _value_: int @_magic_enum_attr def value(self) -> int: ... + @final def __new__(cls, value: int) -> Self: ... + @final + def __add__(self, value: int, /) -> int: ... + @final + def __sub__(self, value: int, /) -> int: ... + @final + def __mul__(self, value: int, /) -> int: ... + @final + def __floordiv__(self, value: int, /) -> int: ... + @final + def __truediv__(self, value: int, /) -> float: ... + @final + def __mod__(self, value: int, /) -> int: ... + @final + def __divmod__(self, value: int, /) -> tuple[int, int]: ... + @final + def __radd__(self, value: int, /) -> int: ... + @final + def __rsub__(self, value: int, /) -> int: ... + @final + def __rmul__(self, value: int, /) -> int: ... + @final + def __rfloordiv__(self, value: int, /) -> int: ... + @final + def __rtruediv__(self, value: int, /) -> float: ... + @final + def __rmod__(self, value: int, /) -> int: ... + @final + def __rdivmod__(self, value: int, /) -> tuple[int, int]: ... + @overload + @final + def __pow__(self, x: Literal[0], /) -> Literal[1]: ... + @overload + @final + def __pow__(self, value: Literal[0], mod: None, /) -> Literal[1]: ... + @overload + @final + def __pow__(self, value: _PositiveInteger, mod: None = None, /) -> int: ... + @overload + @final + def __pow__(self, value: _NegativeInteger, mod: None = None, /) -> float: ... + # positive __value -> int; negative __value -> float + # return type must be Any as `int | float` causes too many false-positive errors + @overload + @final + def __pow__(self, value: int, mod: None = None, /) -> Any: ... + @overload + @final + def __pow__(self, value: int, mod: int, /) -> int: ... + @final + def __rpow__(self, value: int, mod: int | None = None, /) -> Any: ... + @final + def __and__(self, value: int, /) -> int: ... + @final + def __or__(self, value: int, /) -> int: ... + @final + def __xor__(self, value: int, /) -> int: ... + @final + def __lshift__(self, value: int, /) -> int: ... + @final + def __rshift__(self, value: int, /) -> int: ... + @final + def __rand__(self, value: int, /) -> int: ... + @final + def __ror__(self, value: int, /) -> int: ... + @final + def __rxor__(self, value: int, /) -> int: ... + @final + def __rlshift__(self, value: int, /) -> int: ... + @final + def __rrshift__(self, value: int, /) -> int: ... + @final + def __neg__(self) -> int: ... + @final + def __pos__(self) -> int: ... + @final + def __invert__(self) -> int: ... + @final + def __trunc__(self) -> int: ... + @final + def __ceil__(self) -> int: ... + @final + def __floor__(self) -> int: ... + if sys.version_info >= (3, 14): + @final + def __round__(self, ndigits: SupportsIndex | None = None, /) -> int: ... + else: + @final + def __round__(self, ndigits: SupportsIndex = ..., /) -> int: ... + + @final + def __eq__(self, value: object, /) -> bool: ... + @final + def __ne__(self, value: object, /) -> bool: ... + @final + def __lt__(self, value: int, /) -> bool: ... + @final + def __le__(self, value: int, /) -> bool: ... + @final + def __gt__(self, value: int, /) -> bool: ... + @final + def __ge__(self, value: int, /) -> bool: ... + @final + def __float__(self) -> float: ... + @final + def __int__(self) -> int: ... + @final + def __abs__(self) -> int: ... + @final + def __hash__(self) -> int: ... + @final + def __bool__(self) -> bool: ... + @final + def __index__(self) -> int: ... else: if sys.version_info >= (3, 11): From 540486668e2e3cf63ca1bd81d340ae33a4b9fc60 Mon Sep 17 00:00:00 2001 From: Randolf Scholz Date: Tue, 9 Dec 2025 17:07:03 +0100 Subject: [PATCH 2/2] only first overload needs @final --- stdlib/enum.pyi | 5 ----- 1 file changed, 5 deletions(-) diff --git a/stdlib/enum.pyi b/stdlib/enum.pyi index 6a6a8d9165c3..1b3acbec22c0 100644 --- a/stdlib/enum.pyi +++ b/stdlib/enum.pyi @@ -267,21 +267,16 @@ if sys.version_info >= (3, 12): @final def __pow__(self, x: Literal[0], /) -> Literal[1]: ... @overload - @final def __pow__(self, value: Literal[0], mod: None, /) -> Literal[1]: ... @overload - @final def __pow__(self, value: _PositiveInteger, mod: None = None, /) -> int: ... @overload - @final def __pow__(self, value: _NegativeInteger, mod: None = None, /) -> float: ... # positive __value -> int; negative __value -> float # return type must be Any as `int | float` causes too many false-positive errors @overload - @final def __pow__(self, value: int, mod: None = None, /) -> Any: ... @overload - @final def __pow__(self, value: int, mod: int, /) -> int: ... @final def __rpow__(self, value: int, mod: int | None = None, /) -> Any: ...