Skip to main content

How to Handle Python TypeError: Comparison Not Supported Between 'NoneType' and Numbers

The Python TypeError: '<' not supported between instances of 'NoneType' and 'int' (or float) is a common error that occurs when you attempt to use comparison operators (like <, >, <=, >=) between a None value and a numeric type (integer or float). Python doesn't define a standard way to compare None with numbers, leading to this exception.

This guide explains the cause and provides effective solutions.

Understanding the Error

This TypeError arises because Python's comparison operators (<, >, <=, >=) are not defined for operands of type NoneType and numeric types (int, float). There's no inherent order between None and numbers.

# Error Example with int
int_1 = None
int_2 = 10
try:
# ⛔️ TypeError: '<' not supported between instances of 'NoneType' and 'int'
if int_1 < int_2:
print('success')
except TypeError as e:
print(e)

# Error Example with float
float_1 = None
float_2 = 3.14
try:
# ⛔️ TypeError: '>' not supported between instances of 'NoneType' and 'float'
if float_1 > float_2:
print('success')
except TypeError as e:
print(e)

Solutions

To resolve this error, you need to ensure you are not attempting to compare None directly with a number.

Checking for None Before Comparison

The safest approach is to check if the variable is None before performing the comparison:

int_1 = None
int_2 = 10

if int_1 is not None:
print(int_1 < int_2) # This comparison won't execute
else:
print('Variable int_1 stores a None value') # Output: Variable int_1 stores a None value

float_1 = None
float_2 = 3.14

if float_1 is not None:
print(float_1 > float_2) # This comparison won't execute
else:
print('Variable float_1 stores a None value') # Output: Variable float_1 stores a None value
  • The is not None check prevents the problematic comparison when the variable holds None.

Assigning a Default Value

If it makes sense in your logic, you can assign a default numeric value (like 0 or 0.0) to the variable if it's None before the comparison:

int_1 = None
int_2 = 10
if int_1 is None:
int_1 = 0 # Assign default value
print(int_1 < int_2) # Output: True (0 < 10)

float_1 = None
float_2 = 3.14
if float_1 is None:
float_1 = 0.0 # Assign default value
print(float_1 > float_2) # Output: False (0.0 > 3.14)
  • This allows the comparison to proceed with a valid number. Choose a default value that is appropriate for your specific situation.

Common Sources of None Values

Understanding where None values might originate helps prevent the error:

Functions Implicitly Returning None

Functions that don't have an explicit return statement (or just have return without a value) implicitly return None.

def get_number():
# No explicit return statement
result = 20
# Returns None implicitly

num = get_number()
print(num) # Output: None
try:
if num > 10: # Raises TypeError
pass
except TypeError as e:
print(e)

# Fix: Add an explicit return
def get_number_fixed():
result = 20
return result

num_fixed = get_number_fixed()
if num_fixed > 10: # Works correctly
print("Fixed function comparison successful")

Explicit Assignment to None

Sometimes variables are intentionally or unintentionally assigned the value None.

my_num = 50
# ... some code ...
my_num = None # Reassigned to None

try:
print(my_num > 25) # Raises TypeError
except TypeError as e:
print(e)
  • Track your variable assignments carefully.

Assignment from Methods Returning None

Many built-in methods that modify objects in-place (e.g., list.sort(), list.append()) return None. Assigning their result to a variable leads to None. The print() function also returns None.

result = print(5 + 5)   # print() returns None
print(result) # Output: None

try:
if result < 10: # Raises TypeError
pass
except TypeError as e:
print(e)
  • Don't assign the result of in-place methods or print() if you expect the modified object or the printed value.

Functions Conditionally Returning None

If a function only returns a value under certain conditions, it might return None otherwise.

def get_value(a):
if a > 5:
return a * 10
# Implicitly returns None if a <= 5

val = get_value(4)
print(val) # Output: None

try:
print(val > 10) # Raises TypeError
except TypeError as e:
print(e)

# Fix: Ensure all code paths return a value (or handle None)
def get_value_fixed(a):
if a > 5:
return a * 10
else:
return 0 # Or another appropriate default

val_fixed = get_value_fixed(4)
print(val_fixed > 10) # Output: False
  • Make sure your functions have clear return values for all possible execution paths, or handle potential None return values in the calling code.

Conclusion

The TypeError: '<' not supported between instances of 'NoneType' and 'int'/'float' clearly indicates an attempt to compare None with a number.

  • By understanding the cause and implementing checks (is not None) or providing default values, you can prevent this error and write more robust Python code.
  • Always be mindful of where None values might appear in your program, especially from function return values.