Let's talk about unnecessary else statements in Python.
if and else returnThis earliest_date function uses the python-dateutil third-party library to parse two strings as dates:
from dateutil.parser import parse
def earliest_date(date1, date2):
"""Return the string representing the earliest date."""
if parse(date1, fuzzy=True) < parse(date2, fuzzy=True):
return date1
else:
return date2
This function returns the string which represents the earliest given date:
>>> earliest_date("May 3 2024", "June 5 2025")
'May 3 2024'
>>> earliest_date("Feb 3 2026", "June 5 2025")
'June 5 2025'
Note that this function uses an if statement that returns, and an else that also returns.
else statement unnecessary?We don't necessarily need that else!
We could delete it and simply return from our function:
from dateutil.parser import parse
def earliest_date(date1, date2):
"""Return the string representing the earliest date."""
if parse(date1, fuzzy=True) < parse(date2, fuzzy=True):
return date1
return date2
But should we? Which way is better?
else improves readabilityI would actually prefer to leave this else statement in!
Why?
Well, neither of these returns is really more important than the other:
from dateutil.parser import parse
def earliest_date(date1, date2):
"""Return the string representing the earliest date."""
if parse(date1, fuzzy=True) < parse(date2, fuzzy=True):
return date1
else:
return date2
We're checking whether one date is less than the other. If it is, we return that date, otherwise we return the other date.
If we remove the else, it kind of looks like one date is somehow more important (or at least different) than the other:
from dateutil.parser import parse
def earliest_date(date1, date2):
"""Return the string representing the earliest date."""
if parse(date1, fuzzy=True) < parse(date2, fuzzy=True):
return date1
return date2
It looks like the code inside the if block is an exceptional case, and the code outside is the usual case.
But it's not!
With the else, this code looks to me a bit like a balance scale, with an if and an else on either side.
If we removed the else statement, the code would look lopsided.
I don't think that would make it more readable.
But there are times that I do prefer to remove an unnecessary else at the end of a function.
else statement?Here's a function that calculates the size of a directory:
from pathlib import Path
def calculate_directory_size(path):
path = Path(path)
if path.is_file():
return path.stat().st_size
else:
return sum(
calculate_directory_size(item)
for item in path.iterdir()
)
First we check whether the given path is a file. If it is, we simply return its size.
Otherwise, we loop over all the paths in the given directory (using recursion) and we sum up their sizes.
>>> calculate_directory_size("/home/trey/Downloads")
1548944172
I would prefer to remove the else in this code because this feels like the most important part of this function:
else:
return sum(
calculate_directory_size(item)
for item in path.iterdir()
)
The code inside the if block is simply a check at the beginning to see whether we've hit a base case, the easy case:
if path.is_file():
return path.stat().st_size
I would rather remove the else in cases like this.
from pathlib import Path
def calculate_directory_size(path):
path = Path(path)
if path.is_file():
return path.stat().st_size
return sum(
calculate_directory_size(item)
for item in path.iterdir()
)
Even though we were returning in both the if and the else, the body of the if and the body of the else didn't feel balanced to begin with.
if-else statementsSo the next time you find an if-else in your code where both the if and the else return from the function that you're in, you could think of that else as unnecessary.
But that doesn't necessarily mean it's completely unhelpful.
So before you remove that else statement, think about whether it makes your code more readable or not.
Need to fill-in gaps in your Python skills?
Sign up for my Python newsletter where I share one of my favorite Python tips every week.
Need to fill-in gaps in your Python skills? I send weekly emails designed to do just that.
Sign in to your Python Morsels account to track your progress.
Don't have an account yet? Sign up here.