Reaching out to capture a moment
October 22, 2011 at 10:09 PM by Dr. Drang
For reasons that are a mystery to me, my local NOAA weather station has started reporting wind gusts of “0.0” miles per hour, which makes both my NerdTool desktop and my little iPhone weather app report silly looking results.
The code that gathers the weather data from NOAA and presents it is kept in this GitHub repository. The part that deals with wind speeds and gusts has always been able to handle a situation in which the station doesn’t report gusts at all:
python:
try:
gust = ', gusting to %s mph' % noaa['wind_gust_mph']
except KeyError:
gust = ''
out.append('Wind: %s at %s mph%s' % ( noaa['wind_dir'], noaa['wind_mph'], gust))
Unfortunately, the try/except
form can’t catch gusts of zero because they aren’t errors, at least not by Python’s definition. The fix was pretty simple:
python:
try:
if float(noaa['wind_gust_mph']) > 0:
gust = ', gusting to %s mph' % noaa['wind_gust_mph']
else:
gust = ''
except KeyError:
gust = ''
out.append('Wind: %s at %s mph%s' % ( noaa['wind_dir'], noaa['wind_mph'], gust))
This corrected what showed up on my Desktop. I made a similar change in the CGI program to keep 0.0 mph gusts out of the weather page.
You may be wondering why I didn’t use Python’s ternary operator. In fact, that’s what I did first, but I decided that this
python:
try:
gust = ', gusting to %s mph' % noaa['wind_gust_mph'] if float(noaa['wind_gust_mph']) > 0 else ''
except KeyError:
gust = ''
out.append('Wind: %s at %s mph%s' % ( noaa['wind_dir'], noaa['wind_mph'], gust))
wasn’t as easy to read as the explicit if/else
block, so I changed it.
I’ve always thought the ternary operator—which looks like
ruby:
x = x > 0 ? 1 : -1
in Ruby, Perl, and other C-derived languages, and like
python:
x = 1 if x > 0 else -1
in Python—is pretty cool because it reads very much like you’d say it: “Set x to positive one if it’s positive and negative one otherwise.”1 But when the assignment or the test get long, the simple intent of the assignment gets lost in the details, and the more formal multiline if/else
structure is much clearer.
The foregoing is, I confess, more simplistic than my usual programming posts. It was really just an excuse to use the title (originally “Bending down to give me a rainbow”) and to include this video. Don’t leave before the 1:40 mark.