Bug in slice type

Steven Bethard steven.bethard at gmail.com
Thu Aug 11 15:35:34 EDT 2005


Bryan Olson wrote:
> 
>     class BuggerAll:
> 
>         def __init__(self, somelist):
>             self.sequence = somelist[:]
> 
>         def __getitem__(self, key):
>             if isinstance(key, slice):
>                 start, stop, step = key.indices(len(self.sequence))
>                 # print 'Slice says start, stop, step are:', start, 
> stop, step
>                 return self.sequence[start : stop : step]
> 
> 
>     print           range(10) [None : None : -2]
>     print BuggerAll(range(10))[None : None : -2]
> 
> The above prints:
> 
>     [9, 7, 5, 3, 1]
>     []
> 
> Un-commenting the print statement in __getitem__ shows:
> 
>     Slice says start, stop, step are: 9 -1 -2
> 
> The slice object seems to think that -1 is a valid exclusive
> bound, but when using it to actually slice, Python interprets
> negative numbers as an offset from the high end of the sequence.
> 
> Good start-stop-step values are (9, None, -2), or (9, -11, -2),
> or (-1, -11, -2). The later two have the advantage of being
> consistend with the documented behavior of returning three
> integers.

I suspect there's a reason that it's done this way, but I agree with you 
that this seems strange.  Have you filed a bug report on Sourceforge?

BTW, a simpler example of the same phenomenon is:

py> range(10)[slice(None, None, -2)]
[9, 7, 5, 3, 1]
py> slice(None, None, -2).indices(10)
(9, -1, -2)
py> range(10)[9:-1:-2]
[]

STeVe



More information about the Python-list mailing list