Many programming languages have switch-case statements.
Unlikely, there are no switch-case statements in Python for versions less than 3.10.
switch
is useful especially if you want to return a lot of different
values based on a specific input.
When I first started programming with C, switch
statements made
sense. After I switched to Python, I found there was no such thing. I
needed to find a workaround or something to do many different things
based on one value.
I first used if
statements as a replacement for switch
cases. It
was ugly, unreadable, and not efficient.
Until I knew there are some other ways to do this to make my code more readable and efficient as well.
In this tutorial, I will show you how to replace switch
statements
for new Python 3.10 and older versions.
Use dictionary as a mapper (for Python < 3.10)
If you are using a Python version less than 3.10, you can use a dictionary as a mapper.
For example, you can use a dictionary to map numbers to their associated words like the following:
digits_mapper = {
0: "zero",
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
9: "nine",
}
print(digits_mapper.get(5, "nothing"))
# five
print(digits_mapper.get(10, "not existing"))
# not existing
In the above example, we used the get
method . It
returns the value associated with the key. If the key is not in the
dictionary, it will return the value specified in the second argument.
Let’s say there are too many cases to check. Using a dictionary is more
efficient than the usual fall-through behavior for switch
.
In other languages, the compiler checks all cases in order until it
finds a break
statement; or it reaches the default
case.
For dictionaries, when we use get
method the compiler only checks
the key passed. It then returns the value associated with that key.
Let’s see a more complex example: If you want to calculate taxes based on many countries. Consider using dictionaries. This time you can define each country’s tax rate calculation in a separate function. Pass that function to a dictionary like the following:
def egypt(amount):
calculate_tax = amount * 0.05 # or insert the tax equation
return calculate_tax
def palestine(amount):
calculate_tax = amount * 0.02 # or insert the tax equation
return calculate_tax
country_tax_calculate = {
"egypt": egypt,
"palestine": palestine
}
def calculate_tax(country_name, amount):
return country_tax_calculate[country_name](amount)
print(calculate_tax("egypt", 8000))
When you used a country_tax_calculate
dictionary, it made your code
more elegant. Readable. And also more efficient.
You used that dictionary in calculate_tax()
function passing the country_name
key to it.
Note that the key is a function (e.g. egypt
) and the argument
passed to it is the amount
value.
Use match-case
(for Python 3.10 and above)
In 2006 in Python 3.0 version, Guido von Rossum (the creator of Python) rejected a switch/case statement .
Until in September 2020 (Python 3.10) he and Brandt Bucher (a software engineer at Microsoft) introduced a structural pattern matching .
This introduced using a match/case statement; the first-class
implementation for a switch
case in Python.
Let’s look at the following snippet:
def f(digit):
match digit:
case 1:
return "one"
case 2:
return "two"
case 3:
return "three"
case 4:
return "four"
case 5:
return "five"
case 6:
return "six"
case 7:
return "seven"
case 8:
return "eight"
case 9:
return "nine"
case _:
return "not existing" # the default case when a digit is not found
print(f(5))
# five
print(f(10))
# not existing
Pattern matching is very efficient. In fact, it is more efficient than the workaround in the previous section.
It is not just a switch case statement. If you’re interested, read more on this in the Python documentation .
The case _
statement at the end of the match/case statement is like
the default
case in other languages. Use it when the value is not
found in the match-case statement. Unlike switch
cases in other
languages, match-case
doesn’t fall
through to the next case
if the value is already found.
For example, in the previous example when we check if 5
existed or
not. The matcher would return five
and would not go through the
other cases as the usual switch
case. Efficient, isn’t it?
Conclusion
We have discussed alternative ways to do switch
statements in
Python. We’ve explored that for Python versions older than 3.10 or 3.10
and above. We’ve seen the dictionary workaround and finally the match-case
statement. Both are performant and more pythonic than the
chain of if-elif
statements.