Skip to main content

How to Resolve Python "TypeError: object of type 'NoneType' has no len()"

The TypeError: object of type 'NoneType' has no len() is a common runtime error in Python. It occurs when you attempt to call the built-in len() function on a variable that holds the special value None. The len() function is designed to return the number of items in a container (like a list, tuple, string, dictionary, or set), but None, representing the absence of a value, has no length.

This guide explains the common reasons why a variable might hold None unexpectedly and provides standard solutions to prevent or handle this error.

Understanding the Error: len() Requires a Container​

The built-in len() function determines the "length" or number of items contained within an object. This only makes sense for objects that are collections or sequences, such as:

  • list: Number of elements.
  • tuple: Number of elements.
  • str: Number of characters.
  • dict: Number of key-value pairs.
  • set: Number of unique elements.

The special None object represents nothingness; it doesn't contain any items and therefore doesn't have a defined length. Trying to ask for the length of None results in the TypeError.

The Cause: Calling len() on None​

The error occurs simply because the variable passed as an argument to the len() function holds the value None at the time of the call.

my_variable = None
print(f"Variable type: {type(my_variable)}") # Output: <class 'NoneType'>

# Error Scenario
try:
# ⛔️ TypeError: object of type 'NoneType' has no len()
length = len(my_variable)
print(f"Length: {length}")
except TypeError as e:
print(e)

Common Sources of None Values​

You need to identify why the variable passed to len() is None when you expected it to be a list, string, dict, etc.

Explicit Assignment (my_variable = None)​

The variable was directly assigned None.

Function Returning None Implicitly (No return)​

A function without an explicit return statement implicitly returns None.

def get_data_list():
# Processes data but doesn't return it
processed_data = [1, 2, 3]
print("Processing done.")
# No return statement

result = get_data_list() # result is None
print(f"Function returned: {result}")

try:
print(f"Length: {len(result)}") # ⛔️ Error: len(None)
except TypeError as e:
print(f"Error: {e}")

Output:

ERROR!
Processing done.
Function returned: None
Error: object of type 'NoneType' has no len()

Assignment from Methods Returning None (e.g., list.sort())​

Methods modifying objects in-place (like list.sort(), list.reverse(), list.append()) often return None. Assigning this return value results in a None variable.

data_list = [5, 2, 8]
# Scenario: Assigning result of sort()
variable_after_sort = data_list.sort() # data_list is sorted, variable_after_sort is None

print(f"Variable after sort: {variable_after_sort}") # Output: None

try:
print(f"Length: {len(variable_after_sort)}") # ⛔️ Error: len(None)
except TypeError as e:
print(f"Error: {e}")

Output:

ERROR!
Variable after sort: None
Error: object of type 'NoneType' has no len()

Function Returning None Conditionally​

A function might return a list/string/etc. only under certain conditions, returning None otherwise.

def find_items(search_term, items):
matches = [item for item in items if search_term in item]
if matches: # If the matches list is not empty
return matches
# Implicitly returns None if 'matches' list is empty

available_items = ["apple", "banana"]
found = find_items("orange", available_items) # 'orange' not found, function returns None
print(f"Found items: {found}") # Output: None

try:
print(f"Number found: {len(found)}") # ⛔️ Error: len(None)
except TypeError as e:
print(f"Error: {e}")

Output:

ERROR!
Found items: None
Error: object of type 'NoneType' has no len()

Solution 1: Ensure Variable Holds a Sized Container (Fix the Source)​

The best fix is usually to correct the logic so the variable reliably holds an object that has a length (list, string, dict, etc.) when len() is called.

Correct Initialization​

Initialize variables expected to be containers with empty versions ([], {}, "") instead of None if they might be used with len() later.

Ensure Functions Return Sized Objects​

Modify functions to always return an object that len() can process, even if it's an empty one.

# ✅ Fixed function always returns a list
def find_items_safe(search_term, items):
matches = [item for item in items if search_term in item]
# Return the list of matches (which might be empty)
return matches # Returns [] if no matches found

available_items = ["apple", "banana"]
found_safe = find_items_safe("orange", available_items)
print(f"Found items (safe): {found_safe}") # Output: []

# ✅ len() now works correctly on the empty list
print(f"Number found (safe): {len(found_safe)}") # Output: 0

Output:

Found items (safe): []
Number found (safe): 0

Avoid Assigning Results of In-Place Methods​

Don't assign the None result of in-place methods like .sort() to a variable if you intend to get the length of the modified object later. Use the original variable name.

data_list = [5, 2, 8]
print(f"Original list: {data_list}")

# ✅ Call sort() in-place
data_list.sort()

# ✅ Use len() on the original (now sorted) list variable
print(f"Length after sort: {len(data_list)}")

Output:

Original list: [5, 2, 8]
Length after sort: 3

Solution 2: Check if Variable is None Before Calling len()​

If the variable might legitimately be None sometimes, check for this case explicitly before calling len().

def might_return_none():
import random
return ["data"] if random.choice([True, False]) else None

result_data = might_return_none()
print(f"Function result: {result_data}")

length = 0 # Default length if None

# ✅ Check for None before calling len()
if result_data is not None:
try:
length = len(result_data)
print("Variable is not None.")
except TypeError:
# Should not happen if 'is not None' check ensures it's list/str/etc.
print("Variable is not None but still not measurable?")
length = -1 # Indicate error maybe
else:
print("Variable is None, using default length.")

print(f"Calculated length: {length}")

Output:

Function result: ['data']
Variable is not None.
Calculated length: 1

This prevents the TypeError by avoiding len(None).

Solution 3: Provide a Default Value or Length if None​

A common pattern combines the check with providing a default.

def might_return_none():
import random
return ["data", "point"] if random.choice([True, False]) else None

result_data = might_return_none()
print(f"Function result: {result_data}")

# ✅ Get length, providing 0 as default if result_data is None
length = len(result_data) if result_data is not None else 0
# Or slightly shorter: length = len(result_data or [])
# (This uses the fact that 'None or []' evaluates to [])

print(f"Calculated length (with default): {length}")

Output:

Function result: ['data', 'point']
Calculated length (with default): 2

This uses a conditional expression to safely calculate the length or assign 0 if the variable is None. The result_data or [] trick is a concise alternative but relies on boolean short-circuiting.

How len() Works (__len__)​

The len() function works by calling the special __len__() method of the object passed to it. Objects like lists, strings, dicts, etc., implement __len__() to return their number of items. NoneType (the type of None) does not have a __len__() method, leading to the TypeError.

Conclusion​

The TypeError: object of type 'NoneType' has no len() occurs when you call len() on a variable holding the None value.

To resolve this:

  1. Identify the Source: Find out why the variable is None instead of the expected list, string, dict, etc.
  2. Fix the Source Logic: The best solution is usually to correct the code (initialize with []/{}, ensure functions return values, don't assign results of in-place methods) so the variable holds an appropriate container.
  3. Check Before Calling: If the variable might be None, use if variable is not None: before calling len().
  4. Use a Default: Employ conditional logic like length = len(variable) if variable is not None else 0 or length = len(variable or []) to provide a default length (often 0) when the variable is None.

Ensure that any object passed to len() is a valid container or sequence that has a defined length.