Skip to content

builtins.slice should be generic #8647

@randolf-scholz

Description

@randolf-scholz

This is a port of python/typing#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 for slice[S, S, T] or slice[S, T, Any]
  • slice[T] as shorthand for slice[T, T, T] or slice[T, T, Any] or slice[Any, T, Any]
  • slice as shorthand for slice[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:

  1. It resembles the regular usage of slice:
    • slice(x) = slice(None, x, None),
    • slice(a, b) = slice(a, b, None)
  2. 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 and stop are datetime-like and step is timedelta-like (e.g. datetime.datetime / datetime.timedelta, numpy.datetime64/numpy.timedelta64 or pandas.Timestamp/pandas.Timedelta)
  • Label based slicing via strings, for example, pandas allows something like frame.loc["2017-07-01":"2017-10-31"] for a DataFrame that is indexed by a DatetimeIndex, this will first convert the strings to datetime 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: deferredIssue or PR deferred until some precondition is fixed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions