Switch Case Replacements for Python

Created on Feb 20, 2022

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.