<strong>Topics covered in this episode:</strong><br>
<ul>
<li><strong><a href="https://starlette.dev/release-notes/#100rc1-february-23-2026">Starlette 1.0.0</a></strong></li>
<li><strong><a href="https://astral.sh/blog/openai?featured_on=pythonbytes">Astral to join OpenAI</a></strong></li>
<li><strong>uv audit</strong></li>
<li><strong><a href="https://mkennedy.codes/posts/fire-and-forget-or-never-with-python-s-asyncio/?featured_on=pythonbytes">Fire and forget (or never) with Python’s asyncio</a></strong></li>
<li><strong>Extras</strong></li>
<li><strong>Joke</strong></li>
</ul><a href='https://www.youtube.com/watch?v=k8BJzKSMwvQ' style='font-weight: bold;'data-umami-event="Livestream-Past" data-umami-event-episode="474">Watch on YouTube</a><br>
<p><strong>About the show</strong></p>
<p>Sponsored by us! Support our work through:</p>
<ul>
<li>Our <a href="https://training.talkpython.fm/?featured_on=pythonbytes"><strong>courses at Talk Python Training</strong></a></li>
<li><a href="https://courses.pythontest.com/p/the-complete-pytest-course?featured_on=pythonbytes"><strong>The Complete pytest Course</strong></a></li>
<li><a href="https://www.patreon.com/pythonbytes"><strong>Patreon Supporters</strong></a>
<strong>Connect with the hosts</strong></li>
<li>Michael: <a href="https://fosstodon.org/@mkennedy">@
[email protected]</a> / <a href="https://bsky.app/profile/mkennedy.codes?featured_on=pythonbytes">@mkennedy.codes</a> (bsky)</li>
<li>Brian: <a href="https://fosstodon.org/@brianokken">@
[email protected]</a> / <a href="https://bsky.app/profile/brianokken.bsky.social?featured_on=pythonbytes">@brianokken.bsky.social</a></li>
<li>Show: <a href="https://fosstodon.org/@pythonbytes">@
[email protected]</a> / <a href="https://bsky.app/profile/pythonbytes.fm">@pythonbytes.fm</a> (bsky)
Join us on YouTube at <a href="https://pythonbytes.fm/stream/live"><strong>pythonbytes.fm/live</strong></a> to be part of the audience. Usually <strong>Monday</strong> at 11am PT. Older video versions available there too.
Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to <a href="https://pythonbytes.fm/friends-of-the-show">our friends of the show list</a>, we'll never share it.</li>
</ul>
<p><strong>Brian #1: <a href="https://starlette.dev/release-notes/#100rc1-february-23-2026">Starlette 1.0.0</a></strong></p>
<ul>
<li>As a reminder, Starlette is the foundation for FastAPI</li>
<li><a href="https://marcelotryle.com/blog/2026/03/22/starlette-10-is-here/?featured_on=pythonbytes">Starlette 1.0 is here!</a> - fun blog post from Marcello Trylesinski</li>
<li>“The changes in 1.0 were limited to removing old deprecated code that had been on the way out for years, along with a few bug fixes. From now on we'll follow SemVer strictly.”</li>
<li>Fun comment in the “What’s next?” section:
<ul>
<li>“Oh, and Sebastián, Starlette is now out of your way to release FastAPI 1.0. 😉”</li>
</ul></li>
<li>Related: <a href="https://simonwillison.net/2026/Mar/22/starlette/?featured_on=pythonbytes">Experimenting with Starlette 1.0 with Claude skills</a>
<ul>
<li>Simon Willison</li>
<li>example of the new lifespan mechanism, very pytest fixture-like
<div class="codehilite">
<pre><span></span><code><span class="nd">@contextlib</span><span class="o">.</span><span class="n">asynccontextmanager</span>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">lifespan</span><span class="p">(</span><span class="n">app</span><span class="p">):</span>
<span class="k">async</span> <span class="k">with</span> <span class="n">some_async_resource</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Run at startup!"</span><span class="p">)</span>
<span class="k">yield</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Run on shutdown!"</span><span class="p">)</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Starlette</span><span class="p">(</span>
<span class="n">routes</span><span class="o">=</span><span class="n">routes</span><span class="p">,</span>
<span class="n">lifespan</span><span class="o">=</span><span class="n">lifespan</span>
<span class="p">)</span>
</code></pre>
</div></li>
</ul></li>
</ul>
<p><strong>Michael #2: <a href="https://astral.sh/blog/openai?featured_on=pythonbytes">Astral to join OpenAI</a></strong></p>
<ul>
<li>via John Hagen, thanks</li>
<li>Astral has agreed to join <a href="https://openai.com/?featured_on=pythonbytes"><strong>OpenAI</strong></a> as part of the <a href="https://chatgpt.com/codex?featured_on=pythonbytes"><strong>Codex</strong></a> team</li>
<li>Congrats Charlie and team</li>
<li>Seems like <a href="https://github.com/astral-sh/ruff?featured_on=pythonbytes">**Ruff</a>** and <a href="https://github.com/astral-sh/uv?featured_on=pythonbytes"><strong>uv</a></strong> play an important roll.</li>
<li>Perhaps <a href="https://github.com/astral-sh/ty?featured_on=pythonbytes"><strong>ty</strong></a> holds the most value to directly boost Codex (understanding codebases for the AI)</li>
<li>All that said, these were open source so there is way more to the motivations than just using the tools.</li>
<li>After joining the Codex team, we'll continue building our open source tools.</li>
<li><a href="https://simonwillison.net/2026/Mar/19/openai-acquiring-astral/?featured_on=pythonbytes">Simon Willison has thoughts</a></li>
<li><a href="http://discuss.python.org?featured_on=pythonbytes">d</a><a href="https://discuss.python.org/t/openai-to-acquire-astral/106605?featured_on=pythonbytes">iscuss.python.org also has thoughts</a></li>
<li>The <a href="https://arstechnica.com/ai/2026/03/openai-is-acquiring-open-source-python-tool-maker-astral/?featured_on=pythonbytes">Ars Technica article</a> has interesting comments too</li>
<li>It’s probably the death <a href="https://astral.sh/pyx?featured_on=pythonbytes">pyx</a>
<ul>
<li>Simon points out “pyx is notably absent from both the Astral and OpenAI announcement posts.”</li>
</ul></li>
</ul>
<p><strong>Brian #3: uv audit</strong></p>
<ul>
<li>Submitted by Owen Lemont</li>
<li>Pieces of <code>uv audit</code> have been trickling in. <a href="https://github.com/astral-sh/uv/releases?featured_on=pythonbytes">uv 0.10.12 exposes it to the cli help</a></li>
<li>Here’s the <a href="https://github.com/astral-sh/uv/issues/18506?featured_on=pythonbytes">roadmap for uv audit</a></li>
<li>I tried it out on a package and found a security issue with a dependency
<ul>
<li>not of the project, but of the testing dependencies</li>
<li>but only if using Python < 3.10, even though I’m using 3.14</li>
</ul></li>
<li>Kinda cool</li>
<li>Looks like it generates a uv.lock file, which includes dependencies for all project supported versions of Python and systems, which is a very thorough way to check for vulnerabilities.</li>
<li>But also, maybe some pointers on how to fix the problem would be good. No <code>--fix</code> yet.</li>
</ul>
<p><strong>Michael #4: <a href="https://mkennedy.codes/posts/fire-and-forget-or-never-with-python-s-asyncio/?featured_on=pythonbytes">Fire and forget (or never) with Python’s asyncio</a></strong></p>
<ul>
<li>Python’s <code>asyncio.create_task()</code> can silently garbage collect your fire-and-forget tasks starting in Python 3.12</li>
<li>Formerly fine async code can now stop working, so heads up</li>
<li>The fix? Use a set to upgrade to a strong ref and a callback to remove it</li>
<li>Is there a chance of task-based memory leaks? Yeah, maybe.</li>
</ul>
<p><strong>Extras</strong></p>
<p>Brian:</p>
<ul>
<li><a href="https://terriblesoftware.org/2026/03/03/nobody-gets-promoted-for-simplicity/?featured_on=pythonbytes">Nobody Gets Promoted for Simplicity</a> - interesting read and unfortunate truth in too many places.</li>
<li><a href="https://github.com/okken/pytest-check?featured_on=pythonbytes">pytest-check</a> - All built-in check helper functions in this list also accept an optional <code>xfail</code> reason.
<ul>
<li>example: <code>check.equal(actual, expected, xfail="known issue #123")</code></li>
<li>Allows some checks to still cause a failure to happen because you no longer have to mark the whole test as xfail
Michael:</li>
</ul></li>
<li><a href="https://x.com/rachpradhan/status/2034191434182738096?featured_on=pythonbytes">TurboAPI</a> - FastAPI + Pydantic compatible framework in Zig (see <a href="https://x.com/rachpradhan/status/2035928730242371716?featured_on=pythonbytes">follow up</a>)</li>
<li><a href="https://docs.pylonsproject.org/projects/pyramid/en/2.1-branch/whatsnew-2.1.html?featured_on=pythonbytes">Pyramid 2.1</a> is out (yes really! :) first release in 3 years)</li>
<li><a href="https://vivaldi.com/blog/vivaldi-on-desktop-7-9/?featured_on=pythonbytes">Vivaldi 7.9 adds</a> minimalist hide mode.</li>
<li>Migrated <a href="http://pythonbytes.fm">pythonbytes.fm</a> and <a href="http://talkpython.fm?featured_on=pythonbytes">talkpython.fm</a> to <a href="https://mkennedy.codes/posts/raw-dc-the-orm-pattern-of-2026/?featured_on=pythonbytes">Raw+DC design pattern</a></li>
<li><a href="https://mkennedy.codes/posts/use-chameleon-templates-in-the-robyn-web-framework/?featured_on=pythonbytes">Robyn + Chameleon package</a></li>
</ul>
<p><strong>Joke: We now have <a href="https://translate.kagi.com?featured_on=pythonbytes">translation services</a></strong></p>