Skip to content

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

Fix the 'TypeError: '<' not supported between instances of 'NoneType' and int/float' by checking for None values or assigning default numeric values before comparisons.

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.

int_1 = None
int_2 = 10
try:
    if int_1 < int_2:
        print('success')
except TypeError as e:
    print(e)

float_1 = None
float_2 = 3.14
try:
    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():
    result = 20

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

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
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

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

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

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.
Navigation