skip to navigation
skip to content

Planet Python

Last update: March 15, 2026 04:44 AM UTC

March 14, 2026


Real Python

Quiz: Splitting, Concatenating, and Joining Python Strings

How well do you know Python string manipulation? In this quiz, you’ll revisit concepts like string immutability, splitting and joining with different arguments, and building safe string operations for tasks like CSV handling.

You’ll get hands-on practice with real examples from the Splitting, Concatenating, and Joining Strings in Python course. Ready to test your skills?


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 14, 2026 12:00 PM UTC


Seth Michael Larson

I’ve added human.json to my website

Evan Hahn recently blogged about adding support for the “human.json protocol” to his website. I read the specification and thought this seemed like a straightforward protocol to implement. I've followed along, and added a /human.json file to my website and rel="human-json" in a <link> element to the <head> section of my HTML. Easy!

Vouching was a little more involved because I wanted to auto-discover who uses human.json from everyone that I follow using RSS. Then my vouches can be kept up-to-date as more people implement the protocol. The script below is what I ended up with:

import pathlib
import json
import datetime
import re
import opml
import urllib3

today = datetime.date.today().strftime("%Y-%m-%d")

human_json_path = pathlib.Path("app/static/human.json")
human_json = json.loads(human_json_path.read_text())
vouched_urls = {vouch["url"] for vouch in human_json["vouches"]}

doc = opml.OpmlDocument.load("archive/feeds.opml")
for outline in doc.outlines:
    try:
        mat = re.search(r"^(https?://[^/]+)(?:/|$)", outline.html_url or "")
        if not mat:
            continue
        url = mat.group(1)
        resp = urllib3.request(
            "GET",
            f"{url}/human.json",
            headers={
                # Be a good internet netizen:
                # always set a User-Agent with
                # your domain and email.
                "User-Agent": "sethmlarson.dev/1.0 (sethmichaellarson@gmail.com)",
                "Accept": "application/json",
            },
            retries=0,
            timeout=5,
        )
        if resp.status < 300 and "vouches" in resp.json() and url not in vouched_urls:
            human_json["vouches"].append({"url": url, "date": today})
    except Exception as e:
        continue

human_json_path.write_text(json.dumps(human_json, indent=2))

Running this script turned up with two websites that I follow already supporting the protocol:

Maybe this post will inspire you to add support to your own website? If you do and I follow you via RSS, your website will appear automatically after I regenerate my OPML files. If we're mutuals on Mastodon or Bluesky give me a ping and I'll add you sooner.

I'm probably not going to use the browser extension myself, but if others are using the data from this "network" then that is a win.



Thanks for keeping RSS alive! ♄

March 14, 2026 12:00 AM UTC

March 13, 2026


EuroPython

Humans of EuroPython: Kshitijaa Jaglan

Discover the motivations behind volunteering, the challenges and rewards of organizing such a significant conference, and the impact it has on both attendees and contributors. Hear personal stories and learn how individuals like our interviewee help shape the future of Python through their commitment and collaboration.

In our latest interview Kshitijaa Jaglan, a member of the Sponsorship Team at EuroPython 2025, shares thoughts on enabling sponsors, finding a new community, and more.

alt Kshitijaa Jaglan, a member of the Sponsorship Team at EuroPython 2025

EP: Had you attended EuroPython before volunteering, or was volunteering your first experience with it?

I attended EuroPython remotely during COVID, but this was my first time at the conference in person, and my first time volunteering!

EP: What&aposs one task you handled that attendees might not realize happens behind the scenes at EuroPython?

I worked in the sponsorship team, and it’s not as attendee-facing as some other teams. A big part is building and maintaining relationships. For the new sponsors, we’re the face of the conference, and everything we do reflects on it. For the returning ones who chose to trust us again, it is our responsibility to maintain that level of credibility and ensure a fruitful experience for everyone involved!

EP: How did volunteering for EuroPython impact your relationships within the community?

Before volunteering, I barely knew anyone beyond a few names on LinkedIn and Twitter. When I showed up on crutches on day one, I wasn&apost sure what to expect, but the warmth was immediate. I still remember meeting Anežka on day one and her energy felt like we&aposd known each other forever. Now, ramping up for EuroPython 2026 and seeing everyone&aposs faces on gMeet brings back all the joy. I came in knowing no one, now this community feels like home.

EP: What&aposs one thing you took away from the experience that you still use today?

How genuinely people in this community root for each other. You see it in small moments, like Raquel cheering me on from her A/V setup while I was on stage. That kind of support sticks with you and reminds you to show up the same way for others.

EP: If you could add one thing to make the volunteer experience even better, what would it be?

I wish the conference lasted for a few more days!

EP: Do you have any tips for first-time EuroPython volunteers?

EuroPython is a welcoming community - you’ll bond over shared experiences before you know it! Just stay open, and your environment will do the rest.

EP: If you could describe the volunteer experience in three words, what would they be?

Wholesome beautiful chaos.

EP: Thank you for your contribution to the conference, Kshitijaa!

March 13, 2026 11:24 PM UTC


Talk Python to Me

#540: Modern Python monorepo with uv and prek

