diff --git a/stdlib/@tests/test_cases/builtins/check_reversed.py b/stdlib/@tests/test_cases/builtins/check_reversed.py index 2a43a57deb4e..d89ebf3a0ca7 100644 --- a/stdlib/@tests/test_cases/builtins/check_reversed.py +++ b/stdlib/@tests/test_cases/builtins/check_reversed.py @@ -31,4 +31,18 @@ def __getitem__(self, item: int) -> _T: len_and_get_item: MyLenAndGetItem[int] = MyLenAndGetItem() -assert_type(list(reversed(len_and_get_item)), "list[int]") +assert_type(reversed(len_and_get_item), "reversed[int]") + + +class UnTrue: + def __reversed__(self) -> UnFalse: + return UnFalse() + + +class UnFalse: + def __reversed__(self) -> UnTrue: + return UnTrue() + + +assert_type(reversed(UnTrue()), "UnFalse") +assert_type(reversed(reversed(UnTrue())), "UnTrue") diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 0a6dc57b05b8..36ed451e6173 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -32,7 +32,7 @@ from _typeshed import ( SupportsRichComparisonT, SupportsWrite, ) -from collections.abc import Awaitable, Callable, Iterable, Iterator, MutableSet, Reversible, Set as AbstractSet, Sized +from collections.abc import Awaitable, Callable, Iterable, Iterator, MutableSet, Set as AbstractSet, Sized from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper from types import CellType, CodeType, TracebackType @@ -1730,13 +1730,16 @@ def pow(base: _SupportsSomeKindOfPow, exp: complex, mod: None = None) -> complex quit: _sitebuiltins.Quitter -class reversed(Generic[_T]): +class _SupportsReversed(Protocol[_T_co]): + def __reversed__(self) -> _T_co: ... + +class reversed(Generic[_T_co]): @overload - def __new__(cls, sequence: Reversible[_T], /) -> Iterator[_T]: ... # type: ignore[misc] + def __new__(cls, sequence: _SupportsReversed[_T], /) -> _T: ... # type: ignore[misc] @overload - def __new__(cls, sequence: SupportsLenAndGetItem[_T], /) -> Iterator[_T]: ... # type: ignore[misc] + def __new__(cls, sequence: SupportsLenAndGetItem[_T_co], /) -> Self: ... def __iter__(self) -> Self: ... - def __next__(self) -> _T: ... + def __next__(self) -> _T_co: ... def __length_hint__(self) -> int: ... def repr(obj: object, /) -> str: ...