After years of community requests, Python is finally getting frozendict. The Steering Council accepted PEP 814 in February, bringing an immutable, hashable dictionary as a built-in type in Python 3.15. It’s one of those additions that feels overdue, and the frozenset-to-set analogy makes it immediately intuitive. This is just one piece of a busy month of Python news.
Beyond that, February brought security patches, AI SDK updates, and some satisfying infrastructure improvements under Python’s hood. Time to dive into the biggest Python news from the past month!
Join Now: Click here to join the Real Python Newsletter and you’ll never miss another Python tutorial, course, or news update.
Python Releases and PEP Highlights
The Steering Council was active in February, with several PEP decisions landing. On the release side, both the 3.14 and 3.13 branches got maintenance updates.
Python 3.15.0 Alpha 6: Comprehension Unpacking and More
Python 3.15.0a6 shipped on February 11, continuing the alpha series toward the May 5 beta freeze. This release includes several accepted PEPs that are now testable:
- PEP 798: Unpacking in comprehensions using
*and** - PEP 799: A high-frequency, low-overhead statistical sampling profiler
- PEP 686: UTF-8 as the default text encoding
- PEP 728:
TypedDictwith typed extra items
PEP 798 is the kind of quality-of-life improvement that makes you smile. It lets you flatten or merge collections directly in a comprehension:
>>> lists = [[1, 2], [3, 4], [5]]
>>> [*it for it in lists]
[1, 2, 3, 4, 5]
>>> dicts = [{"a": 1}, {"b": 2}]
>>> {**d for d in dicts}
{'a': 1, 'b': 2}
No more writing explicit loops just to concatenate a list of lists.
The JIT compiler continues to show gains: 3-4% on x86-64 Linux over the standard interpreter and 7-8% on AArch64 macOS over the tail-calling interpreter, matching the numbers from alpha 5.
Note: Alpha 7 is scheduled for March 10, 2026, with the beta phase starting May 5. If you maintain packages, now is a great time to test against early builds.
Python 3.14.3 and 3.13.12: Maintenance Releases
On February 3, the team shipped Python 3.14.3 with around 300 bug fixes and Python 3.13.12 with about 240 fixes. No new features here, but if you’re running either version in production, it’s worth grabbing these patches to stay current.
PEP 814 Accepted: frozendict Joins the Built-Ins
This one has been on many Python developers’ wishlists for over a decade. PEP 814, authored by Victor Stinner and Donghee Na, adds frozendict as a built-in immutable dictionary type in Python 3.15.
The concept is straightforward. Just as frozenset gives you an immutable version of set, frozendict gives you an immutable version of dict:
>>> config = frozendict(host="localhost", port=8080)
>>> config["host"]
'localhost'
>>> config["host"] = "0.0.0.0"
Traceback (most recent call last):
...
TypeError: 'frozendict' object does not support item assignment
Because frozendict instances are immutable, they’re hashable when all their keys and values are hashable. That means you can use them as dictionary keys, store them in sets, or pass them to @functools.lru_cache()-decorated functions:
>>> permissions = {
... frozendict(role="admin"): ["read", "write", "delete"],
... frozendict(role="viewer"): ["read"],
... }
The new type supports union operators (| and |=), type annotations via frozendict[str, int], and equality comparison with regular dicts. Notably, frozendict does not inherit from dict, which keeps the immutability guarantees clean and avoids any accidental mutation through inherited methods.
Note: The PEP reached Final status on February 11, 2026. You won’t find frozendict in the current alphas yet, but implementation work is underway for inclusion before the beta freeze.
Other PEP Updates
Beyond frozendict, the Steering Council made a couple more PEP decisions in February:
-
PEP 815 Final – Deprecate
RECORD.jwsandRECORD.p7s: This cleans up wheel signature formats that no major packaging tool actually supports. Going forward, the recommendation is to rely on index-hosted attestations like those on PyPI. -
PEP 743 Rejected –
Py_OMIT_LEGACY_API: The Council turned down a proposal to let C extension authors opt out of deprecated C API functions via a preprocessor macro, citing concerns about granularity and developer experience. They suggested better linter tooling as the more effective path.
Community and Ecosystem Highlights
Sometimes the most satisfying improvements are the ones lurking deep in Python’s internals. This month brought a fix that was literally 15 years in the making.
Ending 15 Years of subprocess Polling
One of the month’s most satisfying reads was Giampaolo Rodola’s blog post on ending 15 years of subprocess polling. Since Python 3.3, the subprocess module has used busy-loop polling to check whether a child process has finished. It repeatedly calls waitpid(WNOHANG), sleeps, then checks again with exponential backoff from 0.1ms to 40ms.
Modern operating systems have proper event-driven mechanisms for this. Python 3.15 will now use pidfd_open() on Linux and kqueue() on macOS to get notified when processes exit, dropping context switches from 258 to just 2 in benchmarks. Rodola first implemented the approach in psutil, then upstreamed matching improvements to CPython. If you’ve ever wondered why subprocess.run() seemed to add unnecessary latency, this is your answer.
Dispatch From the Inaugural PyPI Support Specialist
Maria Ashna shared a candid look at her year and a half as PyPI’s first Support Specialist. When she started in July 2024, account recovery requests were four months behind, and PEP 541 (package name claims) had a 16-month backlog. She cleared both queues to current status, processing nearly 3,000 account recovery issues and approving over 8,000 PyPI Organizations applications.
It’s a great behind-the-scenes look at the human infrastructure that keeps the Python packaging ecosystem running.
MicroPythonOS: An Android-Like Experience on Microcontrollers
Following up on the MicroPython-in-a-PlayStation-game story from December, MicroPythonOS is a lightweight graphical operating system for microcontrollers like the ESP32. It delivers an Android-like user interface experience, complete with touch input and app-style navigation, all powered by MicroPython. If you’re into embedded development, you’ll want to check it out.
Library and Tooling Updates
Django shipped an unusually heavy round of security patches, and uv hit its second breaking-changes release. Both updates affect workflows that many Python developers rely on daily, so they’re important to review.
Django Security Releases: Three SQL Injection Fixes
The Django team shipped security releases on February 3 for Django 6.0.2, 5.2.11, and 4.2.28, addressing six vulnerabilities including three high-severity SQL injection bugs affecting:
- Raster lookups on PostGIS (CVE-2026-1207)
- Column aliases with control characters (CVE-2026-1287)
QuerySet.order_byandFilteredRelation(CVE-2026-1312)
Two moderate denial-of-service issues and a low-severity timing attack in the mod_wsgi authentication handler were also patched. If you run Django in production, you’ll want to upgrade immediately. Three high-severity SQL injections in a single release are unusual and worth taking seriously.
uv 0.10.0: Breaking Changes and Stabilized Features
uv 0.10.0 landed on February 5 as a breaking-changes batch release. The biggest stabilized feature is uv python upgrade for seamless patch-version upgrades in virtual environments, along with uv workspace list and uv add --bounds.
Here are notable breaking changes to watch for:
uv venvnow requires--clearto remove an existing environment.- PyPy and GraalPy executables install under their implementation name—for example,
pypy3.10instead ofpython3.10. uv formatupgraded to Ruff 0.15.0 with the 2026 style guide.- Python 3.8 Docker images are discontinued.
Note: Seven patch releases (0.10.1–0.10.7) followed throughout February, so make sure you’re on the latest if you’ve already upgraded. For a quick reference on uv commands, check out this popular uv cheatsheet that topped PyCoder’s Weekly this month.
For a closer look at uv, check out the Managing Python Projects With uv: An All-in-One Solution tutorial.
AI Tooling Updates
The AI Python SDK landscape moved fast this month, with both OpenAI and Anthropic racing to add WebSocket-based real-time transports to their SDKs. Here’s what matters for Python developers.
Anthropic: Structured Outputs GA and MCP Helpers
Anthropic’s Python SDK shipped four releases in February (v0.81.0–v0.84.0). Highlights include structured outputs, now generally available for Claude Sonnet 4.5, Opus 4.5, and Haiku 4.5, dropping the beta header requirement. The web search tool and fine-grained tool streaming are also GA.
The most practical addition for developers building MCP integrations is v0.84.0’s new helpers for converting MCP tools, prompts, and resources directly to Anthropic API types. If you’ve been manually wrangling tool schemas between MCP and Claude, this should save you some boilerplate.
OpenAI: WebSocket Transport and the Assistants Sunset
The openai-python SDK shipped eight releases in February (v2.17.0–v2.24.0). The headline is WebSocket transport for the Responses API (v2.22.0), enabling persistent, low-latency connections across multi-turn agent workflows.
More significantly, OpenAI announced plans to sunset the Assistants API in 2026 after achieving feature parity in the Responses API. If you’ve built applications on the Assistants API, it’s time to start planning your migration. The Agents SDK also dropped Python 3.9 support.
vLLM 0.16.0: Self-Hosted Realtime API
vLLM 0.16.0 is the largest vLLM release to date, with 440 commits from 203 contributors. The standout feature is a WebSocket-based Realtime API that mirrors OpenAI’s interface, making vLLM a drop-in self-hosted alternative for voice-enabled applications. Async scheduling with pipeline parallelism resulted in a 30.8% end-to-end throughput improvement.
Open-Source AI at Wagtail
On the community side, Thibaud Colas from the Wagtail CMS team published a thoughtful post on open-source AI tools they use for development. The post covers their experience with models like Qwen3 Coder and Mistral Small through providers like Ollama and LM Studio.
The central argument frames open-source model adoption as moving from “renting” to “owning” AI capabilities. If you’re evaluating AI coding tools for your own workflow, it’s a practical starting point.
Conferences and Events
A couple of Python conferences have CFP deadlines approaching:
- DjangoCon US 2026 (August 24-28, Chicago) – CFP closes March 16
- PyCon Australia 2026 (August 26-30, Brisbane) – CFP closes March 30
If you haven’t already, PyCon US 2026 registration is open for May 13-19 in Long Beach, California. The schedule and tutorial registration will be published later this spring.
Real Python Roundup
The Real Python team kept up the pace in February with new tutorials, video courses, quizzes, and podcast episodes. Here’s what’s new.
Check out these new written tutorials to level up your Python skills:
- How to Run Your Python Scripts and Code
- Python for Loops: The Pythonic Way
- How to Install Python on Your System: A Guide
- TinyDB: A Lightweight JSON Database for Small Projects
- What Exactly Is the Zen of Python?
- Why You Should Attend a Python Conference
- The Terminal: First Steps and Useful Commands for Python Developers
If you prefer watching over reading, these new video courses have you covered:
Test your understanding with these new quizzes:
- Dependency Management With Python Poetry
- Hands-On Python 3 Concurrency With the asyncio Module
- Build a Hash Table in Python With TDD
- Python’s tuple Data Type: A Deep Dive With Examples
- How to Install Python on Your System: A Guide
- TinyDB: A Lightweight JSON Database for Small Projects
- Python’s list Data Type: A Deep Dive With Examples
- What Exactly Is the Zen of Python?
- Python’s pathlib Module: Taming the File System
On The Real Python Podcast, host Christopher Bailey published four new episodes this month:
- Episode 283: Improving Your GitHub Developer Experience
- Episode 284: Running Local LLMs With Ollama and Connecting With Python
- Episode 285: Exploring MCP Apps & Adding Interactive UIs to Clients
- Episode 286: Overcoming Testing Obstacles With Python’s Mock Object Library
If you’ve ever wondered what goes into every tutorial, course, and quiz on the site, check out the Real Python Editorial Guidelines. It walks through the multi-stage review process, from technical accuracy checks by subject-matter experts to language editing by professional editors, and explains how editorial independence is maintained.
What’s Next for Python?
- Python 3.15.0a7 is scheduled for March 10, with the beta freeze on May 5. The
frozendictimplementation and comprehension unpacking syntax will land before then. - PyCon US 2026 will take place May 13-19 in Long Beach, California. Registration is open, and the schedule will be announced this spring.
- If you’re running Django in production, make sure you’ve applied the February security patches. Three high-severity SQL injections aren’t something to sit on.
That’s a wrap for this month. With frozendict, comprehension unpacking, and the end of subprocess polling, Python 3.15 is shaping up to be one of those releases where everyday code just gets a little more enjoyable to write. If any of these features catch your eye, grab an alpha build and try them out. Happy Pythoning!
Join Now: Click here to join the Real Python Newsletter and you’ll never miss another Python tutorial, course, or news update.


