Is it possible to merge xrange and slice?
Steven D'Aprano
steve at REMOVEME.cybersource.com.au
Mon Apr 30 23:43:08 EDT 2007
On Mon, 30 Apr 2007 21:00:15 +0000, BJörn Lindqvist wrote:
> On 30 Apr 2007 11:02:19 -0700, Bas <wegwerp at gmail.com> wrote:
>> stupid question, but would it be possible to somehow merge xrange
>> (which is supposed to replace range in py3k) and slice? Both have very
>> similar start, stop and step arguments and both are lightweight
>> objects to indicate a range. But you can't do a[xrange(10,20)] and
>> 'for i in slice(10,20)'. The only difference is see is some behavior
>> with infinities (e.g. object[3:] gives a slice(3,maxint) inside
>> _getitem_ , but I think this should not be a large problem
>> (xrange(0,infinity) could just yield a generator that never stops).
>>
>> Which problems am I overlooking that prevent this?
>
> Novel idea but how would slice(3,-1) work?
Since the semantics of slice and xrange are different, you get very
different results:
>>> slice(3, -1)
slice(3, -1, None)
>>> range(10)[3:-1]
[3, 4, 5, 6, 7, 8]
>>> xrange(3, -1)
xrange(0)
I don't see why you would want to mix'n'match slice objects and xrange
objects like Bas wants. I *think* what he's imagining is that if you say
something like:
alist[5:10] # a slice from a list
it should be the same as
alist[xrange(5, 10)]
That would, I think, only make sense if Python lists allowed sequence
arguments for slicing, as well as ranges:
alist[5] # gives the fifth element
alist[5:11] # gives the fifth through tenth elements
alist[5,7,10] # gives the 5th, 7th and 10th elements
Then alist[xrange(5, 10)] would be the same as alist[5, 6, 7, 8, 9].
I can see that could be useful, especially if (like slicing) it was
tolerant of errors. We could imagine list's __*slice__ methods accepting
either a single integer index, a slice object, or a tuple object.
The actual mechanics of what something like this would mean:
del alist[2, 4, 7, 1, 1]
I leave open.
While this could be interesting, I'm not sure that it belongs in slicing.
Although if not, that would mean growing three methods, a getter, a
setter and a deleter. Hmmm. Maybe slicing should be extended to accept
a sequence of indices...
... enough dreaming... even if list slicing accepted a sequence argument,
passing an xrange object would not be the way to do it. That would be like
replacing:
result = alist[5:10]
with:
result = []
for i in (5, 6, 7, 8, 9):
result.append(alist[i])
--
Steven D'Aprano
More information about the Python-list
mailing list