diff --git a/stdlib/builtins.pyi b/stdlib/builtins.pyi index 1e0ed7336cfb..81475d7e5302 100644 --- a/stdlib/builtins.pyi +++ b/stdlib/builtins.pyi @@ -9,7 +9,6 @@ from _typeshed import ( ConvertibleToFloat, ConvertibleToInt, FileDescriptorOrPath, - MaybeNone, OpenBinaryMode, OpenBinaryModeReading, OpenBinaryModeUpdating, @@ -95,9 +94,9 @@ _SupportsAnextT = TypeVar("_SupportsAnextT", bound=SupportsAnext[Any], covariant _AwaitableT = TypeVar("_AwaitableT", bound=Awaitable[Any]) _AwaitableT_co = TypeVar("_AwaitableT_co", bound=Awaitable[Any], covariant=True) _P = ParamSpec("_P") -_StartT = TypeVar("_StartT", covariant=True, default=Any) -_StopT = TypeVar("_StopT", covariant=True, default=Any) -_StepT = TypeVar("_StepT", covariant=True, default=Any) +_StartT_co = TypeVar("_StartT_co", covariant=True, default=Any) +_StopT_co = TypeVar("_StopT_co", covariant=True, default=_StartT_co) # slice[A] -> slice[A, A, Any] +_StepT_co = TypeVar("_StepT_co", covariant=True, default=Any) # slice[A,B] -> slice[A, B, Any] class object: __doc__: str | None @@ -940,24 +939,34 @@ class bool(int): def __invert__(self) -> int: ... @final -class slice(Generic[_StartT, _StopT, _StepT]): +class slice(Generic[_StartT_co, _StopT_co, _StepT_co]): @property - def start(self) -> _StartT: ... + def start(self) -> _StartT_co: ... @property - def step(self) -> _StepT: ... + def step(self) -> _StepT_co: ... @property - def stop(self) -> _StopT: ... - @overload - def __new__(cls, stop: int | None, /) -> slice[int | MaybeNone, int | MaybeNone, int | MaybeNone]: ... - @overload - def __new__( - cls, start: int | None, stop: int | None, step: int | None = None, / - ) -> slice[int | MaybeNone, int | MaybeNone, int | MaybeNone]: ... - @overload - def __new__(cls, stop: _T2, /) -> slice[Any, _T2, Any]: ... - @overload - def __new__(cls, start: _T1, stop: _T2, /) -> slice[_T1, _T2, Any]: ... - @overload + def stop(self) -> _StopT_co: ... + # generic slice -------------------------------------------------------------------- + @overload # 2x None + def __new__(cls, start: None, stop: None = None, step: None = None, /) -> slice[Any, Any, Any]: ... + # unary overloads ------------------------------------------------------------------ + @overload # 0x None + def __new__(cls, stop: _T2, /) -> slice[_T2 | None, _T2 | None, Any]: ... + # binary overloads ----------------------------------------------------------------- + @overload # 1x None + def __new__(cls, start: _T1, stop: None, step: None = None, /) -> slice[_T1 | None, _T1 | None, Any]: ... + @overload # 1x None + def __new__(cls, start: None, stop: _T2, step: None = None, /) -> slice[_T2 | None, _T2 | None, Any]: ... + @overload # 0x None + def __new__(cls, start: _T1, stop: _T2, step: None = None, /) -> slice[_T1, _T2, Any]: ... + # ternary overloads ---------------------------------------------------------------- + @overload # 2x None + def __new__(cls, start: None, stop: None, step: _T3, /) -> slice[Any, Any, _T3]: ... + @overload # 1x None + def __new__(cls, start: _T1, stop: None, step: _T3, /) -> slice[_T1 | None, _T1 | None, _T3]: ... + @overload # 1x None + def __new__(cls, start: None, stop: _T2, step: _T3, /) -> slice[_T2 | None, _T2 | None, _T3]: ... + @overload # 0x None def __new__(cls, start: _T1, stop: _T2, step: _T3, /) -> slice[_T1, _T2, _T3]: ... def __eq__(self, value: object, /) -> bool: ... if sys.version_info >= (3, 12):