TypeError: 'function' object has no attribute '__getitem__'

66,872

Solution 1

It appears you have forgotten a pair of parentheses:

a = makeGrid(dim)

What you have now:

a = makeGrid

just aliases the makeGrid function instead of calling it. Then, when you try to index into a, like so:

a[i]

it's trying to index into a function, which does not have the __getitem__ magic method needed for indexing with bracket notation.

Solution 2

As others have said, you need to call makeGrid properly.... just as an fyi, this is a fairly common error to see in Python, and it generally means that your variable is not the type that you thought it was (in this case, you were expecting a matrix, but got a function)

TypeError: 'function' object has no attribute '__getitem__'

Solution 3

You're not calling makeGrid(), you're assigning the function object itself to a:

    a = makeGrid(dim) 
Share:
66,872
user1887919
Author by

user1887919

Updated on July 13, 2022

Comments

  • user1887919
    user1887919 almost 2 years

    Writing some code in python to evaluate a basic function. I've got a 2d array with some values and I want to apply the function to each of those values and get a new 2-d array:

    import numpy as N
    def makeGrid(dim):
        ''' Function to return a grid of distances from the centre of an array.
        This version uses loops to fill the array and is thus slow.'''
        tabx = N.arange(dim) - float(dim/2.0) + 0.5
        taby = N.arange(dim) - float(dim/2.0) + 0.5
        grid = N.zeros((dim,dim), dtype='float')
        for y in range(dim):
            for x in range(dim):
                grid[y,x] = N.sqrt(tabx[x]**2 + taby[y]**2)
        return grid
    
    import math
    
    def BigGrid(dim):
        l= float(raw_input('Enter a value for lambda: '))
        p= float(raw_input('Enter a value for phi: '))
        a = makeGrid 
        b= N.zeros ((10,10),dtype=float) #Create an array to take the returned values
        for i in range(10):
            for j in range (10):
                b[i][j] = a[i][j]*l*p
        return b
    
    
    if __name__ == "__main__":
        ''' Module test code '''
        size = 10 #Dimension of the array
        newGrid = BigGrid(size)
        newGrid = N.round(newGrid, decimals=2)
        print newGrid
    

    But all i get is the error message

    Traceback (most recent call last):
      File "sim.py", line 31, in <module>
        newGrid = BigGrid(size)
      File "sim.py", line 24, in BigGrid
        b[i][j] = a[i][j]*l*p
    TypeError: 'function' object has no attribute '__getitem__'
    

    Please help.