Monorepos -- you've heard the talks, you've read the blog posts, maybe you've seen a few tantalizing glimpses into how Google or Meta organize their massive codebases. But it's often in the abstract and behind closed doors. What if you could crack open a real, production monorepo, one with over a million lines of Python and over 100 of sub-packages, and actually see how it's built, step by step, using modern tools and standards? That's exactly what Apache Airflow gives us. <br/> <br/> On this episode, I sit down with Jarek Potiuk and Amogh Desai, two of Airflow's top contributors, to go inside one of the largest open-source Python monorepos in the world and learn how they manage it with uv, pyproject.toml, and the latest packaging standards, so you can apply those same patterns to your own projects.<br/> <br/> <strong>Episode sponsors</strong><br/> <br/> <a href='https://talkpython.fm/agentic-ai'>Agentic AI Course</a><br> <a href='https://talkpython.fm/devopsbook'>Python in Production</a><br> <a href='https://talkpython.fm/training'>Talk Python Courses</a><br/> <br/> <h2 class="links-heading mb-4">Links from the show</h2> <div><strong>Guests</strong><br/> <strong>Amogh Desai</strong>: <a href="https://github.com/amoghrajesh?featured_on=talkpython" target="_blank" >github.com</a><br/> <strong>Jarek's GitHub</strong>: <a href="https://github.com/potiuk?featured_on=talkpython" target="_blank" >github.com</a><br/> <br/> <strong>definition of a monorepo</strong>: <a href="https://monorepo.tools?featured_on=talkpython" target="_blank" >monorepo.tools</a><br/> <strong>airflow</strong>: <a href="https://airflow.apache.org?featured_on=talkpython" target="_blank" >airflow.apache.org</a><br/> <strong>Activity</strong>: <a href="https://github.com/apache/airflow/pulse?featured_on=talkpython" target="_blank" >github.com</a><br/> <strong>OpenAI</strong>: <a href="https://airflowsummit.org/sessions/2025/airflow-openai/?featured_on=talkpython" target="_blank" >airflowsummit.org</a><br/> <strong>Part 1. Pains of big modular Python projects</strong>: <a href="https://medium.com/apache-airflow/modern-python-monorepo-for-apache-airflow-part-1-1fe84863e1e1?featured_on=talkpython" target="_blank" >medium.com</a><br/> <strong>Part 2. Modern Python packaging standards and tools for monorepos</strong>: <a href="https://medium.com/apache-airflow/modern-python-monorepo-for-apache-airflow-part-2-9b53e21bcefc?featured_on=talkpython" target="_blank" >medium.com</a><br/> <strong>Part 3. Monorepo on steroids - modular prek hooks</strong>: <a href="https://medium.com/apache-airflow/modern-python-monorepo-for-apache-airflow-part-3-77373d7c45a6?featured_on=talkpython" target="_blank" >medium.com</a><br/> <strong>Part 4. Shared “static” libraries in Airflow monorepo</strong>: <a href="https://medium.com/apache-airflow/modern-python-monorepo-for-apache-airflow-part-4-c9d9393a696a?featured_on=talkpython" target="_blank" >medium.com</a><br/> <strong>PEP-440</strong>: <a href="https://peps.python.org/pep-0440/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-517</strong>: <a href="https://peps.python.org/pep-0517/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-518</strong>: <a href="https://peps.python.org/pep-0518/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-566</strong>: <a href="https://peps.python.org/pep-0566/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-561</strong>: <a href="https://peps.python.org/pep-0561/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-660</strong>: <a href="https://peps.python.org/pep-0660/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-621</strong>: <a href="https://peps.python.org/pep-0621/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-685</strong>: <a href="https://peps.python.org/pep-0685/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-723</strong>: <a href="https://peps.python.org/pep-0732/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>PEP-735</strong>: <a href="https://peps.python.org/pep-0735/?featured_on=talkpython" target="_blank" >peps.python.org</a><br/> <strong>uv</strong>: <a href="https://docs.astral.sh/uv/?featured_on=talkpython" target="_blank" >docs.astral.sh</a><br/> <strong>uv workspaces</strong>: <a href="https://blobs.talkpython.fm/airflow-workspaces.png?cache_id=294f57" target="_blank" >blobs.talkpython.fm</a><br/> <strong>prek.j178.dev</strong>: <a href="https://prek.j178.dev?featured_on=talkpython" target="_blank" >prek.j178.dev</a><br/> <strong>your presentation at FOSDEM26</strong>: <a href="https://fosdem.org/2026/schedule/event/WE7NHM-modern-python-monorepo-apache-airflow/?featured_on=talkpython" target="_blank" >fosdem.org</a><br/> <strong>Tallyman</strong>: <a href="https://github.com/mikeckennedy/tallyman?featured_on=talkpython" target="_blank" >github.com</a><br/> <br/> <strong>Watch this episode on YouTube</strong>: <a href="https://www.youtube.com/watch?v=SKd78ImNgEo" target="_blank" >youtube.com</a><br/> <strong>Episode #540 deep-dive</strong>: <a href="https://talkpython.fm/episodes/show/540/modern-python-monorepo-with-uv-and-prek#takeaways-anchor" target="_blank" >talkpython.fm/540</a><br/> <strong>Episode transcripts</strong>: <a href="https://talkpython.fm/episodes/transcript/540/modern-python-monorepo-with-uv-and-prek" target="_blank" >talkpython.fm</a><br/> <br/> <strong>Theme Song: Developer Rap</strong><br/> <strong>đŸ„ Served in a Flask 🎾</strong>: <a href="https://talkpython.fm/flasksong" target="_blank" >talkpython.fm/flasksong</a><br/> <br/> <strong>---== Don't be a stranger ==---</strong><br/> <strong>YouTube</strong>: <a href="https://talkpython.fm/youtube" target="_blank" ><i class="fa-brands fa-youtube"></i> youtube.com/@talkpython</a><br/> <br/> <strong>Bluesky</strong>: <a href="https://bsky.app/profile/talkpython.fm" target="_blank" >@talkpython.fm</a><br/> <strong>Mastodon</strong>: <a href="https://fosstodon.org/web/@talkpython" target="_blank" ><i class="fa-brands fa-mastodon"></i> @talkpython@fosstodon.org</a><br/> <strong>X.com</strong>: <a href="https://x.com/talkpython" target="_blank" ><i class="fa-brands fa-twitter"></i> @talkpython</a><br/> <br/> <strong>Michael on Bluesky</strong>: <a href="https://bsky.app/profile/mkennedy.codes?featured_on=talkpython" target="_blank" >@mkennedy.codes</a><br/> <strong>Michael on Mastodon</strong>: <a href="https://fosstodon.org/web/@mkennedy" target="_blank" ><i class="fa-brands fa-mastodon"></i> @mkennedy@fosstodon.org</a><br/> <strong>Michael on X.com</strong>: <a href="https://x.com/mkennedy?featured_on=talkpython" target="_blank" ><i class="fa-brands fa-twitter"></i> @mkennedy</a><br/></div>

