
This TypeError method not subscriptable is very similar to the AttributeError we saw with APIs.
It means: “You are trying to slice [] a function itself, instead of slicing the result of the function.”
⚡ Quick Fix: TypeError: ‘builtin_function_or_method’ object is not subscriptable – Python Missing Parentheses Before Index Access Fix
You indexed directly into a method reference instead of its return value — add () to call the method first, then apply [] to the result.
my_string = "Hello World" my_list = [1, 2, 3] # Fix 1 — Call the method first, then index the result first_letter = my_string.upper()[0] # Output: H # Fix 2 — sorted() returns a new list you can index directly last_item = sorted(my_list)[-1] # Output: 3 # Fix 3 — Chain any method: call () before [] second_word = "hello world".split()[1] # Output: world
This tells you exactly where your boundary is — now read through the root causes below to find which one broke your code and fix it permanently.
The Cause
You forgot the parentheses () when calling a method.
Problem Code (Strings):
my_string = "Hello World" # You want the first letter of the UPPERCASE version # But you forgot () after .upper first_letter = my_string.upper[0] # CRASH! TypeError: 'builtin_function_or_method' object is not subscriptable
Python thinks you are trying to get index 0 of the function code named upper, which isn’t allowed.
Problem Code (Lists):
my_list = [1, 2, 3] # You want the last item of the reversed list # You forgot () after .reverse last_item = my_list.reverse[-1] # CRASH!
The Fix: Call the Function First
Add () to run the function, then use [] on the result.
Correct Code:
my_string = "Hello World" # 1. Call the function -> returns "HELLO WORLD" # 2. Get index [0] -> returns "H" first_letter = my_string.upper()[0] print(first_letter) # Output: H
What This Error Exposes About Python’s Method Reference vs Method Call
TypeError: 'builtin_function_or_method' object is not subscriptable is Python’s __getitem__ protocol hitting a function object instead of a sequence. Writing my_string.upper without parentheses does not call the method — it returns a reference to the method object itself. That object is callable via __call__, but it implements no __getitem__, so the [0] access finds nothing to route through and raises the error immediately.
The distinction between a method reference and a method call is one of Python’s most powerful features and one of its most common beginner traps. Functions are first-class objects in Python — you can store them in variables, pass them as arguments, and return them from other functions without ever invoking them. my_string.upper is a valid expression that produces a bound method object. my_string.upper() is the invocation that runs the method and produces a string. The [] operator needs the string, not the method object.
The my_list.reverse[-1] variant is particularly deceptive because list.reverse() mutates the list in place and returns None — even with the parentheses added correctly, my_list.reverse()[-1] still crashes with TypeError: 'NoneType' object is not subscriptable. The correct pattern for indexing a reversed list is sorted(my_list, reverse=True)[0] or my_list[::-1][0], both of which produce a new sequence you can index safely. Any time you need to index the result of a list method, check the return value first — in-place methods like .reverse(), .sort(), and .append() all return None by design, and chaining [] onto None produces a second crash on top of the first.





