How to Solve "TypeError: unsupported operand type(s)" with NoneType
in Python
In Python, the TypeError: unsupported operand type(s) for ...: 'NoneType' and ...
error (where ...
is an operator and another type) occurs when you try to perform an operation that involves None
where a different data type (like an integer, string, float, etc.) is expected.
This guide explains the common causes of this error and how to fix it, focusing on best practices for handling potentially None
values.
Understanding NoneType
and Operators
None
is a special value in Python representing the absence of a value. It's the sole value of the type NoneType
. Many operators and functions in Python expect specific data types as operands (e.g., +
expects numbers or strings, *
expects numbers, /
expects numbers). When you try to use None
with an operator that doesn't support it, you get a TypeError
.
Common Causes and Solutions
Functions Returning None
Implicitly
A very common cause is a function that doesn't explicitly return a value. In Python, a function that doesn't have a return
statement (or has a return
statement with no value) implicitly returns None
:
def do_math():
print(5 * 5) # Prints, but doesn't RETURN anything
result = do_math()
print(result) # Output: None
# print(result + 10) # ⛔️ TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Solution: Ensure your functions always return the expected value:
def do_math():
return 5 * 5
result = do_math()
print(result) # Output: 25
print(result + 10) # Output: 35
Functions with Conditional Returns
If a function has a return
statement inside an if
block (or other conditional), make sure all execution paths return a value of the expected type:
def get_number(x):
if x > 10:
return x
# Missing return here!
# else return 0
result = get_number(5) # result is None
print(result) # Output: None
# print(result + 5) # ⛔️ TypeError
Solution: Add an else
clause (or a return
after the if
block) to ensure a value of the correct type is always returned:
def get_number(x):
if x > 10:
return x
else:
return 0 # Return a default value (or raise an exception)
result = get_number(5)
print(result + 5) # Output: 5
Methods that Modify In-Place
Many built-in Python methods modify objects in-place and return None
. Common examples include list.sort()
, list.reverse()
, list.append()
, and dict.update()
. Do not assign the result of these methods back to a variable if you intend to use the modified object:
my_list = [3, 1, 4, 2]
# my_list = my_list.sort() # ⛔️ WRONG! my_list is now None
# print(my_list + [5]) # ⛔️ TypeError
my_list.sort() # Correct: modifies the list in place.
print(my_list) # Output: [1, 2, 3, 4]
# And then you can use the my_list variable again
print(my_list + [5]) #Output: [1, 2, 3, 4, 5]
Specific TypeError
Examples and Solutions
Let's look at the specific TypeError
messages you listed and provide direct solutions. The underlying cause is always the same: using None
with an operator that doesn't support it.
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
num_1 = None
num_2 = 15
# ⛔️ TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
# result = num_1 + num_2
if num_1 is not None:
result = num_1 + num_2
print(result)
else:
print('variable stores a None value') # Output: variable stores a None value
# Or, provide a default value:
num_1 = None
num_2 = 15
result = (num_1 or 0) + num_2 # Use 0 as the default if num_1 is None
print(result) # Output: 15
- Check for None or set a default value before using the
+
operator. - The
or
operator returns0
because an empty variable is falsy.
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
value_1 = None
value_2 = None
# ⛔️ TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
#result = value_1 * value_2
# Make sure both operands are not None. Use a default or check beforehand:
if value_1 is not None and value_2 is not None:
result = value_1 * value_2
# or
result = (value_1 or 1) * (value_2 or 1) # Use 1 as a default, it will result in the other number
TypeError: unsupported operand type(s) for /: 'NoneType' and 'float'
num_1 = None
num_2 = 2.0
# ⛔️ TypeError: unsupported operand type(s) for /: 'NoneType' and 'float'
#result = num_1 / num_2
# Check for None, and also check for division by zero!
if num_1 is not None and num_2 != 0:
result = num_1 / num_2
print(result)
# Or set a default:
result = (num_1 or 1) / num_2 if num_2 != 0 else 0 # Avoid ZeroDivisionError
- Check for None or set a default value before using the
/
operator. - Also, check for a possible
ZeroDivisionError
.
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
str_1 = None
str_2 = 'world'
# ⛔️ TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
# result = str_1 + str_2
# Check for None:
if str_1 is not None:
result = str_1 + str_2
else:
result = str_2 # Handle None case.
# Or, provide a default (empty string is often a good choice):
result = (str_1 or "") + str_2
- Check for None or set a default value before using the
+
operator.
Defensive Programming: Preventing NoneType
Errors
The best way to handle these errors is to prevent them:
- Checking for
None
: Useif my_variable is not None:
before accessing attributes or calling methods. - Using
dict.get()
with Defaults:my_dict.get('key', default_value)
preventsKeyError
and allows you to handle missing keys gracefully. - Always Return a Value: Ensure all code paths in your functions return a value of the expected type (or explicitly
return None
if that's the intended behavior). Use type hints to make your intentions clear. - Use Type Hints: Type hints (
def my_function(x: int) -> List[str]:
) combined with a type checker (like MyPy) can catch many of these errors before you even run your code.
Conclusion
The TypeError: unsupported operand type(s) for ...: 'NoneType' and ...
errors are common in Python, but easily fixed.
The root cause is always using None
where a different type (int, float, str, etc.) is expected.
By checking for None
values, providing default values, and ensuring your functions always return the expected type, you can write more robust and error-free Python code.
The most important technique is to check for None
before performing operations. Using type hints and a type checker like MyPy can help prevent these errors.