March 13, 2026 09:17 PM UTC


PyCon

Launching the PyCon US 2026 Schedule!

We’re excited to announce the full schedule for PyCon US 2026!

For another year, PyCon US received an overwhelming number of incredible proposal submissions, with this year’s final count totaling an impressive 1,015 proposals. We are so excited to have so many people in our community share their work and ideas with us. Thank you to everyone who submitted their proposals! 

With these many proposals received, we could easily have enough speakers to fill the program for multiple Python conferences! We were only able to accept 13% of the many strong proposals, and our volunteer Program Committee has worked hard to create an excellent conference program that covers a wide range of subjects for attendees to enjoy. We’re looking forward to meeting all the presenters and learning from them at PyCon US 2026.

Meet Our Keynote Speakers

We are thrilled to announce our Keynote speakers! Please join us in welcoming Lin Qiao, Pablo Galindo Salgado, amanda casari, and Rachell Calhoun & Tim Schilling, as they help us kick off our main conference days, May 15 - May 17, 2026. 


Head to the Keynotes page to learn more about the amazing individuals who make up this year’s Keynote lineup!

Full Schedule Released

Check our updated schedule page to learn more. The schedule has been updated with the dates and timing of our Tutorials, Talk Tracks, Charlas Track, and Sponsor Presentations.

Don’t miss our new dedicated talk tracks: the Future of AI with Python Track on Friday, May 15, and Trailblazing Python Security Track on Saturday, May 16. Visit the schedule page to explore the exciting lineups for each track!

Posters will be featured and displayed during all open hours of the Expo Hall on May 15 - May 16, 2026, with presentations by the authors taking place alongside the Job Fair & Community Showcase on Sunday, May 17, 2026. All together, there will be a wide array of topics that we hope experienced and newer Python users will find engaging.

Many thanks again to all of those who submitted proposals this year! The schedule would not be the same without all your hard work.

Note that if you’ve attended PyCon US before, you might notice that our scheduling looks slightly different this year. We encourage you to check the schedule ahead of the conference.

Thank You Committees and Reviewers!

Thank you to all of our Program Committee members and proposal reviewers who volunteered their time and hard work! Going through over one thousand proposals is no easy task. Without their efforts in helping to launch the PyCon US Call for Proposals, the PyCon US program would not have been possible.

Their commitment to managing the process of preparing for CFPs to launch and managing the review process began over 6 months ago. We truly could not have accomplished the final result of launching the schedule today without each of them–we appreciate you!
  • Tutorial Committee: Sarah Kuchinsky, Merilys Huhn & Stephen Kiazyk
  • Program Committee: Philippe Gagnon
  • Charlas Committee: Denny Perez & CristiĂĄn Maureira-Fredes
  • Poster Committee: Kristen McIntyre
  • The Future of AI with Python Track Co-Chairs: Silona Bonewald & Zac Hatfield-Dodds
  • Trailblazing Python Security Track Co-Chairs: Juanita Gomez & Seth Larson
In addition, we want to send a huge thank you to the numerous volunteers who reviewed each of the submissions and worked long hours to make sure PyCon US has a great line-up. 

Tutorial, Summit & Event Registration

Registration is now open for Tutorials, select Summits & Events, and the PyLadies Auction.
Please note that there is no registration for Sponsor Presentations. Sponsor Presentations are open until all spots are filled, so make sure you check out each event’s schedule to know when to show up and grab your spot!

Be sure to register for the conference if you have not already done so. Keep in mind that there are limited spaces available for each of the events listed above, with Tutorials and PyLadies Auction being sold out way ahead of the conference each year. So if you’re planning to attend and participate in any of these, be sure to register early!

NOTE: Please be sure to hit “Check out and Pay” when registering for any extra events, including Tutorials and the PyLadies Auction. If you do not complete your invoice and an event sells out, it will be removed from your cart and you will no longer be able to reserve a spot for that session. Please contact pycon-reg@python.org with any questions.

PyCon US Hotel Block

Don’t forget to book your hotel reservations with the PyCon US hotel block to receive our discounted conference rates while supplies last! 

If you’re planning to attend PyCon US, please consider booking your stay in the official conference hotel block. When attendees reserve rooms through the block, it helps the conference meet its contractual commitments with the venue and avoid costly penalties, which directly impacts the overall cost of running PyCon US.

Strong participation in the hotel block helps PyCon US keep registration prices as low as possible and allows us to continue funding programs that support our community, like PyCon US travel grants. By booking in the hotel block, you’re doing more than securing a convenient place to stay—you’re helping keep PyCon US sustainable and affordable for the entire Python community!

Once you complete your registration for PyCon US 2026, you will be able to book a hotel reservation on your dashboard through our official housing bureau, Orchid Events. This is the only way to get the conference rates, so book now before they sell out! The hotel blocks will start closing on April 20th and close fully on April 24th, 2026. More information can be found on the Venue and Hotels page.

Conference T-shirts

PyCon US 2026 conference, PyLadies, and Charlas t-shirts are now available! You can order t-shirts when you are registering for the conference or add them to an already existing registration using the link on your dashboard. The deadline to order t-shirts is April 14, 2026.

A special shoutout and thank you to Georgi K for the hard work and creativity that went into this year’s t-shirt designs!

March 13, 2026 04:45 PM UTC


PyCharm

Last week marked the fruition of almost a year of hard work by the entire PyCharm team. On March 4th, 2026, we hosted Python Unplugged on PyTV, our first-ever community conference featuring a 90s music-inspired online conference for the Python community.

Python Unplugged on PyTV – Free Online Python Conference

The PyCharm team is a fixture at Python conferences globally, such as PyCon US and EuroPython, but we recognize that while attending a conference can be life-changing, the costs involved put it out of reach for many Pythonistas.

We wanted to recreate the entire Python conference experience in a digital format, complete with live talks, hallway tracks, and Q&A sessions, so anyone, anywhere in the world, could join in and participate.

