How to Check if a String is Empty or None in Python

Introduction

In Python, it's often important to check whether a string is empty or None before performing operations on it. This can prevent unexpected errors and make your code more robust. But what is the most efficient and Pythonic way to do this? And what potential pitfalls should you watch out for?

In this article, we'll explore these questions, demonstrating how to correctly check if a string is empty or None in Python, as well as discussing some best practices to make your code more reliable and maintainable.

Boolean Evaluation in Python

In Python, values are considered "truthy" or "falsy" based on whether they evaluate to True or False in a boolean context. This concept plays a crucial role when checking conditions in code.

For strings, an empty string ("") is considered "falsy" — it evaluates to False in a boolean context. On the other hand, a non-empty string is "truthy" — it evaluates to True. The special value None is also considered "falsy", as shown in the following code snippet:

s1 = ""
s2 = "Hello"
s3 = None

print(bool(s1))  # False
print(bool(s2))  # True
print(bool(s3))  # False

This property of strings and None is extremely useful when you want to check if a string is empty or None. As we'll see in the next sections, you can use simple if statements to make these checks, leveraging the "falsiness" of an empty string and None.

Checking if a String is Empty

When checking if a string is empty in Python, we can take advantage of the fact that an empty string is "falsy". You can use either the == operator or the not operator to perform this check.

Method 1: Using the == Operator

s = ""
if s == "":
    print("String is empty")
else:
    print("String is not empty")

Method 2: Using the not Operator

s = ""
if not s:
    print("String is empty")
else:
    print("String is not empty")

In both of these methods, the if statement will print "String is empty" if the string s is empty. The not operator in the second example negates the "truthiness" or "falsiness" of the string, making the code slightly more concise. This is a common Pythonic way to check for empty strings.

Checking if a String is None

In Python, to check if a string is None, it's best practice to use the is operator rather than the == operator. This is because is checks if both operands are the same object, not just equivalent.

Advice: Read more about the differences between the is and the == operators in our article "'is' vs '==' in Python - Object Comparison".

Let's take a look at the practical use-case of the is operator for checking if a string is None":

s = None

if s is None:
    print("String is None")
else:
    print("String is not None")

As expected, the if statement will print "String is None" if the variable s is None.

Remember, None is a singleton in Python, which means there is only ever one instance of None. Thus, using is is more appropriate and can be more efficient when checking for None.

Checking if a String is Empty or None

To check if a string is either empty or None in Python, we'll combine the techniques we discussed in the previous sections. We'll use an or operator to check both conditions at once:

s = ""  # Try also with s = None

if s is None or s == "":
    print("String is empty or None")
else:
    print("String is not empty and not None")

Advice: Find out more about the or operator in Python by reading our "Guide to the Python or Operator".

In this example, the if statement checks two conditions: if s is None and if s is an empty string. If either condition is true, it will print "String is empty or None". If both conditions are false (meaning the string is not None and it's not empty), it will print "String is not empty and not None".

Tips and Advice

Don't use == Instead of is to Check for None

Python has two equality operators, == and is. While they sometimes work the same, they are not identical. The == operator checks for value equality, while is checks for identity, meaning that it checks whether the operands are the same object.

None is a singleton in Python - there's only one instance of None. Therefore, it's more appropriate and slightly more efficient to use is when checking for None.

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

s = None

# Recommended
if s is None:
    print("s is None")

# Not recommended
if s == None:
    print("s is None")

Take Advantage of Python's "Truthiness"

Python's treatment of different values as "truthy" or "falsy" in boolean contexts can simplify your code. Rather than explicitly comparing a string to an empty string (""), you can use the not keyword to check if a string is empty:

s = ""

# Recommended
if not s:
    print("String is empty")

# Not recommended
if s == "":
    print("String is empty")

Handle None When Performing Operations on Strings

If there's any chance a string could be None, always check before performing operations on it. Neglecting to do so can result in a TypeError:

s = None

# Results in TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
print(s + " more text")

To prevent such errors, you can check if the string is None before performing the operation:

if s is not None:
    print(s + " more text")
else:
    print("String is None, cannot perform operation")

Conclusion

We've seen that Python provides straightforward and efficient ways to perform these checks, leveraging the "truthiness" and "falsiness" of different values in boolean contexts. We've also discussed some potential pitfalls to avoid and best practices to follow when performing these checks, such as using the is operator to check for None and the not operator to check for an empty string.

Last Updated: June 5th, 2023
Was this article helpful?

Improve your dev skills!

Get tutorials, guides, and dev jobs in your inbox.

No spam ever. Unsubscribe at any time. Read our Privacy Policy.

© 2013-2024 Stack Abuse. All rights reserved.

AboutDisclosurePrivacyTerms