typeshed
typeshed copied to clipboard
`builtins.slice` should be generic
This is a port of https://github.com/python/typing/issues/159, which was closed as being out of scope, with https://github.com/srittau suggesting it maybe be more suitable for typeshed instead.
It would be useful to have slice
being generic and allowing type hints a la
-
slice[start_type, stop_type, step_type]
-
slice[S, T]
as shorthand forslice[S, S, T]
orslice[S, T, Any]
-
slice[T]
as shorthand forslice[T, T, T]
orslice[T, T, Any]
orslice[Any, T, Any]
-
slice
as shorthand forslice[Any, Any, Any]
Syntax wise, I would advocate for the latter options slice[S, T]=slice[S, T, Any]
, slice[T]=slice[Any, T, Any]
for the following reasons:
- It resembles the regular usage of
slice
:-
slice(x) = slice(None, x, None)
, -
slice(a, b) = slice(a, b, None)
-
- It has better compatible with
datetime
/timedelta
variables, which might be a common use-case.-
slice[datetime]=slice[datetime, datetime, datetime]
would be an error, because `datetimes cannot be added, only timedeltas can be added to datetimes.
-
Real-world examples
- Datetime based slicing: Here,
start
andstop
aredatetime
-like andstep
istimedelta
-like (e.g.datetime.datetime
/datetime.timedelta
,numpy.datetime64
/numpy.timedelta64
orpandas.Timestamp
/pandas.Timedelta
) - Label based slicing via strings, for example,
pandas
allows something likeframe.loc["2017-07-01":"2017-10-31"]
for aDataFrame
that is indexed by aDatetimeIndex
, this will first convert the strings todatetime
objects and then select all rows of the table that lie between the given dates. - Similarly, one might want to select all rows of a table that lie between two float values.
An example of heterogeneous types (although a little cute) is to do obj["keyword": value]
, effectively producing keyword arguments.
Related https://peps.python.org/pep-0696/#using-another-typevarlike-as-the-default which were my thoughts on the matter
Marking as deferred until and unless PEP-696 is accepted by the Steering Council and implemented by all major type checkers
Little status update:
- The Python typing council has recommended accepting PEP 696 last week, so the steering council will likely also accept it for upcoming Python 3.13
- Pyright has already implemented PEP 696 for use with
typing_extensions
- Mypy is apparently still working on its support
Cf. #11422 for the feature tracker.