Python etc / __index__ (PEP-357)

Published: 19 November 2020, 18:00

In Python 2.5, PEP-357 allowed any object to be passed as index or slice into __getitem__:

class L:
  def __getitem__(self, value):
    return value

class C:

# <class __main__.C ...>

Also, it introduced a magic method __index__. it was passed instead of the object in slices and used in list and tuple to convert the given object to int:

class C:
 def __index__(self):
   return 1

# Python 2 and 3
# <__main__.C ...>

# Python 2:
# slice(1, 9223372036854775807, None)
# Python 3:
# slice(<__main__.C object ...>, None, None)

# python 2 and 3
# 2

The main motivation to add __index__ was to support slices in numpy with custom number types:

two = numpy.int64(2)

# numpy.int64

# int

Now it is mostly useless. However, it is a good example of language changes to meet the needs of a particular third-party library.