'tuple' not callable error

python, tuples, typeerror

Solution

In this line, you say that you're going to use the name `move` to refer to elements of `m[2]`:

for move in m[2]:

But then later, you try to call a function that you've called `move`:

move(b, selectedMove, -1)

Once you've seen this, the error message makes complete sense:

TypeError: 'tuple' object is not callable

because the name `move` doesn't refer to the function any more, but to the last tuple it was bound to in the loop.

More important than fixing this particular error (don't use `move` for a variable name if you also want to use it to refer to a function) is recognizing how the interpreter told you exactly what the problem was.

It said that a tuple wasn't callable; in the line of code it complained about, you were calling `move`; thus `move` was a tuple, and your next step should've been adding `print(move)` (or `print(type(move), repr(move))` if you want to be fancy) to see what tuple it actually was.

Problem

I now that this question has been asked several times. However, the answers do not seem to resolve my problem. I get a type error, 'tuple' object is not callable. I get this even though the tuple inside the list is separated by commas in the correct way: ``` def aiMove(b): movesList = moves(b, -1) heuristic = [] if movesList: for m in movesList: bt = copy.deepcopy(b) print("bt: ", bt) bt[m[0]][m[1]] = -1 h = heat[m[0]][m[1]] for move in m[2]: i=1; try: while (-1* bt[m[0] + i*move[0]][m[1] + i*move[1]] < 0): bt[m[0] + i*move[0]][m[1] + i*move[1]] *= -1 bt[m[0] + i*move[0]][m[1] + i*move[1]] += -1 i += 1; except IndexError: continue alpha = max(float('-inf'), alphabeta(bt, depth-1, h, float('-inf'), float('inf'), 1)) heuristic.append(alpha) if (float('inf') <= alpha): break selectedMove = movesList[int(heuristic.index(max(heuristic)))] move(b, selectedMove, -1) else: print ("The AI can't move!") return [] ``` selectedMove is (3, 2, [(0 , 1)]) for example. The moves() function returns a list of moves like the final value for selectedMove. It is an alpha beta pruning implementation for game tree search. The move() function actually moves the piece to that position and updates the board to finish the computers' turn. the variable b represents values on the current game board Every conversion I try (i.e. force selectedMove to be a list in itself, etc..) will give the same error in the line "move(b, selectedMove, -1)" Does somebody see what may be wrong? ``` Microsoft Windows [Version 6.1.7600] Copyright (c) 2009 Microsoft Corporation. All rights reserved. Exception in Tkinter callback Traceback (most recent call last): File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__ return self.func(*args) File "C:\Users\Loek Janssen\Documents\GitHub\CITS1401-Project\DrawBoard.py", line 131, in eventfun placePiece(x, y, b, n) File "C:\Users\Loek Janssen\Documents\GitHub\CITS1401-Project\DrawBoard.py", line 119, in placePiece project2.aiMove(b) File "C:\Users\Loek Janssen\Documents\GitHub\CITS1401-Project\project2.py", line 225, in aiMove move(b, selectedMove, -1) TypeError: 'tuple' object is not callable ```

Original source