8000 More precise type hints for `slice` constructor by randolf-scholz · Pull Request #12899 · python/typeshed · GitHub
[go: up one dir, main page]

Skip to content

More precise type hints for slice constructor #12899

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Prev Previous commit
Next Next commit
explicit overloads
  • Loading branch information
randolf-scholz committed Oct 24, 2024
commit b4bcf86f901d007a959c8eef95f0e2024b9b4cdb
23 changes: 23 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -724,3 +724,26 @@ message when closing the PR. Example message:
<fails some tests OR has unresolved review feedback OR has a merge conflict>
after three months of inactivity. If you are still interested, please feel free to open
a new PR (or ping us to reopen this one).


- Type hint `slice` should be compatible with the **"all-slices"**:
- `slice(None)`, `slice(None, None)` and `slice(None, None, None)`.
- Type hint `slice[X]` should be compatible with:
- `slice(None)`, `slice(None, None)` and `slice(None, None, None)`
- `slice(x)`, `slice(None, x)` and `slice(None, x, None)`.
- `slice(x, None)` and `slice(x, None, None)`.
- `slice(x, x)` and `slice(x, x, None)`.
- Type hint `slice[X, Y]` should be compatible with:
- `slice(None)`, `slice(None, None)` and `slice(None, None, None)`
- `slice(y)`, `slice(None, y)` and `slice(None, y, None)`.
- `slice(x, None)` and `slice(x, None, None)`
- `slice(x, y)` and `slice(x, y, None)`.
- Type hint `slice[X, Y, Z]` should be compatible with:
- `slice(None)`, `slice(None, None)` and `slice(None, None, None)`.
- `slice(y)`, `slice(None, y)` and `slice(None, y, None)`.
- `slice(x, None)` and `slice(x, None, None)`
- `slice(x, y)` and `slice(x, y, None)`.
- `slice(None, None, z)`
- `slice(None, y, z)`
- `slice(x, None, z)`
- `slice(x, y, z)`
49 changes: 32 additions & 17 deletions stdlib/builtins.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -941,26 +941,41 @@ class bool(int):
@final
class slice(Generic[_StartT_co, _StopT_co, _StepT_co]):
@property
def start(self) -> _StartT_co | None: ...
def start(self) -> _StartT_co: ...
@property
def step(self) -> _StepT_co | None: ...
def step(self) -> _StepT_co: ...
@property
def stop(self) -> _StopT_co | None: ...
@overload
def __new__(cls, stop: None, /) -> slice[Any, Any, Any]: ...
@overload
def __new__(cls, stop: _T2, /) -> slice[_T2]: ...
@overload
def __new__(cls, start: None, stop: _T2, /) -> slice[_T2]: ...
@overload
def __new__(cls, start: _T1, stop: None, /) -> slice[_T1]: ...
@overload
def stop(self) -> _StopT_co: ...
# unary overloads ------------------------------------------------------------------
@overload # 1x None
def __new__(cls, stop: None, /) -> slice: ...
@overload # 0x None
def __new__(cls, stop: _T2, /) -> slice[_T2 | None]: ...
# binary overloads -----------------------------------------------------------------
@overload # 2x None
def __new__(cls, start: None, stop: None, /) -> slice: ...
@overload # 1x None
def __new__(cls, start: _T1, stop: None, /) -> slice[_T1 | None]: ...
@overload # 1x None
def __new__(cls, start: None, stop: _T2, /) -> slice[_T2 | None]: ...
@overload # 0x None
def __new__(cls, start: _T1, stop: _T2, /) -> slice[_T1, _T2]: ...
@overload
def __new__(cls, start: None, stop: _T2, step: _T3, /) -> slice[_T2, _T2, _T3]: ...
@overload
def __new__(cls, start: _T1, stop: None, step: _T3, /) -> slice[_T1, _T1, _T3]: ...
@overload
# tenary overloads -----------------------------------------------------------------
@overload # 3x None
def __new__(cls, start: None, stop: None, step: None, /) -> slice: ...
@overload # 2x None
def __new__(cls, start: None, stop: None, step: _T3, /) -> slice[Any, Any, _T3]: ...
@overload # 2x None
def __new__(cls, start: _T1, stop: None, step: None, /) -> slice[_T1 | None, _T1 | None]: ...
@overload # 2x None
def __new__(cls, start: None, stop: _T2, step: None, /) -> slice[_T2 | None, _T2 | None]: ...
@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 # 1x None
def __new__(cls, start: _T1, stop: _T2, step: None, /) -> slice[_T1, _T2]: ...
@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):
Expand Down
0