And we did it! Superstar speakers from across the Python community joined us in our studio in Amsterdam, Netherlands – the country where Python was born. Some of them traveled for over 10 hours, and one even joined with their newborn baby! Travis Oliphant, of Numpy and Scipy fame, was ultimately unable to join us in person, but he kindly pre-recorded a wonderful talk and participated in a live Q&A after it, despite it being very early morning in his time zone. 

Cheuk Ting Ho, Jodie Burchell,  Valerie Andrianova

The PyCharm team is extremely grateful for the community’s support in making this happen.

The event

We livestreamed the entire event from 11am to 6:30pm CET/CEST, almost seven and a half hours of content, featuring 15 speakers, a PyLadies panel, and an ongoing quiz with prizes. Topics covered the future of Python, AI, data science, web development, and more.

Here is the complete list of speakers and timestamped links to their talks:

The studio room with presenter’s desk and Q&A table. Production meeting the day before the event

We spent the afternoon doing final checks and a run-through with the studio team at Vixy Live. They were very professional and patient with us as we were working in a studio for the first time. With their help, we were confident that the event the next day would go smoothly.

Livestream day

On the day of the livestream, we arrived early to get our makeup done. The makeup artists were absolute pros, and we all looked great on camera. One of our speakers, Carol, jokingly said that she is now 20 years younger! The hosts, Jodie, Will, and Cheuk, were totally covered in ‘90s fashion and vibes.

Python Team Lead Jodie Burchell bringing the 90s back

We also had swag designed by our incredible marketing team, including t-shirts, stickers, posters, and tote bags.

PyTV Stickers for all participants PyTV Totebags

PyTV posters

Python content for everyone

After a brief opening introducing the conference and the event Discord, we began with a series of talks focused on the community, learning Python, and other hot Python topics. We also had two panels, both absolutely inspiring: one on the role of AI in open source and another featuring prominent members of PyLadies.

Following our first block of speakers, we moved on to web development-focused talks from key people involved with the Django framework. We then had a series of talks from experts across the data science and AI world, including speakers from Microsoft, Hugging Face, and LlamaIndex, who gave us up-to-date insights into open-source AI and agent-based approaches. We ended with a talk by Carol Willing, one of the most respected figures in the Python community.

Throughout the day, we ran a quiz for the audience to test their knowledge about Python and the community. Since we had many audience members learning Python, we hope they learned some fun facts about Python through the quiz.

First of 8 questions on the Python ecosystem

Sarah Boyce, Will Vincent, Sheena O’Connell, Carlton Gibson, Marlene Mhangami

Next year?

Looking at the numbers, we had more than 5,500 people join us during the live stream, with most of them watching at least one talk. We’ve since had another 8,000 people as of this writing watch the event recording.

We’d love to do this event again next year. If you have suggestions for speakers, topics, swag, or anything else please leave it in the comments!

March 13, 2026 04:41 PM UTC


Rodrigo GirĂŁo SerrĂŁo

TIL #141 – Inspect a lazy import

Today I learned how to inspect a lazy import object in Python 3.15.

Python 3.15 comes with lazy imports and today I played with them for a minute. I defined the following module mod.py:

print("Hey!")

def f():
    return "Bye!"

Then, in the REPL, I could check that lazy imports indeed work:

>>> # Python 3.15
>>> lazy import mod
>>>

The fact that I didn't see a "Hey!" means that the import is, indeed, lazy. Then, I wanted to take a look at the module so I printed it, but that triggered reification (going from a lazy import to a regular module):

>>> print(mod)
Hey!
<module 'mod' from '/Users/rodrigogs/Documents/tmp/mod.py'>

So, I checked the PEP that introduced explicit lazy modules and turns out as soon as you reference the lazy object directly, it gets reified. But you can work around it by using globals:

>>> # Fresh 3.15 REPL
>>> lazy import mod
>>> globals()["mod"]
<lazy_import 'mod'>

This shows the new class lazy_import that was added to support lazy imports!

Pretty cool, right?

March 13, 2026 01:38 PM UTC


PyCharm

Python Unplugged on PyTV Recap

March 13, 2026 01:05 PM UTC


Real Python

The Real Python Podcast – Episode #287: Crafting and Editing In-Depth Tutorials at Real Python

What goes into creating the tutorials you read at Real Python? What are the steps in the editorial process, and who are the people behind the scenes? This week on the show, Real Python team members Martin Breuss, Brenda Weleschuk, and Philipp Acsany join us to discuss topic curation, review stages, and quality assurance.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 13, 2026 12:00 PM UTC

Quiz: Your Python Coding Environment on Windows: Setup Guide

Test your understanding of Python Coding Setup on Windows.

By working through this quiz, you’ll review the key steps for setting up a Python development environment on Windows. You’ll cover system updates, Windows Terminal, package managers, PowerShell profiles, environment variables, and safe use of remote scripts.

You’ll also check practical details like configuring Path, managing Python versions, using version control, and streamlining your workflow.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 13, 2026 12:00 PM UTC


PyPy

PyPy v7.3.21 release

PyPy v7.3.21: release of python 2.7, 3.11

The PyPy team is proud to release version 7.3.21 of PyPy after the previous release on July 4, 2025. This is a bug-fix release that also updates to Python 3.11.15.

The release includes two different interpreters:

The interpreters are based on much the same codebase, thus the double release. This is a micro release, all APIs are compatible with the other 7.3 releases.

We recommend updating. You can find links to download the releases here:

https://pypy.org/download.html

We would like to thank our donors for the continued support of the PyPy project. If PyPy is not quite good enough for your needs, we are available for direct consulting work. If PyPy is helping you out, we would love to hear about it and encourage submissions to our blog via a pull request to https://github.com/pypy/pypy.org

We would also like to thank our contributors and encourage new people to join the project. PyPy has many layers and we need help with all of them: bug fixes, PyPy and RPython documentation improvements, or general help with making RPython's JIT even better.

If you are a python library maintainer and use C-extensions, please consider making a HPy / CFFI / cppyy version of your library that would be performant on PyPy. In any case, cibuildwheel supports building wheels for PyPy.

What is PyPy?

