Skip to content

How to Resolve Python "TypeError: 'dict' object is not callable"

Fix the 'TypeError: dict object is not callable' error in Python by understanding why dictionaries can't be called like functions and learning the 6 most common causes, from incorrect key access to variable name conflicts.

The TypeError: 'dict' object is not callable is a frequent error in Python that occurs when you mistakenly try to use a dictionary object as if it were a function, typically by appending parentheses () to it. Dictionaries are data structures for key-value storage, not executable code blocks.

This guide explains the common scenarios leading to this error and provides clear solutions to fix it.

Understanding the Error: Callable vs. Non-Callable Objects

In Python, objects that can be "called" using parentheses () are typically functions, methods, or class constructors. This act of calling executes some code. Data structures like dictionaries (dict), lists (list), strings (str), integers (int), etc., are not callable by default; they store data but aren't executable functions themselves. Attempting to call a non-callable object like a dictionary results in a TypeError.

Cause 1: Using () Instead of [] for Key Access (Most Common)

This is the most frequent accidental cause. When trying to retrieve a value associated with a key from a dictionary, you must use square brackets [], not parentheses ().

my_info = {'city': 'London', 'country': 'UK'}

try:
    city = my_info('city')
    print(city)
except TypeError as e:
    print(e)

city = my_info['city']
country = my_info['country']

print(f"City: {city}")          # Output: City: London
print(f"Country: {country}")    # Output: Country: UK

Remember: my_dict['key'] accesses the value, my_dict('key') tries to call the dictionary.

Cause 2: Accidentally Calling a Dictionary Variable

Sometimes, you might simply have a variable holding a dictionary and mistakenly add parentheses to it later, perhaps intending to print it or pass it somewhere.

user_data = {'id': 101, 'status': 'active'}

try:
    user_data()
except TypeError as e:
    print(e)

print(user_data) # Output: {'id': 101, 'status': 'active'}

Cause 3: Variable Name Clashing with Function Name

If you define a function and later assign a dictionary to a variable with the exact same name, the variable assignment hides the function. Trying to call the original function name will now attempt to call the dictionary stored in the variable.

def get_config():
  """Returns configuration settings."""
  print("Original get_config function running...")
  return {'theme': 'dark', 'font_size': 12}

config = get_config()
print(f"Initial config: {config}")

get_config = {'theme': 'light', 'font_size': 10} # Now name refers to this dict

try:
    new_config = get_config()
    print(new_config)
except TypeError as e:
    print(f"Error: {e}")

def get_config_func(): # Renamed function
  print("Original get_config_func running...")
  return {'theme': 'dark', 'font_size': 2}

current_config = {'theme': 'light', 'font_size': 10} # Use a different variable name

new_config_fixed = get_config_func()
print(f"Fixed call result: {new_config_fixed}")

Cause 4: Shadowing the Built-in dict Type

Assigning a dictionary to a variable named exactly dict overrides Python's built-in dict() type constructor. Subsequent attempts to use the dict() constructor will erroneously try to call your dictionary variable.

dict = {'a': 1, 'b': 2}
print(f"The variable 'dict' now holds: {dict}")

try:
    new_dictionary = dict(c=3, d=4)
    print(new_dictionary)
except TypeError as e:
    print(e)

my_own_dictionary = {'a': 1, 'b': 2}

new_dictionary_fixed = dict(c=3, d=4) # Creates a new dictionary {'c': 3, 'd': 4}
print(f"Using built-in dict(): {new_dictionary_fixed}")

Cause 5: Class Attribute Name Clashing with Method Name

In a class definition, if an instance attribute and a method share the same name, accessing that name on an instance usually retrieves the attribute, shadowing the method. If that attribute holds a dictionary, trying to call the method name results in this TypeError.

class ConfigManager:
    def __init__(self, settings_dict):
        self.settings = settings_dict # Holds a dictionary

    def settings(self):
        print("Method 'settings' called!") # This is hard to reach
        return "Settings Method Result"

manager = ConfigManager({'user': 'guest', 'level': 1})
print(f"Attribute value: {manager.settings}") # Accesses the dict attribute

try:
    result = manager.settings()
    print(result)
except TypeError as e:
    print(f"Error: {e}")

class ConfigManagerFixed:
    def __init__(self, settings_data):
        self.settings_data = settings_data

    def get_settings_info(self):
        print("Method 'get_settings_info' called!")
        return self.settings_data

manager_fixed = ConfigManagerFixed({'user': 'admin', 'level': 5})

result_fixed = manager_fixed.get_settings_info()
print(f"Fixed call result: {result_fixed}")

Maintain distinct names for attributes and methods within classes.

Cause 6: Calling a Function That Returns a Dictionary Twice

If a function returns a dictionary, calling it once yields the dictionary object. Adding a second set of parentheses attempts to call that returned dictionary.

def load_user_data():
  print("Loading user data...")
  return {'id': 'xyz', 'prefs': {'theme': 'dark'}}

try:
    data = load_user_data()()
    print(data)
except TypeError as e:
    print(f"Error: {e}")

data = load_user_data()
print(f"Data loaded: {data}") # Output: {'id': 'xyz', 'prefs': {'theme': 'dark'}}

Remove the extraneous parentheses.

Debugging Tip: Check Variable Types

When faced with this error, immediately check the type of the variable you're trying to call just before the error line:

variable_causing_error = ... # Whatever holds the dict

print(f"Type just before call: {type(variable_causing_error)}")
try:
    variable_causing_error()
except TypeError as e:
    print(f"Error confirms it's not callable: {e}")

Seeing <class 'dict'> confirms the variable holds a dictionary, prompting you to investigate why you're trying to call it.

Conclusion

The TypeError: 'dict' object is not callable error arises from treating a Python dictionary like a function by using call parentheses (). Key solutions include:

  1. Using square brackets [] for dictionary key access (e.g., my_dict['key']).
  2. Removing accidental call parentheses () from dictionary variables.
  3. Using distinct names for variables and functions/methods/types to avoid shadowing.
  4. Calling functions that return dictionaries only once.

By identifying which of these common mistakes occurred, you can effectively resolve this TypeError.

Navigation