Skip to content

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

Fix the Python TypeError when trying to call a string like a function, with solutions for common causes like incorrect indexing, variable shadowing, and function name clashes.

The TypeError: 'str' object is not callable is a common error in Python that occurs when you attempt to use a string value as if it were a function, usually by adding parentheses () after it. Strings store textual data and are not executable functions or methods themselves.

This guide explains the typical scenarios that lead to this error and provides clear solutions for each.

Understanding the Error: Callable vs. Non-Callable Objects

In Python, parentheses () placed after an object signify a call operation, meaning you're trying to execute that object (like a function or method). Objects that can be executed this way are called "callables". Data types like strings (str), integers (int), lists (list), etc., are generally not callable; they hold data. Attempting to "call" a non-callable object, such as a string, results in a TypeError.

my_string = "hello"
print(type(my_string)) # Output: <class 'str'>

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

Cause 1: Using () Instead of [] for Indexing/Slicing (Most Common)

This is perhaps the most frequent reason for the error. When you want to access a character at a specific position (index) or extract a portion (slice) of a string, you must use square brackets [], not parentheses ().

my_text = "Python"

try:
    first_char = my_text(0)
    print(first_char)
except TypeError as e:
    print(f"Indexing Error: {e}")

first_char = my_text[0]
print(f"First char (index 0): '{first_char}'") # Output: 'P'
third_char = my_text[2]
print(f"Third char (index 2): '{third_char}'") # Output: 't'

try:
    substring = my_text(1, 4) # Trying to slice from index 1 up to 4
    print(substring)
except TypeError as e:
    print(f"\nSlicing Error: {e}")

substring = my_text[1:4]                            # Slice from index 1 up to (not including) 4
print(f"\nSubstring (slice 1:4): '{substring}'")    # Output: 'yth'

first_three = my_text[:3]                           # Slice from beginning up to index 3
print(f"Substring (slice :3): '{first_three}'")     # Output: 'Pyt'

Remember: [] for access/slicing, () for calling functions/methods.

Cause 2: Accidentally Calling a String Variable

You might have a variable holding a string and unintentionally add parentheses later, perhaps when intending to print or pass it.

filename = "report.txt"

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

print(filename) # Output: report.txt

Cause 3: Variable Name Clashing with Function Name

If a variable holding a string has the same name as a function defined earlier, the variable assignment hides the function. Trying to call the function name later will actually attempt to call the string variable.

def get_user_greeting():
  """Returns a greeting string."""
  return "Hello there!"

print(get_user_greeting()) # Output: Hello there!

get_user_greeting = "Welcome!" # Now name refers to this string

try:
    greeting = get_user_greeting()
    print(greeting)
except TypeError as e:
    print(f"\nError: {e}")

def get_user_greeting_func(): # Renamed function
    return "Hello there (fixed)!"

greeting_message = "Welcome!" # Use a different variable name

print(f"\nFixed call: {get_user_greeting_func()}") # Output: Hello there (fixed)!

Maintain unique names for variables and functions.

Cause 4: Shadowing the Built-in str Type

Assigning a string value to a variable named exactly str overrides Python's built-in str() type constructor. If you then try to use str() (e.g., for type conversion), you'll be calling your string variable instead.

str = "This is not the str function"
print(f"The variable 'str' now holds: '{str}'")

try:
    number_as_string = str(123)
    print(number_as_string)
except TypeError as e:
    print(e)

my_custom_string = "This is my string"

number_as_string_fixed = str(123) # Correctly converts 123 to string "123"
print(f"\nUsing built-in str(): '{number_as_string_fixed}' (type: {type(number_as_string_fixed)})")

Cause 5: Class Attribute Name Clashing with Method Name

In a class, if an instance attribute (often set in __init__) shares the same name as a method, accessing the name on an instance usually retrieves the attribute, hiding the method. If the attribute holds a string, calling the method name results in the TypeError.

class Report:
    def __init__(self, title_string):
        self.title = title_string # Holds a string

    def title(self):
        print("Method 'title' called!") # Hard to reach
        return f"Report Title Method: {self.title.upper()}"

report_instance = Report("Monthly Sales")
print(f"Attribute value: {report_instance.title}") # Accesses the string attribute

try:
    method_result = report_instance.title()
    print(method_result)
except TypeError as e:
    print(f"Error: {e}")

class ReportFixed:
    def __init__(self, title_text):
        self.title_text = title_text

    def get_title_info(self):
        print("Method 'get_title_info' called!")
        return self.title_text

report_fixed = ReportFixed("Annual Review")

result_fixed = report_fixed.get_title_info()
print(f"\nFixed call result: {result_fixed}") # Output: Annual Review

Use distinct names for class attributes and methods.

Cause 6: Calling a Function That Returns a String Twice

If a function returns a string, calling it once gives you the string value. Adding a second set of parentheses attempts to call the returned string.

def get_file_extension():
  print("Getting extension...")
  return ".txt" # Returns a string

try:
    ext = get_file_extension()()
    print(ext)
except TypeError as e:
    print(f"Error: {e}")

ext = get_file_extension()
print(f"Extension: {ext}") # Output: .txt

Remove the extra call parentheses.

Debugging Tip: Check Variable Types

When encountering this error, quickly verify the type of the object you're trying to call:

variable_causing_error = ... # The name involved

print(f"Type just before call: {type(variable_causing_error)}")
try:
    variable_causing_error()
except TypeError as e:
    print(f"Error confirms type issue: {e}")

Seeing <class 'str'> in the output confirms the object is a string, pointing you to one of the causes discussed above.

Conclusion

The TypeError: 'str' object is not callable arises from attempting to execute a string using call parentheses (). The most common fixes involve:

  1. Using square brackets [] for string indexing and slicing instead of parentheses ().
  2. Removing accidental call parentheses from string variables.
  3. Using distinct names for variables and functions/methods/types to avoid shadowing.
  4. Calling functions that return strings only once.

By understanding that strings are data containers, not executable functions, and by ensuring correct syntax and naming conventions, you can effectively prevent and resolve this common Python error.

Navigation