Rejoice! Gone are the long chains of
else statements, because
switch statements will soon be here — sort of. What the Python gods are actually giving us are
match statements are awfully similar to
switch statements, but have a few really cool and unique features, which I’ll attempt to illustrate below.
Flip The Switch
switch statement is often used in place of an
else ladder. Here’s a quick example of the same logic in C, first executed with an
if statement, and then with a
switch statement takes a variable and tests it for equality against a number of different cases. If none of the cases match, then the
default case is invoked. Notice in the example that each
case is terminated by a
break. This protects against more than one case matching (or allows for cascading), as the cases are checked in the order in which they are listed. Once a case is completed,
break is called and the
switch statement exits.
A Match Made In Heaven
You can think of
match statements as “Switch 2.0”. Before we get into the nitty-gritty here, if all you want is
switch in Python then you’re in luck, because they can be used in the same way. Here’s a similar example to what we looked at earlier, this time using
match in Python.
There are a few differences to note right off the bat. First, there are no
break statements. The developers were concerned about confusion if a
break statement were called inside a
match statement inside a loop — what breaks then, the loop or the match? Here, the first case that is satisfied is executed, and the statement returns. You’ll also notice that rather than
default, we have
case _, which behaves in the same way.
The Power of Pattern Matching
So, we’ve got a
switch statement with slightly different syntax, right? Not quite. The name
match was used for a reason — what’s actually going on here is something called Pattern Matching. To illustrate what that is, let’s look at a more exciting example, right out of the feature proposal to add the keyword in question to Python:
Wow! We just took an object, checked its type, checked it’s shape, and instantiated a new object without any indexing, or even a
len() call. It also works on any type, unlike the classic
switch which only works on integral values. In case this wasn’t cool enough for you, patterns can be combined. Again, from the feature proposal:
Okay, okay — one more example. This is where the
match statement gets really powerful. Patterns themselves can include comparisons, known as guards. This lets you filter values within each
Sold! When Can I Try?
We’ll get our hands on this magical new command in Python 3.10, slated for a full release on October 4th, 2021. For the adventurous, an alpha version (Python 3.10.0a6) is available for download today. It might be worth spending some time getting acquainted with the pattern matching, like understanding the difference between matching literal values and matching variables.
So why doesn’t every language have
match statements? They’re clearly better than
That’s what I said at least, and my girlfriend Sara was quick to raise her eyebrows and explain that there’s a huge performance overhead involved. The
switch statement in C is relatively simple. It compares integers to one another, executing
n constant-time operations. All of the power and convenience that comes with the
match statement means a lot is going on in the background, which in turn slows down the code execution — an incredibly Pythonic tradeoff to make.
I find an efficiency hit a small price to pay for such expanded functionality, but as a Mechanical Engineer my favorite languages are Matlab and Python so you probably should take my opinion here with a grain of salt.