Python Will Soon Support Switch Statements
Rejoice! Gone are the long chains of if
…else
statements, because switch
statements will soon be here — sort of. What the Python gods are actually giving us are match
statements. 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
A switch
statement is often used in place of an if
…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:
Essentially, 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 case
statement:
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 switch
statements!
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.
Post a Comment