[Python-3000] Making more effective use of slice objects in Py3k (original) (raw)
Ron Adam rrr at ronadam.com
Tue Aug 29 13:42:16 CEST 2006
- Previous message: [Python-3000] Making more effective use of slice objects in Py3k
- Next message: [Python-3000] path in py3K Re: [Python-checkins] r51624 - in python/trunk/Lib: genericpath.py macpath.py ntpath.py os2emxpath.py posixpath.py test/test_genericpath.py
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Greg Ewing wrote:
Ron Adam wrote:
And in addition to that... 0 is not the beginning if the step is -1. Negative steps are downright confusing however you think about them. :-)
Yes, and it seems to me it could be easier. Of course that would mean changing something, and any solutions so far is in some way not perfect, depending on how you look at it.
In most cases I've seen only integers and None are ever used. Numeric uses various strange things as array indexes, such as Ellipsis and NewAxis. I don't think it uses them as parts of slices, but I wouldn't be surprised if they came up with some such usage one day.
>>> 'abc'[1.0] Traceback (most recent call last): File "", line 1, in ? TypeError: string indices must be integers
That is a string method that is generating the exception then and not the slice object? Yes, I expect so. From experimenting, it seems you can pass anything you want to slice():
Hmm..., after playing around with it, list and string methods probably call the slices indices() method from within getitem.
So it's the slices indices() method that is producing the exceptions in both cases. If other objects allow something besides strings then they are probably accessing the stop, start, and step indices directly and are not going though slice.indices() to get at them.
The way it seems to work is approximately ...
s[i:j:k] -> s.__getitem__(x = slice(i,j,k)) # via the SLICE byte code
i, j, k = x.indices(len(self)) # by s.__getitem__()The indices method does a type check and fixes the values depending on what length is.
But then what about the slice.indices() method? It does generate exceptions.
>>> slc = slice(1.0) >>> slc.indices(10) Traceback (most recent call last): File "", line 1, in ? TypeError: slice indices must be integers That particular method seems to require ints, yes. But a slice-using object can extract the start, stop and step and do whatever it wants with them.
If you could sub class slice, then it would be possible to replace the indices method and turn off the int check and/or put in your own value check. but you wouldn't be able to use the i:j:k syntax. (maybe a good thing)
sequence[myslice_object] # would work.You would still need to produce int like values if you use it with builtin types. But not with any of your own objects if you have supplied your own getitem method.
Cheers, Ron
- Previous message: [Python-3000] Making more effective use of slice objects in Py3k
- Next message: [Python-3000] path in py3K Re: [Python-checkins] r51624 - in python/trunk/Lib: genericpath.py macpath.py ntpath.py os2emxpath.py posixpath.py test/test_genericpath.py
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]