[Python-3000] Making more effective use of slice objects in Py3k
Nick Coghlan
ncoghlan at iinet.net.au
Sun Aug 27 16:59:24 CEST 2006
Jim Jewett wrote:
> On 8/26/06, Guido van Rossum <guido at python.org> wrote:
>> On 8/26/06, Jim Jewett <jimjjewett at gmail.com> wrote:
>> > As I understand it, Nick is suggesting that slice
>> > objects be used as a sequence (not just string)
>> > view.
>
>> I have a hard time parsing this sentence. A slice is
>> an object with three immutable attributes -- start,
>> stop, step. How does this double as a string view?
>
> Poor wording on my part; it is (the application of a slice to a
> specific sequence) that could act as copyless view.
>
> For example, you wanted to keep the rarely used optional arguments to
> find because of efficiency.
>
> s.find(prefix, start, stop)
>
> does not copy. If slices were less eager at copying, this could be
> rewritten as
>
> view=slice(start, stop, 1)
> view(s).find(prefix)
>
> or perhaps even as
>
> s[start:stop].find(prefix)
>
> I'm not sure these look better, but they are less surprising, because
> they don't depend on optional arguments that most people have
> forgotten about.
Actually, string views have nothing to do with what I'm suggesting (although
my comments about them in the find/rfind thread were one of the things that
fed into this message). I'm actually proposing an *alternative* to string
views, because they have a nasty problem with non-local effects. It is easy to
pass or return a string view instead of an actual string, and you get
something that runs with subtly different semantics from what you expect, but
that isn't likely to trigger an obvious error. It also breaks the persistent
idiom that "seq[:]" makes a copy (which is true throughout the standard
library, even if it isn't true for external number-crunching libraries like
NumPy).
You also potentially end up with *every* sequence type ending up with a
"x-view" counterpart, which is horrible. OTOH, if we make the standard library
more consistent in always using a slice or range object anytime it wants to
pass or return (start, stop, step) information, it provides a foundation for
someone to do their own non-copying versions.
So with my musings, the non-copying index operation in a subsection would
still use an optional second argument:
s.find(prefix, slice(start, stop))
Now, the ultimate extension of this idea would be to permit slice literals in
places other than sequence indexing (similar to how Py3k is likely to permit
Ellipsis literals outside of subscript expressions). Naturally, parentheses
may be needed in order to disambiguate colons:
s.find(prefix, (start:stop))
Contrast this with the copying version:
s[start:stop].find(prefix)
If (start:stop:step) is equivalent to slice(start, stop, step), then slice
notation can be used to create ranges: range(start:stop:step)
The idea of making slice objects callable, with the result being a view of the
original sequence is Jim's, not mine, and I'm not that keen on it (my
reservations about string views apply to the more general idea of sequence
views, too).
Cheers,
Nick.
P.S. I *will* be doing a PEP to bring this discussion together, but be warned
that it may be a week or two before I get to it.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://www.boredomandlaziness.org
More information about the Python-3000
mailing list