Using a Dictionary to switch

Until Python 3.10, there was no switch/case statement available in Python. It had been proposed but rejected until finally it was accepted and called match/case. But there is a pattern that you will run across often that uses dicts to act like a switch.

switch / case

What is switch/case and match/case?

Many languages have a “switch-case” construct:

switch(argument) {
    case 0:
        return "zero";
    case 1:
        return "one";
    case 2:
        return "two";
    default:
        return "nothing";
};

How do you say this in Python?

if-elif chains

The obvious way to say it is a chain of elif statements:

if argument ==  0:
    return "zero"
elif argument == 1:
    return "one"
elif argument == 2:
    return "two"
else:
    return "nothing"

And there is nothing wrong with that, but it’s very ugly and hard to read.

Or, if you are using at least Python 3.10, you can use match/case statements:

match argument:
    case 0:
        return "zero"
    case 1:
        return "one"
    case 2:
        return "two"
    case _:
        return "nothing"

And you can use that, too, but the indenting gets to be a bit much for doing anything non-trivial.

dict as switch

The elif chain is neither elegant nor efficient. The match/case block works very well but can get hard to read quicklky. There are a number of ways to say it in python – but one elegant one is to use a dict:

arg_dict = {
    0: "zero",
    1: "one",
    2: "two",
}
arg_dict.get(argument, "nothing")

Simple, elegant and fast.

You can do a dispatch table by putting functions as the value.

Switch with Functions

What would this be like if you used functions instead? Think of the possibilities.

def my_zero_func():
    return "I'm zero"

def my_one_func():
    return "I'm one"

switch_func_dict = {
    0: my_zero_func,
    1: my_one_func,
}

switch_func_dict.get(0)()

Again, fast and efficient.

This is possible because functions are “first class objects” in Python.

This will come in handy on your assignments when trying to implement a menu system. Rather than writing a whole series of if/elif statements you can call into a dict with the user’s menu choice.