Python Ships 3.9.4 and 3.8.9: Boring Releases Are a Feature
The Python core team quietly shipped 3.9.4 and 3.8.9 maintenance releases, bundling security and bug fixes while 3.10 alpha work continues.
No fireworks this week from the Python Software Foundation, and that’s exactly the point. On April 4, the core team pushed out Python 3.9.4 and Python 3.8.9, two maintenance releases that roll up security patches and bug fixes for anyone running those branches in production. Nothing new to learn, no syntax to relearn, no libraries to update for compatibility. You just pull the new patch version and move on with your day.
It’s worth pausing on how unglamorous this is by design. Python’s release cadence splits cleanly into two tracks: feature releases (3.9, 3.10, and so on) that land roughly once a year and carry new language features, and maintenance releases within a branch that are supposed to be pure bug and security fixes. 3.9.4 and 3.8.9 both fall into the second bucket. If you’re the kind of developer who reads changelogs for fun, there’s not much to see here — which is a good sign that the process is working the way it’s supposed to.
There’s a real discipline behind that boringness, though. Every actively supported branch gets this treatment on a schedule, and the PSF has been fairly consistent about not letting maintenance releases become a dumping ground for “just one small feature.” That matters more than it sounds like, especially for teams running Python in anything resembling a regulated or security-conscious environment, where “did this patch version change any behavior” is a question people actually have to answer before they’ll approve an upgrade. A pure bugfix release makes that answer easy.
Meanwhile, the more interesting stuff is happening one branch over. The core team has been quietly grinding through alpha development on Python 3.10, with a feature freeze expected later this year ahead of a fall release. That’s usually where you start seeing the CPython mailing lists light up with debate — structural pattern matching landed in an earlier alpha and has been the subject of no shortage of opinions, and there’s the usual churn of typing improvements, better error messages, and performance tweaks that tend to define each new minor version. None of that is finalized yet, and it’s way too early to treat any of it as locked in.
If you’re maintaining Python services right now, the actionable bit is simple: if you’re on 3.9 or 3.8, there’s no reason not to take these patch releases. They’re specifically the kind of update you shouldn’t need a change-management meeting to approve. The bigger planning question — whether you’re eyeing 3.10 later this year, or still holding on an older branch because some dependency hasn’t caught up — is a separate conversation, and one worth having well before any feature freeze locks in what that release actually looks like.
It’s a small story, admittedly. But “the maintenance releases keep shipping on schedule and don’t break anything” is underrated infrastructure health, the kind you only notice when it stops happening.