Python 3.8 came out two and a half years ago and I have yet to really lean in on the walrus operator. Partly because it always seemed like something kinda silly (my use cases) to require a python version bump for, and partly because I really didn't understand it the best. Primarily I have wanted to use it in comprehensions, but I did not really understand how.
Now that Python 3.6 is end of life, and most folks are using at least 3.8
it seems time to learn and use it.
What's a Walrus
:=
The assignment operator in python is more commonly referred to as the walrus operator due to how :=
looks like a walrus. It allows you to assign and use a variable in a single expression.
This example from the docs avoids a second call to the len
function.
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
Let's get some data
without a walrus
In this example we are going to do a dict comp to generate a map of content from urls, only if their status code is 200. When doing this in a dictionary comprehension we end up needing to hit the url twice for successful urls. Once for the filter and once for the data going into the dictionary.
{
url: requests.get(url).content
for url in ["https://waylonwalker.com/", "https://waylonwalker.com/broken"]
if requests.get(url).status_code == 200
}
Gimme some walrus
using walrus in a dict comp
Using the walrus operator :=
list comp allows us to only put things into the dictionary that we want to keep, and not hit the url twice.
{
url: r.content
for url in ["https://waylonwalker.com/", "https://waylonwalker.com/broken"]
if (r := requests.get(url)).status_code == 200
}
FIN
The walrus is a nice to have option to save on extra function/network calls, and micro optimize your code without adding much extra.