TypeError: 'tuple' object is not callable (tested fix)

TypeError: 'tuple' object is not callable means Python saw a tuple followed by (...). That is usually a missing comma in a list of tuples. We reproduced each cause in Python 3.13 and tested the fixes.

1. A missing comma between tuples

The most common cause. Two tuple literals on consecutive lines with no comma between them parse as a call: (1, 2)(3, 4).

points = [
    (1, 2)
    (3, 4),
]

Output:

b1.py:2: SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma?
  (1, 2)
Traceback (most recent call last):
  File "b1.py", line 2, in <module>
    (1, 2)
    ~~~~~~
    (3, 4),
    ^^^^^^
TypeError: 'tuple' object is not callable

Python 3.8 and later also print a SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma? (we saw it on 3.8, 3.11 and 3.13). The fix is to add the comma after (1, 2).

2. Why you may not see the comma hint

The warning comes from the compiler, so it only appears when the file is compiled. Put the list above in pts.py and import it twice:

import subprocess, sys
for run in (1, 2):
    r = subprocess.run([sys.executable, "-c", "import pts"], capture_output=True, text=True)
    warned = "SyntaxWarning" in r.stderr
    print(f"run {run}: SyntaxWarning shown = {warned}; last line = {r.stderr.strip().splitlines()[-1]}")

Output:

run 1: SyntaxWarning shown = True; last line = TypeError: 'tuple' object is not callable
run 2: SyntaxWarning shown = False; last line = TypeError: 'tuple' object is not callable

The second run loads the cached .pyc, so the warning is gone and only the TypeError is left. The hint also only fires for literal tuples. With a variable, as in the next section, there is no warning at all.

3. Parentheses instead of square brackets

point = (3, 4)
try:
    print(point(0))
except TypeError as e:
    print(type(e).__name__ + ":", e)
print(point[0])

Output:

TypeError: 'tuple' object is not callable
3

Tuples are indexed with []. point(0) tries to call the tuple.

4. A variable named tuple

tuple = (1, 2, 3)          # shadows the builtin
try:
    print(tuple([4, 5]))
except TypeError as e:
    print(type(e).__name__ + ":", e)
del tuple                  # removes the shadow, builtin is back
print(tuple([4, 5]))

Output:

TypeError: 'tuple' object is not callable
(4, 5)

Assigning to tuple hides the builtin for the rest of the module. Rename the variable; in a REPL or notebook, del tuple brings the builtin back.

5. An attribute that is a tuple, called like a method

class Box:
    def __init__(self):
        self.size = (2, 3)
b = Box()
try:
    print(b.size())
except TypeError as e:
    print(type(e).__name__ + ":", e)
print(b.size)

Output:

TypeError: 'tuple' object is not callable
(2, 3)

Typical with .size or .shape-style attributes that hold tuples. Drop the ().

6. Commas make tuples, not parentheses

import sys
print(sys.version.split()[0])
x = 1, 2
print(type(x).__name__, x)
y = (1)
print(type(y).__name__, y)

Output:

3.13.5
tuple (1, 2)
int 1

A stray trailing comma can turn a value into a tuple, and parentheses alone don't make one. Related: object is not callable (other types) and 'tuple' object does not support item assignment.

Frequently asked questions

How do I fix 'tuple' object is not callable in a list of tuples?

Add the missing comma between the tuples. (1, 2) (3, 4) on two lines is parsed as calling (1, 2).

Why don't I see the 'perhaps you missed a comma' warning?

It's a compile-time SyntaxWarning. If the module is loaded from a cached .pyc it isn't printed, and it never appears when the tuple is in a variable.

How do I get an item from a tuple?

Use square brackets: t[0], not t(0).

Written with AI assistance. Measured on 2026-10-22 on Debian with Python 3.13.5; the missing-comma SyntaxWarning was also checked in the official python:3.8-alpine and python:3.11-alpine Docker images. Every block was run verbatim and its output pasted unedited. PlainHeaders is our extension; Python is free.