
IF there is a __getslice__ method: IF the slice step is None: call __getslice__(lo, hi) ELSE: # the slice step is not None call __getslice__(lo, hi, step)
What's wrong with that?
Well, what happens if __getslice__ and __getitem__ both exist, and __getitem__ is used to handle extended slices, but __getslice__ isn't (yet)? Currently, if it's a single item, __getitem__ is called. If it's a basic slice, __getslice__ is called. If it's an extended slice, __getitem__ is called.
In the above picture, __getslice__ would be called instead, with the 'wrong' number of arguments, and the use of extended slices would break.
Good point. Sigh. I suppose we could inspect the __getslice__ method's argument count (it *is* available somewher) but that seems a hack (and could still break if default arguments were used for something else). Another solution: require a class variable to indicate the class's awareness: e.g. you must define __getslice_takes_three_args__ when __getslice__(lo, hi, step) is supported, otherwise the call goes to __getitem__(slice(lo, hi, step)). This is a bit like the feature flag bits in the type struct. --Guido van Rossum (home page: http://www.pythonlabs.com/~guido/)