tags:

views:

122

answers:

3

I am trying to use

__getitem__(self, x, y):

on my Matrix class, but it seems to me it doesn't work (I still don't know very well to use python). I'm calling it like this:

print matrix[0,0]

Is it possible at all to use more than one argument? Thanks. Maybe I can use only one argument but pass it as a tuple?

+3  A: 

No, __getitem__ just takes one argument (in addition to self). In the case of matrix[0, 0], the argument is the tuple (0, 0).

Mike Graham
+8  A: 

__getitem__ only accepts one argument (other than self), so you get passed a tuple.

You can do this:

class matrix:
    def __getitem__(self, pos):
        x,y = pos
        return "fetching %s, %s" % (x, y)

m = matrix()
print m[1,2]

outputs

fetching 1, 2

See http://docs.python.org/reference/datamodel.html#object.getitem for more information

Chris AtLee
+9  A: 

Indeed, when you execute bla[x,y], you're calling type(bla).__getitem__(bla, (x, y)) -- Python automatically forms the tuple for you and passes it on to __getitem__ as the second argument (the first one being its self). There's no good way ((1)) to express that __getitem__ wants more arguments, but also no need to.

((1)): in Python 2.* you can actually give __getitem__ an auto-unpacking signature...:

>>> class X(object):
...   def __getitem__(self, (x, y)): return x, y
... 
>>> x = X()
>>> x[23, 45]
(23, 45)

which will raise ValueError or TypeError when you're indexing with too many or too few indices. Whether that's "a good way" is moot... it's been deprecated in Python 3 so you can infer that Guido didn't consider it good upon long reflection;-). Doing your own unpacking (of a single argument in the signature) is no big deal and lets you provide clearer errors (and uniform ones, rather than ones of different types for the very similar error of indexing such an instance with 1 vs, say, 3 indices;-).

Alex Martelli
My understanding about the deprecation of argument unpacking in 3.x was not so much that "Guido didn't consider it good", but more that hardly anyone knew the feature even existed in the language, and it significantly complicated the compiler.
Laurence Gonsalves
@Laurence, yep -- complicated and very rarely used -> not good!-)
Alex Martelli
I regularly used it and it was quite nice, but the issue was that it complicated reflection. I'll mainly miss it for its use in lambda functions
Casebash