Method(s) called by square brackets, slice objects

Ethan Furman ethan at stoneleaf.us
Wed Apr 9 16:34:06 EDT 2014


On 04/09/2014 01:24 PM, John Ladasky wrote:
>
> I would like to build a multi-dimensional array that allows numpy-style
>  indexing and, ideally, uses Python's familiar square-bracket and slice
>  notations.
>
> For example, if I declare a two-dimensional array object, x, then x[4,7]
>  retrieves the element located at the 4th row and the 7th column.  If I
>  ask for x[3:6,1:3], I get a 3 x 2 array object consisting of the inter-
>section of the 3rd-5th rows, and the 1st-2nd columns, of x.
>
> In this case I'm not allowed to use numpy, I have to restrict myself to
>  the standard library.  I thought that I might achieve the desired behavior
>  by defining an object with specific __getitem__ and/or __getslice__ methods.
> However, the documentation of these methods that I am reading suggests that
>  the arguments are pre-parsed into certain formats which may not allow me to
>  do things numpy's way.  Is this true?

Nope.  Whatever you put between the square brackets is what gets passed into __getitem__; the only caveat is that 
anything with : will be turned into a slice:

Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
--> class GetIndex(object):
...   def __getitem__(self, thing):
...     print thing
...     return None
...
--> test = GetIndex()

--> test[1]
1

--> test [1,2]
(1, 2)

--> test[1:3, 4:5]
(slice(1, 3, None), slice(4, 5, None))

--> test[range(3)]
[0, 1, 2]

--
~Ethan~



More information about the Python-list mailing list