Writing a Custom Matrix Class in Python, __setitem__ issues

python, python-3.x

Solution

The error message says it all:

TypeError: __setitem__() takes exactly 4 arguments (3 given)

Your `__setitem__` takes 4 (self being passed automatically, like always):

def __setitem__(self, rowIndex, colIndex, newVal):

but this line:

M[0, 0] = 5.0

doesn't pass 0, 0, and 5.0 to `__setitem__`; it passes the 2-tuple `(0, 0)` and the float `5.0` to `__setitem__`. This is discussed in this section of the Python documentation, where the call pattern is `object.__setitem__(self, key, value)`.

You need something more like

def __setitem__(self, index, value):
    self.values[index[0]][index[1]] = value

Problem

I'm working on a custom class to handle matrices using Python. I'm running into a problem where my test program is, apparently, not passing enough arguments to my `__setitem__` method. Here's the code: ``` def __setitem__(self, rowIndex, colIndex, newVal): self.values[rowIndex][colIndex] = newVal ``` and the test code that's throwing the error: ``` M[0, 0] = 5.0; M[0, 1] = 7.0; M[0, 2] = -2.0; M[1, 0] = 3.0; M[1, 1] = 6.0; M[1, 2] = 1.0; ``` `M` calls the Matrix's `__init__` before attempting to set an item. And I'm getting this error: ``` TypeError: __setitem__() takes exactly 4 arguments (3 given) ```

Original source