PyPy is a Python interpreter, a drop-in replacement for CPython It's fast (PyPy and CPython performance comparison) due to its integrated tracing JIT compiler.

We also welcome developers of other dynamic languages to see what RPython can do for them.

We provide binary builds for:

PyPy supports Windows 32-bit, Linux PPC64 big- and little-endian, Linux ARM 32 bit, RISC-V RV64IMAFD Linux, and s390x Linux but does not release binaries. Please reach out to us if you wish to sponsor binary releases for those platforms. Downstream packagers provide binary builds for debian, Fedora, conda, OpenBSD, FreeBSD, Gentoo, and more.

What else is new?

For more information about the 7.3.21 release, see the full changelog.

Please update, and continue to help us make pypy better.

Cheers, The PyPy Team

March 13, 2026 10:00 AM UTC


eGenix.com

PyDDF Python Spring Sprint 2026

The following text is in German, since we're announcing a Python sprint in DĂŒsseldorf, Germany.

AnkĂŒndigung

Python Meeting Spring Sprint 2026 in
DĂŒsseldorf

Samstag, 21.03.2026, 10:00-18:00 Uhr
Sonntag, 22.03.2026. 10:00-18:00 Uhr

Atos Information Technology GmbH, Am Seestern 1, 40547 DĂŒsseldorf

Informationen

Das Python Meeting DĂŒsseldorf (PyDDF) veranstaltet mit freundlicher UnterstĂŒtzung von Atos Deutschland ein Python Sprint Wochenende.

Der Sprint findet am Wochenende 21/22.03.2026 in der Atos Niederlassung, Am Seestern 1, in DĂŒsseldorf statt.Folgende Themengebiete sind als Anregung bereits angedacht:
NatĂŒrlich können die Teilnehmenden weitere Themen vorschlagen und umsetzen.

Anmeldung, Kosten und weitere Infos

Alles weitere und die Anmeldung findet Ihr auf unserer Blog Seite:

WICHTIG: Ohne Anmeldung können wir den GebÀudezugang nicht vorbereiten. Eine spontane Anmeldung am Sprint Tag wird daher vermutlich nicht funktionieren.

Teilnehmer sollten sich zudem in der PyDDF Telegram Gruppe registrieren, da wir uns dort koordinieren:

Über das Python Meeting DĂŒsseldorf

Das Python Meeting DĂŒsseldorf ist eine regelmĂ€ĂŸige Veranstaltung in DĂŒsseldorf, die sich an Python-Begeisterte aus der Region wendet.

Einen guten Überblick ĂŒber die VortrĂ€ge bietet unser PyDDF YouTube-Kanal, auf dem wir Videos der VortrĂ€ge nach den Meetings veröffentlichen.

Veranstaltet wird das Meeting von der eGenix.com GmbH, Langenfeld, in Zusammenarbeit mit Clark Consulting & Research, DĂŒsseldorf.

Viel Spaß !

Marc-André Lemburg, eGenix.com

March 13, 2026 09:00 AM UTC


Daniel Roy Greenfeld

To return a value or not return a value

I believe any function that changes a variable should return a variable. For example, I argue that Python's random.shuffle() is flawed. This is how random.shuffle() unfortunately works:

import random

my_list = [1, 2, 3, 4, 5]
print(f"Original list: {my_list}")

# Change happens in place
# my_list is forever changed
random.shuffle(my_list) 
print(f"Shuffled list: {my_list}")

In my opinion, random.shuffle() should work like this:

import random

my_list = [1, 2, 3, 4, 5]

# Function returns a new, shuffled list
new_list = random.shuffle(my_list)
print(f"Original list: {my_list}")
print(f"Shuffled list: {new_list}")

Of course, Python won't fix this mistake to fit my preference. There's too many places in the universe expecting random.shuffle to change a list in place. Yet it still bugs me every time I see the function. Stuff like this is why I created my listo package, it allowed me to get past my own sense of annoyance. The listo library is barely used, even by myself, serving mostly as a fun exercise that allowed me to scratch an itch about objects changing in place.

Counterargument

Some of you might say, "It's not practical to return giant dict or list objects when you are changing a single value". You are correct. However, does it make sense for random.shuffle and other offenders to muck around with the entirety of a variable's contents? Why shouldn't a function that disrupts the entirety of a variable just return a new variable?

Closing statement

My preference is that when it is reasonable, that the scope is not outrageous, to create functions that return values.

Also, to the people who implemented the original random.shuffle function, you are awesome. I'm just taking advantage of having 20/20 hindsight.

March 13, 2026 02:41 AM UTC


The Python Show

56 - Python Illustrated

In this episode, we hear from two sisters who put together a beginner's book about Python. The unique hook for their book is that one sister wrote the text while the other did the illustrations. Listen in as we learn about these incredible sisters and how they got into software programming, writing, and technical education.

You can check out their book, Python Illustrated, on Packt or Amazon.

Maaike is an Udemy instructor, and she also has courses on Pluralsight.

March 13, 2026 02:13 AM UTC


Audrey M. Roy Greenfeld

Staticware 0.2.0: The first cut

This is an early release. Staticware does something very satisfyingly today: it serves static files with content-hashed URLs for cache busting. That means when you edit your CSS then redeploy and restart your server, visitors get the latest CSS without forcing a refresh. More will come.

I originally created the code behind Staticware as part of Air, building static file handling was built directly into the framework. Extracting it into standalone ASGI middleware meant that anyone building with Starlette, FastAPI, or raw ASGI could use it too, not just Air users. I even started a PR exploring getting it working with Django.

This package is dedicated to the memory of Michael Ryabushkin (aka goodwill), who died in 2025. Michael was a Pyramid developer who also helped host and grow the LA Django community. He believed that when you build something useful, you should build it for everyone, not just your own framework's users. He advocated that Python web developers learn to write packages generalized enough for the whole community to benefit. Staticware exists as a standalone ASGI library instead of framework-specific code because that's the kindest way to build it, and Michael was one of the people who made that obvious.

uv add staticware

What's in this release

