One annoyance when implementing __getitem__() is debugging the slice syntax interactively .. Below you can see an example.
First you create a dummy class with simple method that print its arguments.
Then you can experiment.
class Blah: def __getitem__(self,*args): print(args) return args b = Blah() b[1] b[2:5] b[::2,2:11:2] s = b[::3] print() #filling the indices ind = s[0].indices(12) print(f'indices: {s[0]} => {ind}') #make it a range rng = range(*s[0].indices(12)) print(f'range: {rng}') for i in rng: print(i)
(1,) (slice(2, 5, None),) ((slice(None, None, 2), slice(2, 11, 2)),) (slice(None, None, 3),) indecies: slice(None, None, 3) => (0, 12, 3) range: range(0, 12, 3) 0 3 6 9
In addition inside your method you can convert a slice to a range by using the .indices() method … and then use them to do processing in a loop.