In Python3, converting slice to range
If you want to override []
operator in Python, you may need to handle slice
as well. For example in the following __getindex__
method which implements []
, argument key
could be a single int
, for example, a[1]
or a[-3]
; or it could be a slice
e.g., a[1:4]
is a slice.
def __getitem__(self, key):
x = [1,2,3,4,5,6] # fixed data
if isinstance(key, slice):
return [x[i] for i in slice2range(slice, len(x)]
return x[key]
Ideally, I\’d have loved if range(key)
would automatically turn/cast a slice
to the equivalent range
. See this question on SO.
The simplest solution, IMO, is the following.
def slice2range(slice, N):
return range(slice.start or 0, slice.stop or N, slice.step or 1)
You can use it inline.
def __getitem__(self, key)
x = [1,2,3,4,5,6]
if isinstance(key, slice):
# return a list of values.
return [x[i] for i in range(key.start or 0, key.stop or len(x), key.step or 1)]
return x[key] # return a value