Content-hashed static file serving. HashedStatic("static") scans a directory at startup, computes content hashes, and serves files at URLs like /static/styles.a1b2c3d4.css. Hashed URLs get Cache-Control: public, max-age=31536000, immutable. Original filenames still work with standard caching, and repeated requests return 304 Not Modified.

Automatic HTML rewriting. StaticRewriteMiddleware wraps any ASGI app and rewrites static paths in HTML responses to their hashed equivalents. Streaming responses are buffered and rewritten transparently. Non-HTML responses pass through untouched.

Template URL resolution. static.url("styles.css") returns the cache-busted URL for use in any template engine. Unknown files return the original path with the prefix, so nothing breaks if a file is missing from the directory.

Aims to work with every ASGI framework. Tested with Starlette, FastAPI, Air, and raw ASGI. I've started experimental exploration of it with Django in a PR but that's not part of this release yet. Supports root_path for mounted sub-applications so cache-busted URLs work correctly behind reverse proxies and path prefixes.

Security built in. Path traversal attempts are rejected at both startup (files resolving outside the directory are excluded) and serving time (resolved paths are validated). Files that could escape the static directory never make it into the URL map.

Contributors

@audreyfeldroy (Audrey M. Roy Greenfeld) designed and built staticware: the hashing engine, ASGI serving, HTML rewriting middleware, path traversal protection, 304 support, root_path handling, and the full test suite.

