From 26d38e360628a0e4cf69f5bb12107c8d71ab78e2 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 10:35:49 +0200 Subject: [PATCH 01/20] Update mypy to 2.4.0 --- requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-tests.txt b/requirements-tests.txt index beb6270218a8..79b885f290db 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -1,6 +1,6 @@ # Type checkers that we test our stubs against. These should always # be pinned to a specific version to make failure reproducible. -mypy==2.3.1 +mypy==2.4.0 pyrefly==1.3.2 pyright==1.1.414 ty==0.0.84 From a76c3d7be83c0c80c96eed694d0524ac720c31a3 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 11:27:55 +0200 Subject: [PATCH 02/20] Properly type (bytes,bytearray).__mod__ Add date.__rsub__ Add allowlist entries --- stdlib/@tests/stubtest_allowlists/common.txt | 20 ++++++++++++++++++++ stdlib/builtins.pyi | 6 +++--- stdlib/datetime.pyi | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/stdlib/@tests/stubtest_allowlists/common.txt b/stdlib/@tests/stubtest_allowlists/common.txt index 3e60c5bfd371..08b2217f7f57 100644 --- a/stdlib/@tests/stubtest_allowlists/common.txt +++ b/stdlib/@tests/stubtest_allowlists/common.txt @@ -43,6 +43,26 @@ builtins.super.__self__ builtins.super.__self_class__ builtins.super.__thisclass__ +# These reverse operator implementations use generated slot wrappers +# returning `NotImplemented`, which is why they aren't defined in typeshed. +builtins.bytearray.__rmod__ +builtins.bytes.__rmod__ +builtins.frozenset.__rand__ +builtins.frozenset.__ror__ +builtins.frozenset.__rsub__ +builtins.frozenset.__rxor__ +builtins.set.__rand__ +builtins.set.__ror__ +builtins.set.__rsub__ +builtins.set.__rxor__ +builtins.str.__rmod__ +# The following reverse operators are also missing from the Python +# implementation. +datetime.timedelta.__rdivmod__ +datetime.timedelta.__rfloordiv__ +datetime.timedelta.__rmod__ +datetime.timedelta.__rtruediv__ + # Undocumented implementation details email.contentmanager.get_and_fixup_unknown_message_content email.contentmanager.get_message_content diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 0cd6bd32b256..f3e654e85431 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -66,7 +66,7 @@ from typing import ( # noqa: Y022 # ruff: ignore[deprecated-import] # we can't import `Literal` from typing or mypy crashes: see #11247 # ruff: ignore[deprecated-import] -from typing_extensions import Literal, LiteralString, Self, TypeIs, TypeVarTuple, deprecated, disjoint_base # noqa: Y023 +from typing_extensions import Buffer, Literal, LiteralString, Self, TypeIs, TypeVarTuple, deprecated, disjoint_base # noqa: Y023 if sys.version_info >= (3, 14): from _typeshed import AnnotateFunc @@ -826,7 +826,7 @@ class bytes(Sequence[int]): def __add__(self, value: ReadableBuffer, /) -> bytes: ... def __mul__(self, value: SupportsIndex, /) -> bytes: ... def __rmul__(self, value: SupportsIndex, /) -> bytes: ... - def __mod__(self, value: Any, /) -> bytes: ... + def __mod__(self, value: Buffer | SupportsBytes, /) -> bytes: ... # Incompatible with Sequence.__contains__ def __contains__(self, key: SupportsIndex | ReadableBuffer, /) -> bool: ... # type: ignore[override] def __eq__(self, value: object, /) -> bool: ... @@ -957,7 +957,7 @@ class bytearray(MutableSequence[int]): def __mul__(self, value: SupportsIndex, /) -> bytearray: ... def __rmul__(self, value: SupportsIndex, /) -> bytearray: ... def __imul__(self, value: SupportsIndex, /) -> Self: ... - def __mod__(self, value: Any, /) -> bytes: ... + def __mod__(self, value: Buffer | SupportsBytes, /) -> bytearray: ... # Incompatible with Sequence.__contains__ def __contains__(self, key: SupportsIndex | ReadableBuffer, /) -> bool: ... # type: ignore[override] def __eq__(self, value: object, /) -> bool: ... diff --git a/stdlib/datetime.pyi b/stdlib/datetime.pyi index 0a21f72b09de..1db39b9e4c26 100644 --- a/stdlib/datetime.pyi +++ b/stdlib/datetime.pyi @@ -120,6 +120,8 @@ class date: @overload def __sub__(self, value: timedelta, /) -> Self: ... + def __rsub__(self, value: timedelta) -> Self: ... + def __hash__(self) -> int: ... def weekday(self) -> int: ... def isoweekday(self) -> int: ... From 3d46254d178ff3bbcbc69f1efe527fd8be09c9d5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 8 Oct 2026 09:30:01 +0000 Subject: [PATCH 03/20] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/datetime.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stdlib/datetime.pyi b/stdlib/datetime.pyi index 1db39b9e4c26..1ba1d0f51efa 100644 --- a/stdlib/datetime.pyi +++ b/stdlib/datetime.pyi @@ -121,7 +121,6 @@ class date: def __sub__(self, value: timedelta, /) -> Self: ... def __rsub__(self, value: timedelta) -> Self: ... - def __hash__(self) -> int: ... def weekday(self) -> int: ... def isoweekday(self) -> int: ... From 0baa4629df5bad5035ee18c7b4a4b96977a34fce Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 12:22:13 +0200 Subject: [PATCH 04/20] Implement reverse operators Fix str.__mod__ argument (Any -> object) --- stdlib/@tests/stubtest_allowlists/common.txt | 17 ++------------- stdlib/builtins.pyi | 23 +++++++++++++++++++- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/stdlib/@tests/stubtest_allowlists/common.txt b/stdlib/@tests/stubtest_allowlists/common.txt index 08b2217f7f57..62cd989e2e51 100644 --- a/stdlib/@tests/stubtest_allowlists/common.txt +++ b/stdlib/@tests/stubtest_allowlists/common.txt @@ -43,21 +43,8 @@ builtins.super.__self__ builtins.super.__self_class__ builtins.super.__thisclass__ -# These reverse operator implementations use generated slot wrappers -# returning `NotImplemented`, which is why they aren't defined in typeshed. -builtins.bytearray.__rmod__ -builtins.bytes.__rmod__ -builtins.frozenset.__rand__ -builtins.frozenset.__ror__ -builtins.frozenset.__rsub__ -builtins.frozenset.__rxor__ -builtins.set.__rand__ -builtins.set.__ror__ -builtins.set.__rsub__ -builtins.set.__rxor__ -builtins.str.__rmod__ -# The following reverse operators are also missing from the Python -# implementation. +# The following reverse operators are present in the C implementation +# (probably incidental), but missing from the Python implementation. datetime.timedelta.__rdivmod__ datetime.timedelta.__rfloordiv__ datetime.timedelta.__rmod__ diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index f3e654e85431..d62e56a710a2 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -90,6 +90,9 @@ _AwaitableT = TypeVar("_AwaitableT", bound=Awaitable[Any]) _AwaitableT_co = TypeVar("_AwaitableT_co", bound=Awaitable[Any], covariant=True) _P = ParamSpec("_P") +# Type variables for set and frozenset +_SetT = TypeVar("_SetT", bound=set[Any] | frozenset[Any]) + # Type variables for slice _StartT_co = TypeVar("_StartT_co", covariant=True, default=Any) # slice -> slice[Any, Any, Any] _StopT_co = TypeVar("_StopT_co", covariant=True, default=_StartT_co) # slice[A] -> slice[A, A, A] @@ -711,7 +714,9 @@ class str(Sequence[str]): @overload def __mod__(self: LiteralString, value: LiteralString | tuple[LiteralString, ...], /) -> LiteralString: ... @overload - def __mod__(self, value: Any, /) -> str: ... + def __mod__(self, value: object, /) -> str: ... + + def __rmod__(self, value: str, /) -> str: ... @overload def __mul__(self: LiteralString, value: SupportsIndex, /) -> LiteralString: ... @@ -827,6 +832,7 @@ class bytes(Sequence[int]): def __mul__(self, value: SupportsIndex, /) -> bytes: ... def __rmul__(self, value: SupportsIndex, /) -> bytes: ... def __mod__(self, value: Buffer | SupportsBytes, /) -> bytes: ... + def __rmod__(self, value: bytes, /) -> bytes: ... # Incompatible with Sequence.__contains__ def __contains__(self, key: SupportsIndex | ReadableBuffer, /) -> bool: ... # type: ignore[override] def __eq__(self, value: object, /) -> bool: ... @@ -958,6 +964,7 @@ class bytearray(MutableSequence[int]): def __rmul__(self, value: SupportsIndex, /) -> bytearray: ... def __imul__(self, value: SupportsIndex, /) -> Self: ... def __mod__(self, value: Buffer | SupportsBytes, /) -> bytearray: ... + def __rmod__(self, value: bytearray, /) -> bytearray: ... # Incompatible with Sequence.__contains__ def __contains__(self, key: SupportsIndex | ReadableBuffer, /) -> bool: ... # type: ignore[override] def __eq__(self, value: object, /) -> bool: ... @@ -1457,12 +1464,22 @@ class set(MutableSet[_T]): def __iter__(self) -> Iterator[_T]: ... def __and__(self, value: AbstractSet[object], /) -> set[_T]: ... def __iand__(self, value: AbstractSet[object], /) -> Self: ... + def __rand__(self, value: _SetT, /) -> _SetT: ... def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] + @overload + def __ror__(self, value: set[_S], /) -> set[_T | _S]: ... + @overload + def __ror__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... def __sub__(self, value: AbstractSet[object], /) -> set[_T]: ... def __isub__(self, value: AbstractSet[object], /) -> Self: ... + def __rsub__(self, value: _SetT) -> _SetT: ... def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] + @overload + def __rxor__(self, value: set[_S], /) -> set[_T | _S]: ... + @overload + def __rxor__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... def __le__(self, value: AbstractSet[object], /) -> bool: ... def __lt__(self, value: AbstractSet[object], /) -> bool: ... def __ge__(self, value: AbstractSet[object], /) -> bool: ... @@ -1490,9 +1507,13 @@ class frozenset(AbstractSet[_T_co]): def __contains__(self, o: object, /) -> bool: ... def __iter__(self) -> Iterator[_T_co]: ... def __and__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ... + def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... def __or__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ... + def __ror__(self, value: frozenset[_S]) -> frozenset[_T_co | _S]: ... def __sub__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ... + def __rsub__(self, value: frozenset[_S]) -> frozenset[_S]: ... def __xor__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ... + def __rxor__(self, value: frozenset[_S], /) -> frozenset[_T_co | _S]: ... def __le__(self, value: AbstractSet[object], /) -> bool: ... def __lt__(self, value: AbstractSet[object], /) -> bool: ... def __ge__(self, value: AbstractSet[object], /) -> bool: ... From 76f9e6379dac52ec904ac06530fd70f5296c8068 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:24:48 +0000 Subject: [PATCH 05/20] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/builtins.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index d62e56a710a2..08d462cd8f64 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1467,19 +1467,23 @@ class set(MutableSet[_T]): def __rand__(self, value: _SetT, /) -> _SetT: ... def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] + @overload def __ror__(self, value: set[_S], /) -> set[_T | _S]: ... @overload def __ror__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... + def __sub__(self, value: AbstractSet[object], /) -> set[_T]: ... def __isub__(self, value: AbstractSet[object], /) -> Self: ... def __rsub__(self, value: _SetT) -> _SetT: ... def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] + @overload def __rxor__(self, value: set[_S], /) -> set[_T | _S]: ... @overload def __rxor__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... + def __le__(self, value: AbstractSet[object], /) -> bool: ... def __lt__(self, value: AbstractSet[object], /) -> bool: ... def __ge__(self, value: AbstractSet[object], /) -> bool: ... From cf4f4c8e4cc039f7c76e4e60eb583b7da549f7f1 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 12:38:08 +0200 Subject: [PATCH 06/20] Just use overloads --- stdlib/builtins.pyi | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 08d462cd8f64..500cadc89f03 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -90,9 +90,6 @@ _AwaitableT = TypeVar("_AwaitableT", bound=Awaitable[Any]) _AwaitableT_co = TypeVar("_AwaitableT_co", bound=Awaitable[Any], covariant=True) _P = ParamSpec("_P") -# Type variables for set and frozenset -_SetT = TypeVar("_SetT", bound=set[Any] | frozenset[Any]) - # Type variables for slice _StartT_co = TypeVar("_StartT_co", covariant=True, default=Any) # slice -> slice[Any, Any, Any] _StopT_co = TypeVar("_StopT_co", covariant=True, default=_StartT_co) # slice[A] -> slice[A, A, A] @@ -1464,7 +1461,12 @@ class set(MutableSet[_T]): def __iter__(self) -> Iterator[_T]: ... def __and__(self, value: AbstractSet[object], /) -> set[_T]: ... def __iand__(self, value: AbstractSet[object], /) -> Self: ... - def __rand__(self, value: _SetT, /) -> _SetT: ... + + @overload + def __rand__(self, value: set[_S], /) -> set[_S]: ... + @overload + def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... + def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] @@ -1475,7 +1477,12 @@ class set(MutableSet[_T]): def __sub__(self, value: AbstractSet[object], /) -> set[_T]: ... def __isub__(self, value: AbstractSet[object], /) -> Self: ... - def __rsub__(self, value: _SetT) -> _SetT: ... + + @overload + def __rsub__(self, value: set[_S]) -> set[_S]: ... + @overload + def __rsub__(self, value: frozenset[_S]) -> frozenset[_S]: ... + def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] From 5e6a43f6b3af6b86ea6a1d4e2aff045183d41747 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 12:52:01 +0200 Subject: [PATCH 07/20] Remove `date.__rsub__` --- stdlib/@tests/stubtest_allowlists/common.txt | 1 + stdlib/datetime.pyi | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/@tests/stubtest_allowlists/common.txt b/stdlib/@tests/stubtest_allowlists/common.txt index 62cd989e2e51..973611da6b3f 100644 --- a/stdlib/@tests/stubtest_allowlists/common.txt +++ b/stdlib/@tests/stubtest_allowlists/common.txt @@ -45,6 +45,7 @@ builtins.super.__thisclass__ # The following reverse operators are present in the C implementation # (probably incidental), but missing from the Python implementation. +datetime.date.__rsub__ datetime.timedelta.__rdivmod__ datetime.timedelta.__rfloordiv__ datetime.timedelta.__rmod__ diff --git a/stdlib/datetime.pyi b/stdlib/datetime.pyi index 1ba1d0f51efa..0a21f72b09de 100644 --- a/stdlib/datetime.pyi +++ b/stdlib/datetime.pyi @@ -120,7 +120,6 @@ class date: @overload def __sub__(self, value: timedelta, /) -> Self: ... - def __rsub__(self, value: timedelta) -> Self: ... def __hash__(self) -> int: ... def weekday(self) -> int: ... def isoweekday(self) -> int: ... From 7c153770ead138fb3374136054da5e74104059b3 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 12:55:29 +0200 Subject: [PATCH 08/20] Fix set reverse operators --- stdlib/builtins.pyi | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 500cadc89f03..0a61d390443c 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1518,13 +1518,33 @@ class frozenset(AbstractSet[_T_co]): def __contains__(self, o: object, /) -> bool: ... def __iter__(self) -> Iterator[_T_co]: ... def __and__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ... + + @overload + def __rand__(self, value: set[_S], /) -> set[_S]: ... + @overload def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... + def __or__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ... - def __ror__(self, value: frozenset[_S]) -> frozenset[_T_co | _S]: ... + + @overload + def __ror__(self, value: set[_S], /) -> set[_T_co | _S]: ... + @overload + def __ror__(self, value: frozenset[_S], /) -> frozenset[_T_co | _S]: ... + def __sub__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ... + + @overload + def __rsub__(self, value: set[_S]) -> set[_S]: ... + @overload def __rsub__(self, value: frozenset[_S]) -> frozenset[_S]: ... + def __xor__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ... + + @overload + def __rxor__(self, value: set[_S], /) -> set[_T_co | _S]: ... + @overload def __rxor__(self, value: frozenset[_S], /) -> frozenset[_T_co | _S]: ... + def __le__(self, value: AbstractSet[object], /) -> bool: ... def __lt__(self, value: AbstractSet[object], /) -> bool: ... def __ge__(self, value: AbstractSet[object], /) -> bool: ... From 37ed09397a2202cec942041557300b2f5872cbf4 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 12:56:59 +0200 Subject: [PATCH 09/20] Add datetime.datetime.__rsub__ to allowlist --- stdlib/@tests/stubtest_allowlists/common.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/stdlib/@tests/stubtest_allowlists/common.txt b/stdlib/@tests/stubtest_allowlists/common.txt index 973611da6b3f..605e4809f793 100644 --- a/stdlib/@tests/stubtest_allowlists/common.txt +++ b/stdlib/@tests/stubtest_allowlists/common.txt @@ -46,6 +46,7 @@ builtins.super.__thisclass__ # The following reverse operators are present in the C implementation # (probably incidental), but missing from the Python implementation. datetime.date.__rsub__ +datetime.datetime.__rsub__ datetime.timedelta.__rdivmod__ datetime.timedelta.__rfloordiv__ datetime.timedelta.__rmod__ From 0a7e0b52719e2ee4ee11dcc7d9a9f78b2cacc744 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 13:05:25 +0200 Subject: [PATCH 10/20] Fix pos-only --- stdlib/builtins.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 0a61d390443c..d47052fcdf04 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1479,9 +1479,9 @@ class set(MutableSet[_T]): def __isub__(self, value: AbstractSet[object], /) -> Self: ... @overload - def __rsub__(self, value: set[_S]) -> set[_S]: ... + def __rsub__(self, value: set[_S], /) -> set[_S]: ... @overload - def __rsub__(self, value: frozenset[_S]) -> frozenset[_S]: ... + def __rsub__(self, value: frozenset[_S], /) -> frozenset[_S]: ... def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] @@ -1534,9 +1534,9 @@ class frozenset(AbstractSet[_T_co]): def __sub__(self, value: AbstractSet[object], /) -> frozenset[_T_co]: ... @overload - def __rsub__(self, value: set[_S]) -> set[_S]: ... + def __rsub__(self, value: set[_S], /) -> set[_S]: ... @overload - def __rsub__(self, value: frozenset[_S]) -> frozenset[_S]: ... + def __rsub__(self, value: frozenset[_S], /) -> frozenset[_S]: ... def __xor__(self, value: AbstractSet[_S], /) -> frozenset[_T_co | _S]: ... From 862354f64a4c5f7c6d6a795dc84c2ba91b16b638 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 13:10:54 +0200 Subject: [PATCH 11/20] Remove obsolete allowlist entries --- stdlib/@tests/stubtest_allowlists/py315.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/stdlib/@tests/stubtest_allowlists/py315.txt b/stdlib/@tests/stubtest_allowlists/py315.txt index 68edc6e4f535..f684f7e9d2c6 100644 --- a/stdlib/@tests/stubtest_allowlists/py315.txt +++ b/stdlib/@tests/stubtest_allowlists/py315.txt @@ -4,7 +4,6 @@ dataclasses.MISSING dataclasses._MISSING_TYPE -dataclasses.field # ============================================================= # Allowlist entries that cannot or should not be fixed; >= 3.15 @@ -12,8 +11,6 @@ dataclasses.field # runtime default is a list object used as a sentinel base64.b64decode -urllib.parse.urlunparse -urllib.parse.urlunsplit # Internal implementation details of the sampling profiler. profiling.sampling.binary_collector From a9e0c18a1ee09e027506978e8a32aff2978ddf20 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 13:28:40 +0200 Subject: [PATCH 12/20] Add `FrameLocalsProxyType` dunder or methods --- stdlib/types.pyi | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/stdlib/types.pyi b/stdlib/types.pyi index 457cf609da8c..74b7df05e96d 100644 --- a/stdlib/types.pyi +++ b/stdlib/types.pyi @@ -18,7 +18,7 @@ from collections.abc import ( ) from importlib.machinery import ModuleSpec from typing import Any, ClassVar, Literal, ParamSpec, TypeVar, final, overload -from typing_extensions import Self, TypeAliasType, TypeVarTuple, deprecated, disjoint_base +from typing_extensions import Never, Self, TypeAliasType, TypeVarTuple, deprecated, disjoint_base if sys.version_info >= (3, 14): from _typeshed import AnnotateFunc @@ -603,6 +603,10 @@ if sys.version_info >= (3, 15): def __len__(self) -> int: ... def __contains__(self, key: object, /) -> bool: ... def __reversed__(self) -> Iterator[str]: ... + def __or__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... + # Will raise a NameError if invoked via |= + def __ior__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... + def __ror__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... def copy(self) -> dict[str, Any]: ... def pop(self, key: str, default: Any = ..., /) -> Any: ... def setdefault(self, key: str, default: Any = ..., /) -> Any: ... From df8d2a051f2472188211f5b7b007d4931f1a71ae Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 8 Oct 2026 11:30:47 +0000 Subject: [PATCH 13/20] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/types.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/types.pyi b/stdlib/types.pyi index 74b7df05e96d..4d1ddf7d7ea6 100644 --- a/stdlib/types.pyi +++ b/stdlib/types.pyi @@ -18,7 +18,7 @@ from collections.abc import ( ) from importlib.machinery import ModuleSpec from typing import Any, ClassVar, Literal, ParamSpec, TypeVar, final, overload -from typing_extensions import Never, Self, TypeAliasType, TypeVarTuple, deprecated, disjoint_base +from typing_extensions import Self, TypeAliasType, TypeVarTuple, deprecated, disjoint_base if sys.version_info >= (3, 14): from _typeshed import AnnotateFunc From 59932c4d8b7728817fed1c6c9af0448ac2f12bb8 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 13:36:40 +0200 Subject: [PATCH 14/20] bytes/bytearray.__mod__ also accepts tuples --- stdlib/builtins.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index d47052fcdf04..303be4e2e931 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -828,7 +828,7 @@ class bytes(Sequence[int]): def __add__(self, value: ReadableBuffer, /) -> bytes: ... def __mul__(self, value: SupportsIndex, /) -> bytes: ... def __rmul__(self, value: SupportsIndex, /) -> bytes: ... - def __mod__(self, value: Buffer | SupportsBytes, /) -> bytes: ... + def __mod__(self, value: Buffer | SupportsBytes | tuple[Buffer | SupportsBytes, ...], /) -> bytes: ... def __rmod__(self, value: bytes, /) -> bytes: ... # Incompatible with Sequence.__contains__ def __contains__(self, key: SupportsIndex | ReadableBuffer, /) -> bool: ... # type: ignore[override] @@ -960,7 +960,7 @@ class bytearray(MutableSequence[int]): def __mul__(self, value: SupportsIndex, /) -> bytearray: ... def __rmul__(self, value: SupportsIndex, /) -> bytearray: ... def __imul__(self, value: SupportsIndex, /) -> Self: ... - def __mod__(self, value: Buffer | SupportsBytes, /) -> bytearray: ... + def __mod__(self, value: Buffer | SupportsBytes | tuple[Buffer | SupportsBytes, ...], /) -> bytearray: ... def __rmod__(self, value: bytearray, /) -> bytearray: ... # Incompatible with Sequence.__contains__ def __contains__(self, key: SupportsIndex | ReadableBuffer, /) -> bool: ... # type: ignore[override] From 555433850955fd43461530d0257339d81fbc0faa Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 13:38:40 +0200 Subject: [PATCH 15/20] Move a type ignore --- stubs/tensorflow/tensorflow/io/__init__.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/tensorflow/tensorflow/io/__init__.pyi b/stubs/tensorflow/tensorflow/io/__init__.pyi index 593131b765b9..e0a7716a84dd 100644 --- a/stubs/tensorflow/tensorflow/io/__init__.pyi +++ b/stubs/tensorflow/tensorflow/io/__init__.pyi @@ -92,8 +92,8 @@ class RaggedFeature(NamedTuple): dtype: DTypeLike value_key: str | None = None - partitions: tuple[ # type: ignore[name-defined] - RowSplits | RowLengths | RowStarts | RowLimits | ValueRowIds | UniformRowLength, ... + partitions: tuple[ + RowSplits | RowLengths | RowStarts | RowLimits | ValueRowIds | UniformRowLength, ... # type: ignore[name-defined] ] = () row_splits_dtype: DTypeLike = ... validate: bool = False From 0cd86c01267119cd5ce4385946a3bd36847a91ee Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 13:45:17 +0200 Subject: [PATCH 16/20] noqa --- stdlib/types.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/types.pyi b/stdlib/types.pyi index 4d1ddf7d7ea6..39aaa7e9685f 100644 --- a/stdlib/types.pyi +++ b/stdlib/types.pyi @@ -605,7 +605,7 @@ if sys.version_info >= (3, 15): def __reversed__(self) -> Iterator[str]: ... def __or__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... # Will raise a NameError if invoked via |= - def __ior__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... + def __ior__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... # noqa: Y034 def __ror__(self, other: dict[str, Any] | FrameLocalsProxyType, /) -> dict[str, Any]: ... def copy(self) -> dict[str, Any]: ... def pop(self, key: str, default: Any = ..., /) -> Any: ... From 09f47fbcd827ae4bab6b7daaefb0a775ef2ac600 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 14:56:11 +0200 Subject: [PATCH 17/20] Fix accepted set dunder types --- stdlib/builtins.pyi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 303be4e2e931..ed999ed6fbdd 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1459,32 +1459,32 @@ class set(MutableSet[_T]): def __len__(self) -> int: ... def __contains__(self, o: object, /) -> bool: ... def __iter__(self) -> Iterator[_T]: ... - def __and__(self, value: AbstractSet[object], /) -> set[_T]: ... - def __iand__(self, value: AbstractSet[object], /) -> Self: ... + def __and__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... + def __iand__(self, value: set[object] | frozenset[object], /) -> Self: ... @overload def __rand__(self, value: set[_S], /) -> set[_S]: ... @overload def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... - def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] + def __or__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... + def __ior__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] @overload def __ror__(self, value: set[_S], /) -> set[_T | _S]: ... @overload def __ror__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... - def __sub__(self, value: AbstractSet[object], /) -> set[_T]: ... - def __isub__(self, value: AbstractSet[object], /) -> Self: ... + def __sub__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... + def __isub__(self, value: set[object] | frozenset[object], /) -> Self: ... @overload def __rsub__(self, value: set[_S], /) -> set[_S]: ... @overload def __rsub__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... - def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] + def __xor__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... + def __ixor__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] @overload def __rxor__(self, value: set[_S], /) -> set[_T | _S]: ... From 4546dadb35c3e446bc16335233097f7b13f5de76 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 15:00:28 +0200 Subject: [PATCH 18/20] Add type ignores --- stdlib/builtins.pyi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index ed999ed6fbdd..7196db448613 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1459,32 +1459,32 @@ class set(MutableSet[_T]): def __len__(self) -> int: ... def __contains__(self, o: object, /) -> bool: ... def __iter__(self) -> Iterator[_T]: ... - def __and__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... - def __iand__(self, value: set[object] | frozenset[object], /) -> Self: ... + def __and__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... # type: ignore[override] + def __iand__(self, value: set[object] | frozenset[object], /) -> Self: ... # type: ignore[override] @overload def __rand__(self, value: set[_S], /) -> set[_S]: ... @overload def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __or__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... - def __ior__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] + def __or__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... # type: ignore[override] + def __ior__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override,misc] @overload def __ror__(self, value: set[_S], /) -> set[_T | _S]: ... @overload def __ror__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... - def __sub__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... - def __isub__(self, value: set[object] | frozenset[object], /) -> Self: ... + def __sub__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... # type: ignore[override] + def __isub__(self, value: set[object] | frozenset[object], /) -> Self: ... # type: ignore[override] @overload def __rsub__(self, value: set[_S], /) -> set[_S]: ... @overload def __rsub__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __xor__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... - def __ixor__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] + def __xor__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... # type: ignore[override] + def __ixor__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override,misc] @overload def __rxor__(self, value: set[_S], /) -> set[_T | _S]: ... From 6602f46595ed6b7be3202638f2f97abe0f7daf1f Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 15:17:18 +0200 Subject: [PATCH 19/20] Revert "Add type ignores" This reverts commit 4546dadb35c3e446bc16335233097f7b13f5de76. --- stdlib/builtins.pyi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 7196db448613..ed999ed6fbdd 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1459,32 +1459,32 @@ class set(MutableSet[_T]): def __len__(self) -> int: ... def __contains__(self, o: object, /) -> bool: ... def __iter__(self) -> Iterator[_T]: ... - def __and__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... # type: ignore[override] - def __iand__(self, value: set[object] | frozenset[object], /) -> Self: ... # type: ignore[override] + def __and__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... + def __iand__(self, value: set[object] | frozenset[object], /) -> Self: ... @overload def __rand__(self, value: set[_S], /) -> set[_S]: ... @overload def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __or__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... # type: ignore[override] - def __ior__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override,misc] + def __or__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... + def __ior__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] @overload def __ror__(self, value: set[_S], /) -> set[_T | _S]: ... @overload def __ror__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... - def __sub__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... # type: ignore[override] - def __isub__(self, value: set[object] | frozenset[object], /) -> Self: ... # type: ignore[override] + def __sub__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... + def __isub__(self, value: set[object] | frozenset[object], /) -> Self: ... @overload def __rsub__(self, value: set[_S], /) -> set[_S]: ... @overload def __rsub__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __xor__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... # type: ignore[override] - def __ixor__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override,misc] + def __xor__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... + def __ixor__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] @overload def __rxor__(self, value: set[_S], /) -> set[_T | _S]: ... From 2967a576663c9aff14353510976160b9b92bf42c Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Thu, 8 Oct 2026 15:17:32 +0200 Subject: [PATCH 20/20] Revert "Fix accepted set dunder types" This reverts commit 09f47fbcd827ae4bab6b7daaefb0a775ef2ac600. --- stdlib/builtins.pyi | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index ed999ed6fbdd..303be4e2e931 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -1459,32 +1459,32 @@ class set(MutableSet[_T]): def __len__(self) -> int: ... def __contains__(self, o: object, /) -> bool: ... def __iter__(self) -> Iterator[_T]: ... - def __and__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... - def __iand__(self, value: set[object] | frozenset[object], /) -> Self: ... + def __and__(self, value: AbstractSet[object], /) -> set[_T]: ... + def __iand__(self, value: AbstractSet[object], /) -> Self: ... @overload def __rand__(self, value: set[_S], /) -> set[_S]: ... @overload def __rand__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __or__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... - def __ior__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] + def __or__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... + def __ior__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] @overload def __ror__(self, value: set[_S], /) -> set[_T | _S]: ... @overload def __ror__(self, value: frozenset[_S], /) -> frozenset[_T | _S]: ... - def __sub__(self, value: set[object] | frozenset[object], /) -> set[_T]: ... - def __isub__(self, value: set[object] | frozenset[object], /) -> Self: ... + def __sub__(self, value: AbstractSet[object], /) -> set[_T]: ... + def __isub__(self, value: AbstractSet[object], /) -> Self: ... @overload def __rsub__(self, value: set[_S], /) -> set[_S]: ... @overload def __rsub__(self, value: frozenset[_S], /) -> frozenset[_S]: ... - def __xor__(self, value: set[_S] | frozenset[_S], /) -> set[_T | _S]: ... - def __ixor__(self, value: set[_T] | frozenset[_T], /) -> Self: ... # type: ignore[override] + def __xor__(self, value: AbstractSet[_S], /) -> set[_T | _S]: ... + def __ixor__(self, value: AbstractSet[_T], /) -> Self: ... # type: ignore[override,misc] @overload def __rxor__(self, value: set[_S], /) -> set[_T | _S]: ...