Python 3.9 Lands This Week: Dict Merges, Cleaner Type Hints, and a Farewell to 3.5
Python 3.9.0 ships October 5 with new dict merge operators and PEP 585 generics, right as 3.5 hits end-of-life.
Mark your calendars: Python 3.9.0 is scheduled for its official release on October 5, just two days from now. It’s not the flashiest release in the language’s history, but there are a couple of changes in here that I think will quietly change how a lot of everyday Python code gets written.
The one I’m most excited about is the new dict merge and update operators. Starting with 3.9, you’ll be able to combine two dictionaries with | and update one in place with |=. If you’ve ever reached for {**a, **b} to merge dictionaries, or written a small helper function just to avoid mutating an existing dict, this is for you. It’s a small syntax addition, but it maps onto something Python programmers do constantly — combining config dicts, merging default and override settings, that kind of thing. Having a single readable operator for it instead of the unpacking-dict trick or a manual loop is a nice quality-of-life win.
Generics without the ceremony
The second big change is PEP 585, which lets you use built-in collection types directly as generics in type hints. So instead of importing List, Dict, or Tuple from the typing module just to write something like List[int], you’ll be able to write list[int] using the built-in list type itself. Same goes for dict, tuple, set, and others.
If you’ve done any amount of type annotation in Python over the past few years, you know the friction here: you’re writing perfectly ordinary code, then you hit a type hint and suddenly need an extra import line for typing.List just to describe “a list of integers.” PEP 585 removes that indirection. It’s the kind of change that doesn’t show up in benchmarks but shows up in how pleasant the language feels to use day to day. I’d expect linters, style guides, and eventually type checkers to start nudging people toward the built-in syntax pretty quickly once 3.9 is out in the wild.
Housekeeping, but important housekeeping
The timing of this release also coincides with two other milestones worth noting. Python 3.5 is reaching its official end-of-life around now, which means no more security patches for that branch — if you’re still running production code on 3.5, this is as good a prompt as any to get a migration plan together. Given how much has changed across 3.6 through 3.9 (f-strings, walrus operator, type hint improvements, and now this dict/generics stuff), it’s worth the effort.
Separately, the annual Python Developer Survey has opened for responses. It’s a good yearly pulse-check on where the community actually stands on things like Python 2 holdouts, popular frameworks, and version adoption speed. Worth a few minutes if you want your usage patterns reflected in whatever report comes out of it.
None of this is revolutionary on its own, but stacked together — cleaner dict syntax, less typing-module boilerplate, and the community finally shedding 3.5 — it feels like a release focused on smoothing out rough edges rather than chasing headline features. Sometimes that’s exactly the kind of release a mature language needs.