@pydanny (Daniel Roy Greenfeld) reviewed and merged the middleware return value fix (PR #2).

March 13, 2026 12:00 AM UTC

March 12, 2026


Python Morsels

Standard error

Standard error is one of the two writable file streams that is used for printing errors, warning messages, or any outputs that shouldn't be mixed with the main program.

Table of contents

  1. Printing writes to "standard output" by default
  2. Python also has a "standard error" stream
  3. Standard output vs. standard error
  4. Standard error isn't just for errors
  5. When is standard error usually used?
  6. Print atypical output to standard error

Printing writes to "standard output" by default

When we call Python's print function, Python will write to standard output:

>>> print("Hi!")
Hi!

Standard output is a file-like object, also known as a file stream. The standard output file-like object is represented by the stdout object in Python's sys module.

If we look at the documentation for Python's print function, we'll see that by default, print writes to sys.stdout:

>>> help(print)

Help on built-in function print in module builtins:

print(*args, sep=' ', end='\n', file=None, flush=False)
    Prints the values to a stream, or to sys.stdout by default.

    sep
      string inserted between values, default a space.
    end
      string appended after the last value, default a newline.
    file
      a file-like object (stream); defaults to the current sys.stdout.
    flush
      whether to forcibly flush the stream.

If we call the write method on sys.stdout, text will write to the terminal screen:

>>> import sys
>>> bytes_written = sys.stdout.write("Hello!\n")
Hello!

Python also has a "standard error" stream

Standard output is actually one 


Read the full article: https://www.pythonmorsels.com/standard-error/

March 12, 2026 02:45 PM UTC


Real Python

Quiz: How to Use Ollama to Run Large Language Models Locally

In this quiz, you’ll test your understanding of How to Use Ollama to Run Large Language Models Locally.

By working through this quiz, you’ll revisit how to install Ollama, pull and manage models, chat with local LLMs from your terminal, and connect them to AI coding tools.

Running models locally means your prompts stay private and no API keys or cloud services are needed. See how well you remember the key commands and concepts.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 12, 2026 12:00 PM UTC

Quiz: Working With Files in Python

In this quiz, you’ll test your understanding of Working With Files in Python.

By working through this quiz, you’ll revisit key techniques for handling files and directories in Python. You’ll practice safely opening files, iterating over directories, and filtering entries to select only files or subdirectories.

You’ll also explore creating directories and managing files and directories, including deleting, copying, and renaming them.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 12, 2026 12:00 PM UTC


Python Software Foundation

Applications to Join the PSF Meetup Pro Network Are Back Open

Following the introduction of the PSF Community Partner Program, the Python Software Foundation (PSF) is pleased to announce that we have reopened the application for Python Meetup groups to join the PSF’s Meetup Pro Network! We’re very excited to bring back this offering to the Python community after applications were temporarily suspended under the broader PSF Grants Program pause last August. Make sure to check out the PSF’s Meetup Pro Network documentation page for more information on how to apply. 

Reopening applications for the PSF’s Meetup Pro Network is a small but meaningful step forward for our community support-focused programs. The rest of the PSF Grants Program remains on hold while we work through important considerations, such as what we can responsibly budget and how the program will be structured for long-term sustainability. We look forward to sharing more updates when possible. 

The PSF welcomes your comments, feedback, and suggestions regarding the reopening of the PSF Meetup Pro Network on the corresponding Discuss thread. We also invite you to join our upcoming PSF Board or Grants Program Office Hour sessions to talk with the PSF Board and Staff synchronously. If you wish to send your feedback privately, please email grants@python.org. 

About the PSF’s Meetup Pro Network

The PSF manages a Meetup Pro account and adds qualified Python-focused Meetup groups to the overarching PSF Meetup Pro Network. Meetup organizers no longer pay for Meetup subscriptions once they become part of the PSF’s network. We currently have 109 groups in the PSF Meetup Pro Network, which costs the PSF $15/month per group.

The PSF can run reports on Meetup activity, such as the number of interested attendees and events. Management of membership and events is left to the group’s organizers. Any registration fees or deposits for RSVPing or paying for registration to an event are also managed solely by the Meetup organizer. 

Once a Meetup organizer accepts the invite to join, a notation will be shown under the group name: “Part of Python Software Foundation Meetup Pro Network.” Check out the Meetup Pro overview page for more information.

Criteria and how to apply

We've made the application process and criteria as simple as possible, so Python Meetup groups around the world can easily get the support they need. Along those lines, we’ve kept the requirements short and sweet—to qualify for the PSF’s Meetup Pro Network, a Meetup group must:

To apply, fill out the short application form on psfmember.org, that asks for basic contact information, as well as gathers information related to the criteria listed above. Make sure you have an account on psfmember.org and that you’re signed in! A PSF Staff member will reach out with any questions or provide the steps needed to add eligible groups to the PSF Meetup Pro Network. 

About the Python Software Foundation

The Python Software Foundation is a US non-profit whose mission is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers. The PSF supports the Python community using corporate sponsorships, grants, and donations. Are you interested in sponsoring or donating to the PSF so we can continue supporting Python and its community? Check out our sponsorship program, donate directly, or contact our team at sponsors@python.org!

March 12, 2026 08:51 AM UTC

March 11, 2026


Python Morsels

Making friendly classes

A friendly class accepts sensible arguments, has a nice string representation, and supports equality checks.

Table of contents

  1. Always make your classes friendly
  2. An example friendly class
  3. Quick friendly classes with dataclasses
  4. Dataclasses seem confusing?
  5. Not all friendliness is the same
  6. Extra friendly classes
  7. Use dataclasses as a measuring stick

Always make your classes friendly

So you've decided to make a class. How can you make your class more user-friendly?

Friendly classes have these 3 qualities:

  1. They accept sensible arguments
  2. Instances have a nice string representation
  3. Instances can be sensibly compared to one another
  4. (Optionally) When it makes sense, they embrace dunder methods to overload functionality

An example friendly class

Here's a fairly friendly Point 


Read the full article: https://www.pythonmorsels.com/friendly-classes/

March 11, 2026 02:45 PM UTC


Real Python

Pydantic AI: Build Type-Safe LLM Agents in Python

Pydantic AI is a Python framework for building LLM agents that return validated, structured outputs using Pydantic models. Instead of parsing raw strings from LLMs, you get type-safe objects with automatic validation.

If you’ve used FastAPI or Pydantic before, then you’ll recognize the familiar pattern of defining schemas with type hints and letting the framework handle the type validation for you.

By the end of this tutorial, you’ll understand that:

  • Pydantic AI uses BaseModel classes to define structured outputs that guarantee type safety and automatic validation.
  • The @agent.tool decorator registers Python functions that LLMs can invoke based on user queries and docstrings.
  • Dependency injection with deps_type provides type-safe runtime context like database connections without using global state.
  • Validation retries automatically rerun queries when the LLM returns invalid data, which increases reliability but also API costs.
  • Google Gemini, OpenAI, and Anthropic models support structured outputs best, while other providers have varying capabilities.

Before you invest time learning Pydantic AI, it helps to understand when it’s the right tool for your project. This decision table highlights common use cases and what to choose in each scenario:

Use Case Pydantic AI If not, look into 

You need structured, validated outputs from an LLM ✅ -
You’re building a quick prototype or single-agent app ✅ -
You already use Pydantic or FastAPI ✅ -
You need a large ecosystem of pre-built integrations (vector stores, retrievers, and so on) - LangChain or LlamaIndex
You want fine-grained control over prompts with no framework overhead - Direct API calls

Pydantic AI emphasizes type safety and minimal boilerplate, making it ideal if you value the FastAPI-style development experience.

Get Your Code: Click here to download the free sample code you’ll use to work with Pydantic AI and build type-safe LLM agents in Python.

Take the Quiz: Test your knowledge with our interactive “Pydantic AI: Build Type-Safe LLM Agents in Python” quiz. You’ll receive a score upon completion to help you track your learning progress:


Interactive Quiz

Pydantic AI: Build Type-Safe LLM Agents in Python

Learn the trade-offs of using Pydantic AI in production, including validation retries, structured outputs, tool usage, and token costs.

Start Using Pydantic AI to Create Agents

Before you dive into building agents with Pydantic AI and Python, you’ll need to install it and set up an API key for your chosen language model provider. For this tutorial, you’ll use Google Gemini, which offers a free tier perfect for experimentation.

Note: Pydantic AI is LLM-agnostic and supports multiple AI providers. Check the Model Providers documentation page for more details on other providers.

You can install Pydantic AI from the Python Package Index (PyPI) using a package manager like pip. Before running the command below, you should create and activate a virtual environment:

Shell
(venv) $ python -m pip install pydantic-ai

This command installs all supported model providers, including Google, Anthropic, and OpenAI. From this point on, you just need to set up your favorite provider’s API key to use their models with Pydantic AI. Note that in most cases, you’d need a paid subscription to get a working API key.

Note: You can also power your Pydantic AI apps with local language models. To do this, you can use Ollama with your favorite local models. In this scenario, you won’t need to set up an API key.

If you prefer a minimal installation with only Google Gemini support, you can install the slim package instead:

Shell
(venv) $ python -m pip install "pydantic-ai-slim[google]"

You need a personal Google account to use the Gemini free tier. You’ll also need a Google API key to run the examples in this tutorial, so head over to ai.google.dev to get a free API key.

Once you have the API key, set it as an environment variable:

Windows PowerShell
(venv) PS> $ENV:GOOGLE_API_KEY = "your-api-key-here"
Shell
(venv) $ export GOOGLE_API_KEY="your-api-key-here"

With the installation complete and your API key configured, you’re ready to create your first agent. The Python professionals on Real Python’s team have technically reviewed and tested all the code examples in this tutorial, so you can work through them knowing they run as shown.

Read the full article at https://realpython.com/pydantic-ai/ »


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 11, 2026 02:00 PM UTC

Quiz: Threading in Python

In this quiz, you’ll test your understanding of Threading in Python.

By working through this quiz, you’ll revisit how to create and manage threads, use ThreadPoolExecutor, prevent race conditions with locks, and build producer-consumer pipelines with the queue module.

You can also review the written tutorial An Intro to Threading in Python for additional details and code examples.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 11, 2026 12:00 PM UTC

Quiz: Create and Modify PDF Files in Python

In this quiz, you’ll test your understanding of Creating and Modifying PDF Files in Python.

By working through this quiz, you’ll practice reading, extracting, and modifying PDFs using the pypdf library. You’ll also review how to write new PDFs, concatenate and merge files, crop pages, and encrypt or decrypt documents.

These skills help you automate PDF workflows and handle documents programmatically in Python.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 11, 2026 12:00 PM UTC

March 10, 2026


PyCoder’s Weekly

Issue #725: Generators, __init__.py, Pointblank, and More (March 10, 2026)

#725 – MARCH 10, 2026
View in Browser »

The PyCoder’s Weekly Logo


Invent Your Own Comprehensions in Python

Python doesn’t have tuple, frozenset, or Counter comprehensions, but you can invent your own by passing a generator expression to any iterable-accepting callable.
TREY HUNNER

What Does Python’s __init__.py Do?

Learn how Python’s __init__.py declares packages, initializes variables, simplifies imports, and controls what gets exported.
REAL PYTHON course

Replay: Where Developers Build Reliable AI

alt

Replay is a practical conference for developers building real systems. The Python AI & versioning workshop covers durable AI agents, safe workflow evolution, and production-ready deployment techniques. Use code PYCODER75 for 75% off your ticket →
TEMPORAL sponsor

Validating Data With Pointblank in Python

Bad data results in bad choices. This article introduces you to Pointblank a data verification library.
MARK PITBLADO

PEP 825: Wheel Variants: Package Format (Added)

PYTHON.ORG

PEP 827: Type Manipulation (Added)

PYTHON.ORG

Python 3.12.13, 3.11.15 and 3.10.20 Released

PYTHON.ORG

Django Security Releases Issued: 6.0.3, 5.2.12, and 4.2.29

DJANGO SOFTWARE FOUNDATION

Python Jobs

Python + AI Content Specialist (Anywhere)

Real Python

More Python Jobs >>>

Articles & Tutorials

Guido Interviews Thomas Wouters

After last year’s release of the Python documentary, Guido decided to explore those contributors who weren’t mentioned. He’s started a written interview series with a variety of contributors over Python’s first 25 years. This interview is with Thomas Wouters.
GUIDO VAN ROSSUM

Using tox to Test Across Multiple Django Versions

tox is a popular testing tool that uses isolated virtual environments to put your code through its paces using different versions of Python. This post shows you how to use it to test your Django App across multiple versions of Django.
DJANGOTRICKS

What asyncio Primitives Get Wrong About Shared State

Aaron’s company tried Event, Condition, and Queue for handling concurrent shared state, but each one still breaks under real concurrency. This article is about the observable pattern that finally worked for them.
AARON HARPER

Deprecate Confusing APIs Like os.path.commonprefix()

In this opinion piece, Seth argues that os.path.commonprefix() is confusing due to its placement in the os.path module, and this results in security issues. He thinks it should be deprecated, read on to learn why.
SETH LARSON

Replacing tox With uv

UV is quickly becoming the only tool you need in Python, this article looks at how UV can be used to test different versions of dependencies replacing what is traditionally done with tox.
CHANGS.CO.UK ‱ Shared by Jamie Chang

A History of Attempts to Eliminate Programmers

From COBOL in the 1960s to AI in the 2020s, every generation promises to eliminate programmers. Explore the recurring cycles of software simplification hype.
IVAN TURKOVIC

Building Rapidlog: Why I Made a 3x Faster Python Logger

Siddharth built a benchmark-focused Python logging implementation for high-concurrency workloads. This article tells you why and how it was done.
DEV.TO ‱ Shared by Siddharth Pogul

How to Use the OpenRouter API to Access Multiple AI Models

Access models from popular AI providers in Python through OpenRouter’s unified API with smart routing, fallbacks, and cost controls.
REAL PYTHON

Quiz: Use the OpenRouter API to Access Multiple AI Models

REAL PYTHON

Automate Python Data Analysis With YData Profiling

Automate exploratory data analysis by transforming DataFrames into interactive reports with one command from YData Profiling.
REAL PYTHON

Quiz: Automate Python Data Analysis With YData Profiling

REAL PYTHON

Projects & Code

cinderx: High-Performance Python Runtime Extensions

GITHUB.COM/FACEBOOKINCUBATOR

usdatasets: Installable Collection of Datasets on USA

PYPI.ORG ‱ Shared by Renzo Caceres Rossi

python_template: Modern Python Project Template

GITHUB.COM/MAMELI

django-lsp: Django Language Server Protocol Library

GITHUB.COM/ADAMGHILL

Events

Python asyncio Internals

March 10, 2026
LUMA.COM ‱ Shared by Adarsh Divakaran

Weekly Real Python Office Hours Q&A (Virtual)

March 11, 2026
REALPYTHON.COM

Python Atlanta

March 12 to March 13, 2026
MEETUP.COM

PyConf Hyderabad 2026

March 14 to March 16, 2026
PYCONFHYD.ORG

DFW Pythoneers 2nd Saturday Teaching Meeting

March 14, 2026
MEETUP.COM

DjangoCologne

March 17, 2026
MEETUP.COM

PyCascades 2026

March 21 to March 23, 2026
PYCASCADES.COM

PythonAsia 2026

March 21 to March 24, 2026
PYTHONASIA.ORG


Happy Pythoning!
This was PyCoder’s Weekly Issue #725.
View in Browser »

alt

[ Subscribe to 🐍 PyCoder’s Weekly 💌 – Get the best Python news, articles, and tutorials delivered to your inbox once a week >> Click here to learn more ]

March 10, 2026 07:30 PM UTC


Real Python

Working With APIs in Python: Reading Public Data

Python is an excellent choice for working with Application Programming Interfaces (APIs), allowing you to efficiently consume and interact with them. By using the Requests library, you can easily fetch data from APIs that communicate using HTTP, such as REST, SOAP, or GraphQL APIs. This video course covers the essentials of consuming REST APIs with Python, including authentication and handling responses.

By the end of this video course, you’ll understand that:

Knowing how to consume an API is one of those magical skills that, once mastered, will crack open a whole new world of possibilities, and consuming APIs using Python is a great way to learn such a skill.

By the end of this video course, you’ll be able to use Python to consume most of the APIs that you come across. If you’re a developer, then knowing how to consume APIs with Python will empower you to integrate data from various online sources into your applications.


[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short & sweet Python Trick delivered to your inbox every couple of days. >> Click here to learn more and see examples ]

March 10, 2026 02:00 PM UTC