[Python-3000] Making more effective use of slice objects in Py3k

Nick Coghlan ncoghlan at gmail.com
Sun Aug 27 17:28:14 CEST 2006


Guido van Rossum wrote:
> Can you explain in a sentence or two how these changes would be
> *used*? Your code examples don't speak for themselves (maybe because
> It's Saturday morning :-). Short examples of something clumsy and/or
> slow that we'd have to write today compared to something fast and
> elegant that we could write after the change woulde be quite helpful.
> The exact inheritance relationship between slice and [x]range seems a
> fairly uninteresting details in comparison.

A more unified model for representing sequence slices makes it practical to 
offer a non-copying string partitioning method like the version of 
partition_indices() in my initial message. With the current mixed model 
(sometimes using xrange(), sometimes using slice(), sometimes using a 3-tuple, 
sometimes using separate start & stop values), there is no point in offering 
such a method, as it would be terribly inconvenient to work with regardless of 
what kind of objects it returned to indicate the 3 portions of the original 
string:

  - 3-tuples and xrange() objects can't be used to slice a sequence
  - 3-tuples and slice() objects can't be usefully tested for truth
  - none of them can be passed as optional string method arguments

I believe the current mixed model is actually an artifact of the transition 
from simple slicing to extended slicing, albeit one that is significantly less 
obvious than the deprecated __*slice__ family of special methods. Old style 
slicing and string methods use separate start and stop values. Extended 
slicing uses slice objects with start,stop,step attributes (which can be 
anything, including None). The indices() method of slice objects uses a 
start,stop,step 3-tuple. Iteration uses either a list of indices (from 
range()) or xrange objects with start,stop,step attributes (which must be 
integers).

The basic proposal I am making is to reduce this to exactly two concepts:
   - slice objects, which have arbitrary start, stop, step attributes
   - range objects, which have indices as start, stop, step attributes, behave 
like an immutable sequence, and are a subclass of slice

All other instances in the core and standard library which use a different 
representation of a sequence slice (like the optional arguments to string 
methods, or the result of the indices() method) would change to use one of 
those two types. The methods of the types would be driven by the needs of the 
standard library.

In addition to reuding the number of concepts to be dealt with from 4 to 2, I 
believe this would make it much easier to write memory efficient code without 
having to duplicate entire objects with non-copying versions.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org


More information about the Python-3000 mailing list