<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet Python</title>
	<link>http://planetpython.org/</link>
	<language>en</language>
	<description>Planet Python - http://planetpython.org/</description>

<item>
	<title>Core Dispatch: Core Dispatch #8</title>
	<guid>https://coredispatch.xyz/editions/8</guid>
	<link>https://coredispatch.xyz/editions/8</link>
	<description>&lt;p&gt;Welcome back to Core Dispatch! This edition covers July 5 through July 18, 2026.
Python 3.15.0 beta 4 landed today, July 18 (we just released
it at the EuroPython sprints!), with 3.13.15, 3.14.7 and the first 3.15
release candidate following on August 4.&lt;/p&gt;
&lt;p&gt;It&amp;#x27;s EuroPython week! Much of the core team has been gathered in one place for our annual
Language Summit (blog posts to come!) and the conference. Recordings aren&amp;#x27;t up just yet,
but as promised with the PyCon US talks, once they are, we&amp;#x27;ll pull talks and Language Summit
coverage from the team into a future edition.&lt;/p&gt;
&lt;p&gt;On the PEP front, discussion is lively: &lt;a href=&quot;https://peps.python.org/pep-0835/&quot;&gt;PEP 835&lt;/a&gt;
(shorthand syntax for &lt;code&gt;Annotated&lt;/code&gt; metadata) and &lt;a href=&quot;https://peps.python.org/pep-0836/&quot;&gt;PEP 836&lt;/a&gt;
(&amp;quot;JIT Go Brrr&amp;quot;) are both drawing dozens of new replies, and a few fresh PEPs — including
&lt;a href=&quot;https://peps.python.org/pep-0840/&quot;&gt;PEP 840&lt;/a&gt; on name resolution in class namespaces —
have joined the queue.&lt;/p&gt;
&lt;p&gt;Don&amp;#x27;t miss the &amp;quot;One More Thing&amp;quot; at the bottom of this edition. This one&amp;#x27;s a little sillier
(correction: more unhinged) than usual, but we think you&amp;#x27;ll enjoy it.&lt;/p&gt;
&lt;p&gt;As always, if you maintain a package or just like living on the edge, give the final
3.15 beta a spin and &lt;a href=&quot;https://github.com/python/cpython/issues&quot;&gt;file any issues&lt;/a&gt;
you find.&lt;/p&gt;
&lt;h3&gt;Upcoming Releases&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0790/&quot;&gt;Python 3.15.0 beta 4&lt;/a&gt; — Jul 18&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0719/&quot;&gt;Python 3.13.15&lt;/a&gt; — Aug 04&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0745/&quot;&gt;Python 3.14.7&lt;/a&gt; — Aug 04&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;PEP Updates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0797/&quot;&gt;PEP 797: Shared Object Proxies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0838/&quot;&gt;PEP 838: Adding &lt;code&gt;python-version&lt;/code&gt; to &lt;code&gt;pyvenv.cfg&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0840/&quot;&gt;PEP 840: Name Resolution in Class Namespaces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Steering Council Updates&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/2026-06-11-python-steering-council-meeting-summary/108096&quot;&gt;2026-06-11 Python Steering Council meeting summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Merged PRs&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/24180&quot;&gt;Add &lt;code&gt;next_network()&lt;/code&gt; to the &lt;code&gt;ipaddress&lt;/code&gt; module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/151671&quot;&gt;Normalize symlink targets in &lt;code&gt;tarfile.TarFile.gettarinfo()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/153260&quot;&gt;Add &lt;code&gt;tkinter.systray&lt;/code&gt; — system tray icon and notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/153255&quot;&gt;Add &lt;code&gt;tkinter.fontchooser&lt;/code&gt; — a font selection dialog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/150480&quot;&gt;Reject CR and LF in &lt;code&gt;email.utils.formataddr()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/153781&quot;&gt;Add a dataclass-like decorator for &lt;code&gt;ctypes&lt;/code&gt; structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/152483&quot;&gt;Stop exposing the internal mapping when comparing &lt;code&gt;MappingProxyType&lt;/code&gt; objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/153057&quot;&gt;Fix a data race compiling &lt;code&gt;string.Template&lt;/code&gt; patterns in free-threaded builds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/152646&quot;&gt;Make &lt;code&gt;tempfile.TemporaryFileWrapper&lt;/code&gt; public&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Discussion&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-835-shorthand-syntax-for-annotated-type-metadata/107814&quot;&gt;PEP 835: Shorthand Syntax for &lt;code&gt;Annotated&lt;/code&gt; Type Metadata&lt;/a&gt; — 🔥 36 new replies · 4.6k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-836-jit-go-brrr-the-path-to-a-supported-jit-compiler-for-cpython/108010&quot;&gt;PEP 836: JIT Go Brrr: The Path to a Supported JIT Compiler for CPython&lt;/a&gt; — 🔥 28 new replies · 3.9k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-840-name-resolution-in-class-namespaces/108166&quot;&gt;PEP 840: Name Resolution in Class Namespaces&lt;/a&gt; — 🆕 🔥 10 new replies · 496 views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-822-dedented-multiline-string-d-string/105519&quot;&gt;PEP 822: Dedented Multiline String (d-string)&lt;/a&gt; — 7 new replies · 7.6k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-832-virtual-environment-discovery/106998&quot;&gt;PEP 832: Virtual Environment Discovery&lt;/a&gt; — 6 new replies · 8.8k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-827-type-manipulation/106353&quot;&gt;PEP 827: Type Manipulation&lt;/a&gt; — 3 new replies · 8.4k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-718-subscriptable-functions/28457&quot;&gt;PEP 718: Subscriptable Functions&lt;/a&gt; — 3 new replies · 14.3k views&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Core Dev Musings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://snarky.ca/how-to-publish-to-pypi-using-github-actions-securely/&quot;&gt;How to publish to PyPI using GitHub Actions securely&lt;/a&gt; — By Brett Cannon&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hugovk.dev/blog/2026/security-line-goes-up/&quot;&gt;Security: line goes up&lt;/a&gt; — By Hugo van Kemenade&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hugovk.dev/blog/2026/fixing-dict/&quot;&gt;Fixing the dictionary with Python 3.14&lt;/a&gt; — By Hugo van Kemenade&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sethmlarson.dev/europython-2026-security-talk?utm_campaign=rss&quot;&gt;EuroPython 2026: Learning from the “not-so-secret” Python security cabal&lt;/a&gt; — By Seth Larson&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Upcoming CFPs &amp;amp; Conferences&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://euroscipy.org/&quot;&gt;EuroSciPy 2026&lt;/a&gt; — Jul 18&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pycon.am/&quot;&gt;PyData PyCon Armenia 2026&lt;/a&gt; — Jul 24&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythondeadlin.es&quot;&gt;PyOhio 2026&lt;/a&gt; — Jul 25&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://2026.ploneconf.org/&quot;&gt;📋 Plone Conference 2026 Deadline&lt;/a&gt; — Aug 01&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pycon.fr/2026/en/&quot;&gt;📋 PyCon France 2026 Deadline&lt;/a&gt; — Aug 01&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://2026.pycon.ie/&quot;&gt;📋 PyCon Ireland 2026 Deadline&lt;/a&gt; — Aug 01&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pybay.org/&quot;&gt;📋 PyBay 2026 Deadline&lt;/a&gt; — Aug 01&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pydata.org/global2026/&quot;&gt;📋 PyData Global 2026 Workshop Deadline&lt;/a&gt; — Aug 04&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;One More Thing&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;The Meowl is a part of life.&quot;&lt;/p&gt;— &lt;a href=&quot;https://freeradical.zone/@baconandcoconut/116923411822210932&quot;&gt;Ken Jin&lt;/a&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;We&amp;#x27;re just normal men&quot;&lt;/p&gt;— &lt;a href=&quot;https://mastodon.social/@hugovk/116924606602040582&quot;&gt;Łukasz Langa&lt;/a&gt;&lt;/blockquote&gt;
&lt;img src=&quot;https://coredispatch.xyz/images/dispatch-8-pablo.jpg&quot; alt=&quot;AI-generated glitch meme of Pablo Galindo Salgado presenting a surreal &quot; /&gt;Pablo during one of his &amp;quot;EuroPython 2026&amp;quot; talks, as hallucinated by AI.
&lt;h3&gt;Credits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/savannahostrowski&quot;&gt;Savannah Ostrowski&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hugovk&quot;&gt;Hugo van Kemenade&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Python Insider: Python 3.15.0 beta 4 is here!</title>
	<guid>https://blog.python.org/2026/07/python-3150-beta-4/</guid>
	<link>https://blog.python.org/2026/07/python-3150-beta-4/</link>
	<description>The final 3.15 beta is out!</description>
	<pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>PyPodcats: Episode 12: With Juanita Gomez</title>
	<guid>https://pypodcats.live/episodes/ep-12/</guid>
	<link>https://pypodcats.live/episodes/ep-12/</link>
	<description>Learn about Juanita Gomez, a Ph.D. candidate at UC Santa Cruz researching open source security. From developing the Spyder IDE to leading community efforts for Scientific Python and singing on stage at SciPy, Juanita shares her journey in open source.Learn about Juanita Gomez, a Ph.D. candidate at UC Santa Cruz researching open source security. From developing the Spyder IDE to leading community efforts for Scientific Python and singing on stage at SciPy, Juanita shares her journey in open source.&lt;p&gt;We interviewed Juanita Gomez.&lt;/p&gt;
&lt;p&gt;Juanita is a Ph.D. candidate in Computer Science at UC Santa Cruz, where her research focuses on improving the
security of scientific open source software in collaboration with the Open Source Program Office (OSPO) at UCSC.
She is a former developer of the Spyder IDE, and currently one of the community managers for the Scientific Python
project. She is also part of the organizing committee for the SciPy conference.&lt;/p&gt;
&lt;p&gt;In this episode, Juanita shares how a music YouTube channel led her to open source: the video editing skills she
picked up making covers helped her create friendlier documentation, tutorials, and videos for Spyder, which caught
the attention of the Scientific Python project founders. She talks about bridging her security research with her
passion for open source, and gives practical advice for maintainers who want to make their projects more secure,
from GitHub&amp;rsquo;s built-in security features to the OpenSSF Scorecard. She also opens up about imposter syndrome, being
doubly underrepresented as a woman and Latina in tech, and how surrounding herself with people who elevate her work
keeps her growing. And yes, there is singing: from auditioning for The X Factor in Colombia as a kid to performing
lightning talk songs with the SciPy 5 at the SciPy conference.&lt;/p&gt;
&lt;p&gt;Be sure to listen to the episode to learn all about Juanita&amp;rsquo;s inspiring story!&lt;/p&gt;
&lt;h2 id=&quot;topic-discussed&quot;&gt;Topic discussed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Introductions&lt;/li&gt;
&lt;li&gt;Getting to know Juanita&lt;/li&gt;
&lt;li&gt;How Juanita joined Spyder and made its documentation more friendly&lt;/li&gt;
&lt;li&gt;Reaching new audiences through YouTube tutorials and TikTok&lt;/li&gt;
&lt;li&gt;Joining the Scientific Python project as a community manager&lt;/li&gt;
&lt;li&gt;Her Ph.D. research on open source security at UC Santa Cruz&lt;/li&gt;
&lt;li&gt;Actionable security tips for maintainers: GitHub security features and the OpenSSF Scorecard&lt;/li&gt;
&lt;li&gt;AI and open source security&lt;/li&gt;
&lt;li&gt;Organizing the Scientific Python summits and the SciPy conference&lt;/li&gt;
&lt;li&gt;Imposter syndrome and being a woman and Latina in tech&lt;/li&gt;
&lt;li&gt;Juanita&amp;rsquo;s music journey, from The X Factor in Colombia to singing at SciPy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;links-from-the-show&quot;&gt;Links from the show&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scientific Python: &lt;a href=&quot;https://scientific-python.org/&quot; target=&quot;_blank&quot;&gt;https://scientific-python.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Spyder IDE: &lt;a href=&quot;https://www.spyder-ide.org/&quot; target=&quot;_blank&quot;&gt;https://www.spyder-ide.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenSSF Scorecard: &lt;a href=&quot;https://scorecard.dev/&quot; target=&quot;_blank&quot;&gt;https://scorecard.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Juanita&amp;rsquo;s website: &lt;a href=&quot;https://juanis2112.github.io/&quot; target=&quot;_blank&quot;&gt;https://juanis2112.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Juanita&amp;rsquo;s YouTube channel: &lt;a href=&quot;https://www.youtube.com/@juanitagomezr&quot; target=&quot;_blank&quot;&gt;https://www.youtube.com/@juanitagomezr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Spyder YouTube channel: &lt;a href=&quot;https://www.youtube.com/@SpyderIDE&quot; target=&quot;_blank&quot;&gt;https://www.youtube.com/@SpyderIDE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scientific Python TikTok: &lt;a href=&quot;https://www.tiktok.com/@scientific.python&quot; target=&quot;_blank&quot;&gt;https://www.tiktok.com/@scientific.python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scientific Python YouTube: &lt;a href=&quot;https://www.youtube.com/@scientific-python&quot; target=&quot;_blank&quot;&gt;https://www.youtube.com/@scientific-python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Fri, 17 Jul 2026 13:00:00 +0000</pubDate>
</item>
<item>
	<title>Tryton News: Release 1.0.0 of Relatorio</title>
	<guid>https://discuss.tryton.org/t/release-1-0-0-of-relatorio/9293</guid>
	<link>https://discuss.tryton.org/t/release-1-0-0-of-relatorio/9293</link>
	<description>&lt;p&gt;We are proud to announce the release of &lt;a href=&quot;https://pypi.org/project/relatorio/&quot;&gt;Relatorio&lt;/a&gt; version 1.0.0.&lt;/p&gt;
&lt;p&gt;Relatorio is a templating library for &lt;a href=&quot;http://opendocument.xml.org/&quot;&gt;OpenDocument &lt;/a&gt; using also OpenDocument as source format.&lt;/p&gt;
&lt;p&gt;In addition to bug-fixes, this release contains the following improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace python-magic dependency by puremagic&lt;/li&gt;
&lt;li&gt;Remove support for chart template&lt;/li&gt;
&lt;li&gt;Remove support for PDF&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The package is available at &lt;a href=&quot;https://pypi.org/project/relatorio/1.0.0/&quot; class=&quot;inline-onebox&quot;&gt;Client Challenge&lt;/a&gt;&lt;br /&gt;
The documentation is available at &lt;a href=&quot;https://docs.tryton.org/relatorio/1.0.0/&quot; class=&quot;inline-onebox&quot;&gt;Relatorio — A templating library able to output odt files&lt;/a&gt;&lt;/p&gt;
            &lt;p&gt;&lt;small&gt;1 post - 1 participant&lt;/small&gt;&lt;/p&gt;
            &lt;p&gt;&lt;a href=&quot;https://discuss.tryton.org/t/release-1-0-0-of-relatorio/9293&quot;&gt;Read full topic&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 16 Jul 2026 16:42:24 +0000</pubDate>
</item>
<item>
	<title>Tryton News: Release 1.0.0 of GooCalendar</title>
	<guid>https://discuss.tryton.org/t/release-1-0-0-of-goocalendar/9292</guid>
	<link>https://discuss.tryton.org/t/release-1-0-0-of-goocalendar/9292</link>
	<description>&lt;p&gt;We are proud to announce the release 1.0.0 of &lt;a href=&quot;https://pypi.org/project/GooCalendar/&quot;&gt;GooCalendar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;GooCalendar is a Python library that implements a calendar widget for &lt;a href=&quot;https://www.gtk.org/&quot;&gt;GTK+&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to bug-fixes, this release contains this following improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove GooCanvas dependency&lt;/li&gt;
&lt;li&gt;Remove support for Python older than 3.9&lt;/li&gt;
&lt;li&gt;Upgrade to pyproject&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GooCalendar is available on PyPI: &lt;a href=&quot;https://pypi.org/project/GooCalendar/1.0.0/&quot; class=&quot;inline-onebox&quot;&gt;GooCalendar · PyPI&lt;/a&gt;&lt;br /&gt;
The documentation is available at &lt;a href=&quot;https://docs.tryton.org/goocalendar/1.0.0/&quot; class=&quot;inline-onebox&quot;&gt;goocalendar — Calendar widget — A calendar widget for GTK&lt;/a&gt;&lt;/p&gt;
            &lt;p&gt;&lt;small&gt;1 post - 1 participant&lt;/small&gt;&lt;/p&gt;
            &lt;p&gt;&lt;a href=&quot;https://discuss.tryton.org/t/release-1-0-0-of-goocalendar/9292&quot;&gt;Read full topic&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 16 Jul 2026 16:25:29 +0000</pubDate>
</item>
<item>
	<title>Seth Michael Larson: EuroPython 2026: Learning from the “not-so-secret” Python security cabal</title>
	<guid>https://sethmlarson.dev/europython-2026-security-talk?utm_campaign=rss</guid>
	<link>https://sethmlarson.dev/europython-2026-security-talk?utm_campaign=rss</link>
	<description>&lt;p&gt;I delivered this talk at EuroPython 2026, I'll update this blog post once the
recording is available on &lt;a href=&quot;https://www.youtube.com/c/EuroPythonConference&quot;&gt;EuroPython's YouTube channel&lt;/a&gt;. Below are the slides
and full list of links and resources included. This talk is
a continuation of a talk I gave a year ago: “&lt;a href=&quot;https://www.youtube.com/watch?v=V9n2jmkeRf0&quot;&gt;Security Work isn’t Special&lt;/a&gt;”
as the keynote for OpenSSF Community Day NA where I lamented on how
security work didn't match other Open Source contribution models like
documentation, community, or code contributions.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;blockquote&gt;
  &lt;p&gt;My work as the Security Developer-in-Residence at the &lt;a href=&quot;https://www.python.org/psf-landing/&quot;&gt;Python Software Foundation&lt;/a&gt; is sponsored
  by &lt;a href=&quot;https://alpha-omega.dev/&quot;&gt;Alpha-Omega&lt;/a&gt;. Thanks to Alpha-Omega for supporting
  security in the Python ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Links and Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://speakerdeck.com/sethmlarson/learning-from-the-not-so-secret-python-security-cabal-europython-2026&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pyfound.blogspot.com&quot;&gt;Python Software Foundation Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.python.org&quot;&gt;Python Insider Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=V9n2jmkeRf0&quot;&gt;Security Work isn’t Special&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hugovk.dev/blog/2026/security-line-goes-up/&quot;&gt;Security Line Goes Up&lt;/a&gt; by Hugo van Kemenade&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sethmlarson.dev/feed&quot;&gt;Vulnerability Reports are not special anymore&lt;/a&gt; by Filippo Valsorda&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lkml.org/lkml/2026/5/17/896&quot;&gt;LLM generated vulnerabilities&lt;/a&gt; by Linus Torvalds&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devguide.python.org/security/policy/&quot;&gt;Python Security Policy and Threat Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devguide.python.org/security/psrt&quot;&gt;Python Security Response Team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0811/&quot;&gt;PEP 811 - Defining Python Security Response Team membership and responsibilities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;hr /&gt;&lt;p&gt;Thanks for reading ♥ I would love to hear your thoughts! Contact me via &lt;a href=&quot;https://mastodon.social/@sethmlarson&quot;&gt;Mastodon&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/sethmlarson.dev&quot;&gt;Bluesky&lt;/a&gt;, or &lt;a href=&quot;mailto:sethmichaellarson@gmail.com&quot;&gt;email&lt;/a&gt;. Browse the &lt;a href=&quot;https://sethmlarson.dev/&quot;&gt;blog archive&lt;/a&gt;. Check out my &lt;a href=&quot;https://sethmlarson.dev/blogroll&quot;&gt;blogroll&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Python Software Foundation: Affirm Your PSF Membership Voting Status</title>
	<guid>https://pyfound.blogspot.com/2026/07/affirm-PSF-voting-status-2026.html</guid>
	<link>https://pyfound.blogspot.com/2026/07/affirm-PSF-voting-status-2026.html</link>
	<description>&lt;p&gt;Every Python Software Foundation (PSF) voting-eligible Member (Supporting, Contributing, and Fellow) needs to affirm their membership to vote in this year’s PSF Board and Python Packaging Council (PPC) elections.&lt;/p&gt;&lt;p&gt;&lt;b&gt;If you wish to vote in either the PSF Board or Python Packaging Council elections, you must affirm your intention to vote for each election no later than Tuesday, August 25th, 2:00 pm UTC, to participate in this year’s elections. &lt;/b&gt;This year’s election votes begin Tuesday, September 1st, 2:00 pm UTC, and close on Tuesday, September 15th, 2:00 pm UTC.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Election communications from psfmember.org&lt;/h2&gt;&lt;p&gt;You should have received an email from &quot;psf@psfmember.org &amp;lt;Python Software Foundation&amp;gt;&quot; with the subject &quot;[Action Required] Affirm your PSF Membership voting intention for the 2026 PSF Board Election&quot; and/or “2026 Python Packaging Council Inaugural Election Information &amp;amp; Schedule” that contains information on how to affirm your voting status. If you were expecting to receive the email but have not (make sure to check your spam!), please email psf-elections@pyfound.org for the PSF Board election or pc-elections@python.org, and we’ll assist you. &lt;i&gt;Please note: If you opted out of emails related to your membership, you did not receive these emails.&amp;nbsp;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;PSF Members should review their communication preferences on psfmember.org if you would like to opt in or out of receiving emails about the PSF Board, PPC elections, or both. Here’s how:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Login to psfmember.org&lt;/li&gt;&lt;li&gt;Navigate to your “Profile” page&lt;/li&gt;&lt;li&gt;Click the “Name and Address” tab&lt;/li&gt;&lt;li&gt;Scroll down, designate your preferences&lt;/li&gt;&lt;li&gt;Click submit&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you had previously opted out of communications from the PSF through psfmember.org and would like to review or change your preference, we encourage you to update them using the instructions above. The PSF only sends a handful of election and fundraising related communications every year via psfmember.org. The PSF newsletter runs through a separate mailing list (and &lt;a href=&quot;https://www.python.org/psf/newsletter/&quot; target=&quot;_blank&quot;&gt;we welcome you to sign up&lt;/a&gt;!).&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;How to affirm your intention to vote&lt;/h2&gt;&lt;p&gt;You can affirm your voting intention by following the steps in &lt;a href=&quot;https://www.youtube.com/watch?v=lWfyvPqAAJs&quot; target=&quot;_blank&quot;&gt;our video tutorial&lt;/a&gt;:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Log in to psfmember.org&lt;/li&gt;&lt;li&gt;Choose “Your Memberships” page at the top right to check your eligibility to vote (You must be a Contributing, Supporting, or Fellow member)&lt;/li&gt;&lt;li&gt;Choose “Voting Affirmation” page at the top right&lt;/li&gt;&lt;li&gt;Select your preferred intention for voting in 2026 (which now includes a second affirmation regarding your intention to vote in the Python Packaging Council election)&lt;/li&gt;&lt;li&gt;Click the “Submit” button&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Need to check your membership status?&lt;/h2&gt;&lt;p&gt;Log on to psfmember.org and visit your &lt;a href=&quot;https://psfmember.org/user-information&quot; target=&quot;_blank&quot;&gt;PSF Member User Information page&lt;/a&gt; to see your membership record and status. If you are a voting-eligible member (active Supporting, Contributing, and Fellow members of the PSF) and do not already have a login, please &lt;a href=&quot;https://psfmember.org/wp-login.php?action=register&quot; target=&quot;_blank&quot;&gt;create an account on psfmember.org&lt;/a&gt; and then email psf-elections@pyfound.org so we can link your membership to your account. Please ensure you have an account linked to your membership so that we can have the most up-to-date contact information for you in the future.&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;PSF Bylaws&lt;/h2&gt;&lt;p&gt;Section 4.2 of the &lt;a href=&quot;https://www.python.org/psf/bylaws/&quot; target=&quot;_blank&quot;&gt;PSF Bylaws&lt;/a&gt; requires that “Members of any membership class with voting rights must affirm each year to the corporation in writing that such member intends to be a voting member for such year.”&lt;/p&gt;&lt;p&gt;Our motivation is to ensure that our elections can meet quorum as required by Section 3.9 of our bylaws. As our membership has grown, we have seen that an increasing number of Contributing and Fellow members with indefinite membership do not engage with our annual election, making quorum difficult to reach.&amp;nbsp;&lt;/p&gt;&lt;p&gt;An election that does not reach quorum is invalid. This would cause the whole voting process to be re-held, resulting in fewer voters and an undue amount of effort on the part of the PSF Staff.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Reminders about membership and voting&lt;/h2&gt;&lt;p&gt;Reminder: If you were formerly a Managing member, your membership type was changed last year to Contributing per 2024’s &lt;a href=&quot;https://github.com/psf/bylaws/compare/a35a6071de181adbb7a160d5d1447e7b0272359c...359cbc540f2f6bf00bc46b9dbe3e00a950612c27&quot; target=&quot;_blank&quot;&gt;Bylaw change that merged Managing and Contributing memberships&lt;/a&gt;.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Per another recent Bylaw change that allows for &lt;a href=&quot;https://github.com/python/psf-bylaws/compare/a35a6071de181adbb7a160d5d1447e7b0272359c...6bac449&quot; target=&quot;_blank&quot;&gt;simplifying the voter affirmation process by treating past voting activity as intent to continue voting&lt;/a&gt;, if you voted last year, you will automatically be added to the 2026 voter roll. &lt;i&gt;Please note: If you removed or changed your email on psfmember.org, you may not automatically be added to this year's voter roll.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;What happens next?&lt;/h2&gt;&lt;p&gt;You’ll get an email from OpaVote with a ballot (or two!) on or right before September 1st, and then you can vote!&lt;/p&gt;&lt;p&gt;Check out our &lt;a href=&quot;https://www.python.org/psf/membership/&quot; target=&quot;_blank&quot;&gt;PSF Membership page&lt;/a&gt; to learn more. If you have questions about membership, nominations, or this year’s Board election, please email psf-elections@pyfound.org or join the &lt;a href=&quot;https://discord.gg/4Hm36PPgpG&quot; target=&quot;_blank&quot;&gt;PSF Discord&lt;/a&gt; for the &lt;a href=&quot;https://pyfound.blogspot.com/2025/10/a-new-psf-board-another-year-of-psf.html&quot; target=&quot;_blank&quot;&gt;upcoming Board Office Hours&lt;/a&gt; on August 11th, 9 PM UTC. You are also welcome to &lt;a href=&quot;https://discuss.python.org/t/2026-psf-board-election/107797&quot; target=&quot;_blank&quot;&gt;join the discussion about the PSF Board election on the Python Discuss forum&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 15 Jul 2026 11:06:17 +0000</pubDate>
</item>
<item>
	<title>Django Weblog: Supporting the Triptych Project</title>
	<guid>https://www.djangoproject.com/weblog/2026/jul/15/supporting-the-triptych-project/</guid>
	<link>https://www.djangoproject.com/weblog/2026/jul/15/supporting-the-triptych-project/</link>
	<description>&lt;p&gt;The Django Steering Council — in its role as the DSF's arm for technical
governance — has provided a Letter of Collaboration in support of a funding
application by Carson Gross and Alex Petros to advance the &lt;a href=&quot;https://triptychproject.org&quot;&gt;Triptych
Project&lt;/a&gt;: three proposals to make HTML itself more
expressive, in every browser, by default.&lt;/p&gt;
&lt;p&gt;Here's why, and how you can help.&lt;/p&gt;
&lt;h2 id=&quot;s-html-over-the-wire-and-django&quot;&gt;HTML over the wire, and Django&lt;/h2&gt;
&lt;p&gt;The last few years have seen a move back towards serving multipage
applications, with server-rendered templates. The &lt;a href=&quot;https://htmx.org&quot;&gt;HTMX&lt;/a&gt;
library has probably had the biggest impact in the Django space, but
&lt;a href=&quot;https://unpoly.com&quot;&gt;Unpoly&lt;/a&gt;, &lt;a href=&quot;https://turbo.hotwired.dev&quot;&gt;Turbo&lt;/a&gt;, and others
are part of the same story: send HTML over the wire, let the browser do what
browsers do, and skip the client-side application layer where you don't really
need it. It's a simpler model of the web — and it's one that speaks to Django's
heart.&lt;/p&gt;
&lt;p&gt;This isn't a movement Django has watched from the sidelines. Template partials,
added in Django 6.0, were directly inspired by the patterns these libraries
make natural.&lt;/p&gt;
&lt;h2 id=&quot;s-the-triptych-project&quot;&gt;The Triptych Project&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://triptychproject.org&quot;&gt;The Triptych Project&lt;/a&gt; takes the core insights from
HTMX (and the related libraries) and proposes them for the HTML standard
itself. Three small additions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PUT, PATCH, and DELETE methods for forms&lt;/strong&gt; — completing HTML's HTTP vocabulary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Button actions&lt;/strong&gt; — buttons that make HTTP requests without a wrapping form. This is the current focus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial page replacement&lt;/strong&gt; — links, forms, and buttons that target part of the DOM.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Together these aim to make it possible to build far more of the web with plain HTML — no JavaScript dependency, no library, nothing to ship or maintain.&lt;/p&gt;
&lt;h2 id=&quot;s-button-actions&quot;&gt;Button actions&lt;/h2&gt;
&lt;p&gt;The current proposal (&lt;a href=&quot;https://github.com/whatwg/html/issues/12330&quot;&gt;WHATWG #12330&lt;/a&gt;, &lt;a href=&quot;https://triptychproject.org/proposals/button-actions&quot;&gt;full proposal&lt;/a&gt;) adds the &lt;code&gt;action&lt;/code&gt; and &lt;code&gt;method&lt;/code&gt; attributes to &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;. The canonical example is logout. Today there's no semantic way to write a logout button; you have to wrap it in a form:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;form action=/logout method=POST&amp;gt;
  &amp;lt;button&amp;gt;Logout&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every Django developer has written this kind of thing. With
button actions we could write the simpler single line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button action=/logout method=POST&amp;gt;Logout&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This isn't abstract for us. The Django admin's submit row holds multiple
buttons, and a link disguised as a button:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;submit-row&quot;&amp;gt;
  &amp;lt;input type=&quot;submit&quot; value=&quot;Save&quot; class=&quot;default&quot; name=&quot;_save&quot;&amp;gt;
  &amp;lt;input type=&quot;submit&quot; value=&quot;Save and add another&quot; name=&quot;_addanother&quot;&amp;gt;
  &amp;lt;input type=&quot;submit&quot; value=&quot;Save and continue editing&quot; name=&quot;_continue&quot;&amp;gt;
  &amp;lt;a href=&quot;/admin/auth/user/.../delete/&quot; class=&quot;deletelink&quot;&amp;gt;Delete&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, all the save inputs lead to the same action URL from the wrapping form.
The view then branches on the submitted name value. That, of course, works, but
we can imagine simpler, more flexible ideas being enabled via the &lt;a href=&quot;https://triptychproject.org/proposals/button-actions#multi-action-
pages&quot;&gt;Multi-Action
Pages
examples&lt;/a&gt; in the proposal.&lt;/p&gt;
&lt;p&gt;The disguised submit link leads to the deletion confirmation page, where we
then submit a form to confirm the action. That's the &lt;em&gt;correct&lt;/em&gt; behaviour, but
the markup confuses the intent: this isn't (really) a navigation to a new page,
it's the first step of an action — deleting the object. The proposal's
discussion of &lt;a href=&quot;https://triptychproject.org/proposals/button-actions#buttons-vs-links&quot;&gt;Buttons vs
Links&lt;/a&gt;
describes situations we come up against writing applications regularly.&lt;/p&gt;
&lt;p&gt;The goal here is simpler patterns that will help us write better markup.&lt;/p&gt;
&lt;h2 id=&quot;s-why-were-supporting-this&quot;&gt;Why we're supporting this&lt;/h2&gt;
&lt;p&gt;The Django Software Foundation's mission includes a commitment to &lt;a href=&quot;https://www.djangoproject.com/foundation/&quot;&gt;&quot;advance the
state of the art in Web development&quot;&lt;/a&gt;. Standards work is
that in its purest form: an improvement to HTML lands for everyone, in every
framework, in every browser, indefinitely.&lt;/p&gt;
&lt;p&gt;It's also slow, painstaking work — specification, implementer engagement, web
platform tests — that needs sustained attention. Carson and Alex are applying
for funds so that people can devote real time to it. Our Letter of
Collaboration is a concrete contribution to that application.&lt;/p&gt;
&lt;h2 id=&quot;s-how-you-can-help&quot;&gt;How you can help&lt;/h2&gt;
&lt;p&gt;If your company builds on Django, or indeed any other framework — with HTMX,
Unpoly, Turbo, or plain HTML forms — this work benefits you directly. Carson
and Alex are seeking non-binding letters of support on official letterhead for
the funding application. Details and contacts are on the &lt;a href=&quot;https://triptychproject.org&quot;&gt;Triptych Project site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Individually, do &lt;a href=&quot;https://triptychproject.org&quot;&gt;read the proposals&lt;/a&gt;, weigh in constructively on the &lt;a href=&quot;https://github.com/whatwg/html/issues/12330&quot;&gt;WHATWG
issues&lt;/a&gt;, and spread the word.&lt;/p&gt;
&lt;p&gt;A simpler web is a better web. We're glad to support work that moves HTML in
that direction.&lt;/p&gt;</description>
	<pubDate>Wed, 15 Jul 2026 11:00:20 +0000</pubDate>
</item>
<item>
	<title>PyCoder’s Weekly: Issue #743: Stacks &amp;amp; Queues, Django F-Expressions, MCP Clients, and More (2026-07-14)</title>
	<guid>https://pycoders.com/issues/743</guid>
	<link>https://pycoders.com/issues/743</link>
	<description>&lt;p&gt; &lt;span&gt;#743 – JULY 14, 2026&lt;/span&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/issues/743/feed&quot;&gt;View in Browser »&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://pycoders.com&quot;&gt;&lt;img alt=&quot;The PyCoder&amp;rsquo;s Weekly Logo&quot; src=&quot;https://cdn.pycoders.com/37bdf31dc645f968ffb90196e5d38ff5&quot; /&gt;&lt;/a&gt;&lt;/p&gt; &lt;hr /&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16758/feed&quot; target=&quot;_blank&quot;&gt;Stacks and Queues in Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This post shows you how to use a Python list for stack operations (last-in, first-out) and a &lt;code&gt;deque&lt;/code&gt; from the collections module for queue operations (first-in, first-out).&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16758/feed&quot; target=&quot;_blank&quot;&gt;TREY HUNNER&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16750/feed&quot; target=&quot;_blank&quot;&gt;Nifty Django Feature: F Expressions&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Django&amp;rsquo;s F-Expression provides a way of querying fields from the ORM. They&amp;rsquo;re particularly handy to traverse relationships in more complex queries.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16750/feed&quot; target=&quot;_blank&quot;&gt;TIM SCHILLING&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16768/feed&quot; target=&quot;_blank&quot;&gt;Secure Your Code, Wherever, or However You Write It&lt;/a&gt;&lt;/h3&gt; &lt;a href=&quot;https://pycoders.com/link/16768/feed&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://cdn.pycoders.com/0fafca54f5a6be369b399de6d2919c7b&quot; alt=&quot;alt&quot; /&gt;&lt;/a&gt; &lt;p&gt; AI coding agents have blind spots, they reproduce patterns but struggle with security context. AURI by Endor Labs plugs into your editor via MCP, catching flaws, signaling exposed secrets, and spotting malicious dependencies. Ship secure by default. &lt;a href=&quot;https://pycoders.com/link/16768/feed&quot; target=&quot;_blank&quot;&gt;Try AURI Free →&lt;/a&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16768/feed&quot; target=&quot;_blank&quot;&gt;ENDOR LABS&lt;/a&gt;&lt;/span&gt; &lt;span&gt;sponsor&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16744/feed&quot; target=&quot;_blank&quot;&gt;Testing MCP Servers With a Python MCP Client&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Learn how to build a Python MCP client that tests MCP servers from your terminal. List their tools, prompts, and resources, then call each one.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16744/feed&quot; target=&quot;_blank&quot;&gt;REAL PYTHON&lt;/a&gt;&lt;/span&gt; &lt;span&gt;course&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16741/feed&quot; target=&quot;_blank&quot;&gt;Quiz: Testing MCP Servers With a Python MCP Client&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16741/feed&quot; target=&quot;_blank&quot;&gt;REAL PYTHON&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16751/feed&quot; target=&quot;_blank&quot;&gt;PEP 797: Shared Object Proxies (Rejected)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16751/feed&quot; target=&quot;_blank&quot;&gt;PYTHON.ORG&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16747/feed&quot; target=&quot;_blank&quot;&gt;Django Security Releases Issued: 6.0.7 and 5.2.16&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16747/feed&quot; target=&quot;_blank&quot;&gt;DJANGO SOFTWARE FOUNDATION&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;h2&gt;Articles &amp;amp; Tutorials&lt;/h2&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16759/feed&quot; target=&quot;_blank&quot;&gt;Constructing and Judging Modern Agentic Workflows&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; How can you improve your LLM agent systems through specification enrichment? What are the advantages of having an LLM act as a judge within an agent system? This week on the show, Senior IEEE Member and Quality Engineer Suneet Malhotra joins us to discuss building and evaluating agentic architecture.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16759/feed&quot; target=&quot;_blank&quot;&gt;REAL PYTHON&lt;/a&gt;&lt;/span&gt; &lt;span&gt;podcast&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16765/feed&quot; target=&quot;_blank&quot;&gt;What &lt;code&gt;for x in y&lt;/code&gt; Hides From You&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; An explanation of how Python’s &lt;code&gt;for x in y&lt;/code&gt; syntax is a thin wrapper around the iterator protocol: &lt;code&gt;iter(...)&lt;/code&gt;, &lt;code&gt;next(...)&lt;/code&gt;, and &lt;code&gt;StopIteration&lt;/code&gt;. Using examples from Memphis, a Python interpreter written in Rust, it shows how this design makes lists, ranges, and generators feel unified rather than magical.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16765/feed&quot; target=&quot;_blank&quot;&gt;TYLER GREEN&lt;/a&gt; • Shared by Tyler Green&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16767/feed&quot; target=&quot;_blank&quot;&gt;Stop stitching 5 different systems together for your agents.&lt;/a&gt;&lt;/h3&gt; &lt;a href=&quot;https://pycoders.com/link/16767/feed&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://cdn.pycoders.com/5be1f986dec8f247515673d049711de2&quot; alt=&quot;alt&quot; /&gt;&lt;/a&gt; &lt;p&gt; Dev teams spend weeks fitting together vector DBs, graph DBs, relational stores, filesystem primitives and optimizing cache. How about everything via a single API? P90 sub-200ms recall - the fastest graph database to unlock true agent memory, knowledge graphs and user-personalization. &lt;a href=&quot;https://pycoders.com/link/16767/feed&quot; target=&quot;_blank&quot;&gt;Click Here to Try HydraDB Out for Free&lt;/a&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16767/feed&quot; target=&quot;_blank&quot;&gt;HYDRADB&lt;/a&gt;&lt;/span&gt; &lt;span&gt;sponsor&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16748/feed&quot; target=&quot;_blank&quot;&gt;Building a Fast HTML Toolkit in C for Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;code&gt;turbohtml&lt;/code&gt; began as a patch to speed up &lt;code&gt;html.escape&lt;/code&gt; and &lt;code&gt;html.unescape&lt;/code&gt; in CPython. When the core team declined to maintain SIMD in the standard library, it became a third party library instead. This post is its story.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16748/feed&quot; target=&quot;_blank&quot;&gt;BERNÁT GÁBOR&lt;/a&gt; • Shared by Bernát Gábor&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16757/feed&quot; target=&quot;_blank&quot;&gt;How to Publish to PyPI Using GitHub Actions Securely&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; If you&amp;rsquo;re using GitHub Actions to publish your Python libraries, this article is for you. Learn what are the best practices to ensure the process is secure and what tools you can use to validate it.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16757/feed&quot; target=&quot;_blank&quot;&gt;BRETT CANNON&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16738/feed&quot; target=&quot;_blank&quot;&gt;Python 3.15&amp;rsquo;s Ultra-Low Overhead Interpreter Profiling Mode&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Ken is one of the key contributors to the experimental JIT. This post talks about how Python 3.15’s interpreter profiling mode is helping them figure out what is working with the JIT and what isn&amp;rsquo;t.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16738/feed&quot; target=&quot;_blank&quot;&gt;KEN JIN&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16766/feed&quot; target=&quot;_blank&quot;&gt;PEP 814: Add Frozendict Built-in Type&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Victor has been involved in multiple attempts to add a frozen dict type to Python. His latest PEP has been accepted and frozen dictionaries will be added to Python 3.15. This post is his story.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16766/feed&quot; target=&quot;_blank&quot;&gt;VICTOR STINNER&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16753/feed&quot; target=&quot;_blank&quot;&gt;How to Clean Messy CSV Files With Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This introductory article shows you how to do data cleaning on CSV files using pandas, including dealing with duplicate rows, missing values, mixed date formats, and more.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16753/feed&quot; target=&quot;_blank&quot;&gt;ABID ALI AWAN,&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16739/feed&quot; target=&quot;_blank&quot;&gt;PSF News: Security, Elections, and PyCon US 2026&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This post is the monthly news round up of all things PSF. It covers a re-cap of PyCon US, several security fixes, updates from the PSF board, and more.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16739/feed&quot; target=&quot;_blank&quot;&gt;PYTHON SOFTWARE FOUNDATION&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16743/feed&quot; target=&quot;_blank&quot;&gt;How to Use GitHub&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Learn how to use GitHub step by step to create a remote repository, push your local Python project, and collaborate with others using GitHub Issues.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16743/feed&quot; target=&quot;_blank&quot;&gt;REAL PYTHON&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16742/feed&quot; target=&quot;_blank&quot;&gt;Quiz: How to Use GitHub&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16742/feed&quot; target=&quot;_blank&quot;&gt;REAL PYTHON&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;h2&gt;Projects &amp;amp; Code&lt;/h2&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16754/feed&quot; target=&quot;_blank&quot;&gt;pyStrich: 1D and 2D Barcode Generator Library&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16754/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/MMULQUEEN&lt;/a&gt; • Shared by Michael Mulqueen&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16749/feed&quot; target=&quot;_blank&quot;&gt;Snakie: Cross-Platform MicroPython IDE&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16749/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/KEVINMCALEER&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16756/feed&quot; target=&quot;_blank&quot;&gt;Notion2Pandas: Import Notion Databases Into pandas&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; GitLab.com&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16756/feed&quot; target=&quot;_blank&quot;&gt;GITLAB.COM/JAEGER87&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16740/feed&quot; target=&quot;_blank&quot;&gt;envgap: Find Gaps Between &lt;code&gt;.env&lt;/code&gt;, Shell Env, and Python Code&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16740/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/PINAK-DATTA&lt;/a&gt; • Shared by &lt;a href=&quot;https://pycoders.com/link/16762/feed&quot; target=&quot;_blank&quot;&gt;Pinak Datta&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16745/feed&quot; target=&quot;_blank&quot;&gt;CLI-based Text-to-Speech Tool&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16745/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/REALPACIFIC&lt;/a&gt; • Shared by &lt;a href=&quot;https://pycoders.com/link/16755/feed&quot; target=&quot;_blank&quot;&gt;Prashant Barahi&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;h2&gt;Events&lt;/h2&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16760/feed&quot; target=&quot;_blank&quot;&gt;Weekly Real Python Office Hours Q&amp;amp;A (Virtual)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; July 15, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16760/feed&quot; target=&quot;_blank&quot;&gt;REALPYTHON.COM&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16763/feed&quot; target=&quot;_blank&quot;&gt;PyData Bristol Meetup&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; July 16, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16763/feed&quot; target=&quot;_blank&quot;&gt;MEETUP.COM&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16764/feed&quot; target=&quot;_blank&quot;&gt;PyLadies Dublin&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; July 16, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16764/feed&quot; target=&quot;_blank&quot;&gt;PYLADIES.COM&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16761/feed&quot; target=&quot;_blank&quot;&gt;DjangoGirls Tamale 2026&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; July 17 to July 19, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16761/feed&quot; target=&quot;_blank&quot;&gt;DJANGOGIRLS.ORG&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16752/feed&quot; target=&quot;_blank&quot;&gt;EuroSciPy 2026&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; July 18 to July 24, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16752/feed&quot; target=&quot;_blank&quot;&gt;EUROSCIPY.ORG&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16746/feed&quot; target=&quot;_blank&quot;&gt;PyData PyCon Armenia 2026&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; July 24 to July 26, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16746/feed&quot; target=&quot;_blank&quot;&gt;PYCON.AM&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;hr /&gt; &lt;p&gt;Happy Pythoning!&lt;br /&gt;This was PyCoder&amp;rsquo;s Weekly Issue #743.&lt;br /&gt;&lt;a href=&quot;https://pycoders.com/issues/743/feed&quot;&gt;View in Browser »&lt;/a&gt;&lt;/p&gt; &lt;img src=&quot;https://pycoders.com/issues/743/open/feed&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;alt&quot; /&gt; 
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Subscribe to 🐍 PyCoder&amp;rsquo;s Weekly 💌 – Get the best Python news, articles, and tutorials delivered to your inbox once a week &lt;a href=&quot;https://pycoders.com/?utm_source=pycoders&amp;utm_medium=feed&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 14 Jul 2026 19:30:00 +0000</pubDate>
</item>
<item>
	<title>Peter Bengtsson: How to use a list/tuple/array in Django with a raw SQL cursor</title>
	<guid>http://www.peterbe.com/plog/how-to-use-a-listtuplearray-in-django-with-a-raw-sql-cursor</guid>
	<link>http://www.peterbe.com/plog/how-to-use-a-listtuplearray-in-django-with-a-raw-sql-cursor</link>
	<description>&lt;p&gt;This does &lt;strong&gt;&lt;em&gt;not&lt;/em&gt;&lt;/strong&gt; work:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs&quot;&gt;
&lt;span class=&quot;hljs-keyword&quot;&gt;from&lt;/span&gt; django.db &lt;span class=&quot;hljs-keyword&quot;&gt;import&lt;/span&gt; connection

list_of_values = [&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;3&lt;/span&gt;]
&lt;span class=&quot;hljs-keyword&quot;&gt;with&lt;/span&gt; connection.cursor() &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; cursor:
    cursor.execute(&lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
        SELECT *
        FROM my_model_table
        WHERE some_value IN %s
    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;, [
        &lt;span class=&quot;hljs-built_in&quot;&gt;tuple&lt;/span&gt;(list_of_values),
    ])
    results = cursor.fetchall()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It will give you:&lt;/p&gt;
&lt;pre&gt;django.db.utils.ProgrammingError: syntax error at or near &amp;quot;&amp;#x27;(1,2,3)&amp;#x27;&amp;quot;
LINE 4:         WHERE id IN &amp;#x27;(1,2,3)&amp;#x27;&lt;/pre&gt;

&lt;p&gt;It &lt;em&gt;used&lt;/em&gt; to work with &lt;code&gt;psycopg&lt;/code&gt; v2. Now, in psycopg v3, you have to use the &lt;code&gt;ANY&lt;/code&gt; operator. See &lt;a href=&quot;https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#you-cannot-use-in-s-with-a-tuple&quot;&gt;&quot;You cannot use IN %s with a tuple&quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This &lt;em&gt;will&lt;/em&gt; work:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs&quot;&gt;
&lt;span class=&quot;hljs-keyword&quot;&gt;from&lt;/span&gt; django.db &lt;span class=&quot;hljs-keyword&quot;&gt;import&lt;/span&gt; connection

list_of_values = [&lt;span class=&quot;hljs-number&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;hljs-number&quot;&gt;3&lt;/span&gt;]
&lt;span class=&quot;hljs-keyword&quot;&gt;with&lt;/span&gt; connection.cursor() &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; cursor:
    cursor.execute(
        &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;&amp;quot;&amp;quot;
        SELECT *
        FROM my_model_table
        WHERE some_value = ANY(%s)
    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;,
        [
            list_of_values,
        ],
    )
    results = cursor.fetchall()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note the &lt;code&gt;ANY(%s)&lt;/code&gt;, and instead of a list that has a tuple, it's a list that has a list.&lt;/p&gt;
&lt;h4 id=&quot;what-about-a-list-of-strings&quot;&gt;&lt;a class=&quot;toclink&quot; href=&quot;https://www.peterbe.com/oc-Python/rss.xml#what-about-a-list-of-strings&quot;&gt;What About a List of Strings&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Consider...&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs&quot;&gt;
from django.db import connection

&lt;span class=&quot;hljs-deletion&quot;&gt;-list_of_values = [1, 2, 3]&lt;/span&gt;
&lt;span class=&quot;hljs-addition&quot;&gt;+list_of_values = [&amp;#x27;foo&amp;#x27;, &amp;#x27;bar&amp;#x27;, &amp;#x27;fiz&amp;#x27;]&lt;/span&gt;
with connection.cursor() as cursor:
    cursor.execute(
        &amp;quot;&amp;quot;&amp;quot;
        SELECT *
        FROM my_model_table
        WHERE some_value = ANY(%s)
    &amp;quot;&amp;quot;&amp;quot;,
        [
            list_of_values,
        ],
    )
    results = cursor.fetchall()
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That will result in:&lt;/p&gt;
&lt;pre&gt;django.db.utils.DataError: invalid input syntax for type integer: &amp;quot;foo&amp;quot;
LINE 4:         WHERE some_value = ANY(&amp;#x27;{foo,bar,fiz}&amp;#x27;)&lt;/pre&gt;

&lt;p&gt;My solution was to rewrite the SQL string itself and treat each value as a parameter each. In other words, the SQL string, before being sent to &lt;code&gt;cursor.execute(...)&lt;/code&gt; will contain something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs&quot;&gt;
&lt;span class=&quot;hljs-keyword&quot;&gt;AND&lt;/span&gt; (
  some_value &lt;span class=&quot;hljs-operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hljs-operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;OR&lt;/span&gt;
  some_value &lt;span class=&quot;hljs-operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hljs-operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;OR&lt;/span&gt;
  some_value &lt;span class=&quot;hljs-operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hljs-operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;OR&lt;/span&gt;
  some_value &lt;span class=&quot;hljs-operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hljs-operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;OR&lt;/span&gt;
  &lt;span class=&quot;hljs-comment&quot;&gt;-- ...etc...&lt;/span&gt;
  some_value &lt;span class=&quot;hljs-operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;hljs-operator&quot;&gt;%&lt;/span&gt;
)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will work and is safe:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs&quot;&gt;
&lt;span class=&quot;hljs-keyword&quot;&gt;from&lt;/span&gt; django.db &lt;span class=&quot;hljs-keyword&quot;&gt;import&lt;/span&gt; connection

list_of_values = [&lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;, &lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;fiz&amp;quot;&lt;/span&gt;]
&lt;span class=&quot;hljs-keyword&quot;&gt;with&lt;/span&gt; connection.cursor() &lt;span class=&quot;hljs-keyword&quot;&gt;as&lt;/span&gt; cursor:
    cursor.execute(
        &lt;span class=&quot;hljs-string&quot;&gt;f&amp;quot;&amp;quot;&amp;quot;
        SELECT *
        FROM my_model_table
        WHERE (&lt;span class=&quot;hljs-subst&quot;&gt;{&lt;span class=&quot;hljs-string&quot;&gt;&amp;quot; OR &amp;quot;&lt;/span&gt;.join([&lt;span class=&quot;hljs-string&quot;&gt;&amp;quot;some_value = %s&amp;quot;&lt;/span&gt; &lt;span class=&quot;hljs-keyword&quot;&gt;for&lt;/span&gt; _ &lt;span class=&quot;hljs-keyword&quot;&gt;in&lt;/span&gt; list_of_values])}&lt;/span&gt;)
    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;,
        list_of_values,
    )
    results = cursor.fetchall()
&lt;/code&gt;&lt;/pre&gt;</description>
	<pubDate>Tue, 14 Jul 2026 13:14:40 +0000</pubDate>
</item>
<item>
	<title>Mike Driscoll: Python 101 3rd Edition Kickstarter Launch</title>
	<guid>https://blog.pythonlibrary.org/2026/07/14/python-101-3rd-edition-kickstarter-launch/</guid>
	<link>https://blog.pythonlibrary.org/2026/07/14/python-101-3rd-edition-kickstarter-launch/</link>
	<description>&lt;h4&gt;Learn Python with a Book Designed for Beginners&lt;/h4&gt;
&lt;p&gt;Hello! I&amp;#8217;m Michael Driscoll, and I&amp;#8217;m excited to announce the third edition of &lt;a href=&quot;https://www.kickstarter.com/projects/driscollis/python-101-3rd-edition&quot;&gt;&lt;strong&gt;Python 101&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-12815&quot; src=&quot;https://blog.pythonlibrary.org/wp-content/uploads/2026/07/py101_kick_3rd.png&quot; alt=&quot;&quot; width=&quot;715&quot; height=&quot;398&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For years, &lt;i&gt;Python 101&lt;/i&gt; has helped readers take their first steps into programming. Whether you&amp;#8217;re a complete beginner, a student, or someone looking to learn Python for work or personal projects, the goal has always been the same: make learning Python approachable, practical, and enjoyable.&lt;/p&gt;
&lt;p&gt;Python has continued to evolve, and it&amp;#8217;s time for the book to evolve with it. This &lt;a href=&quot;https://www.kickstarter.com/projects/driscollis/python-101-3rd-edition&quot;&gt;Kickstarter&lt;/a&gt; will help fund the writing, editing, production, and publication of the fully updated third edition.&lt;/p&gt;
&lt;h3&gt;Why a Third Edition?&lt;/h3&gt;
&lt;p&gt;Python has changed significantly since the previous edition. New language features, updated best practices, and improvements throughout the ecosystem make this the right time for a comprehensive update.&lt;/p&gt;
&lt;p&gt;The third edition will include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated examples compatible with modern versions of Python&lt;/li&gt;
&lt;li&gt;New coverage of current Python features and best practices&lt;/li&gt;
&lt;li&gt;Improved code samples and exercises (when applicable)&lt;/li&gt;
&lt;li&gt;Corrections and refinements based on reader feedback&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal isn&amp;#8217;t simply to revise the previous edition—it&amp;#8217;s to create the best beginner-focused version of &lt;i&gt;Python 101&lt;/i&gt; yet.&lt;/p&gt;
&lt;h3&gt;Who Is This Book For?&lt;/h3&gt;
&lt;p&gt;This book is designed for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Complete beginners with no programming experience&lt;/li&gt;
&lt;li&gt;Students learning Python&lt;/li&gt;
&lt;li&gt;Self-taught developers&lt;/li&gt;
&lt;li&gt;Professionals transitioning into software development&lt;/li&gt;
&lt;li&gt;Anyone looking for a clear, practical introduction to Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No prior programming knowledge is required.&lt;/p&gt;
&lt;h3&gt;Why Kickstarter?&lt;/h3&gt;
&lt;p&gt;Kickstarter allows readers to directly support the creation of the book while helping ensure it receives the time and attention needed for a high-quality release.&lt;/p&gt;
&lt;p&gt;Funding will help cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing&lt;/li&gt;
&lt;li&gt;Ebook production&lt;/li&gt;
&lt;li&gt;Print preparation&lt;/li&gt;
&lt;li&gt;Kickstarter fulfillment and shipping materials&lt;/li&gt;
&lt;li&gt;Any cover refinements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most importantly, it allows me to focus on creating the strongest edition possible.&lt;/p&gt;
&lt;h3&gt;Rewards&lt;/h3&gt;
&lt;p&gt;Depending on your pledge level, rewards may include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DRM-free PDF edition&lt;/li&gt;
&lt;li&gt;EPUB and Kindle editions&lt;/li&gt;
&lt;li&gt;Printed paperback&lt;/li&gt;
&lt;li&gt;Signed copies&lt;/li&gt;
&lt;li&gt;Early access to chapters during development&lt;/li&gt;
&lt;li&gt;Exclusive Kickstarter updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Project updates will be shared throughout the process so backers can follow the book&amp;#8217;s progress.&lt;/p&gt;
&lt;h3&gt;Thank You&lt;/h3&gt;
&lt;p&gt;Whether you back this project or simply share it with others, your support means a great deal.&lt;/p&gt;
&lt;p&gt;Writing technical books is a collaborative effort between authors and readers. Your encouragement has helped make previous editions successful, and I&amp;#8217;m excited to bring an updated &lt;i&gt;Python 101&lt;/i&gt; to the next generation of Python learners.&lt;/p&gt;
&lt;p&gt;Thank you for helping make the third edition possible.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.kickstarter.com/projects/driscollis/python-101-3rd-edition&quot;&gt;Back the project&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The post &lt;a href=&quot;https://blog.pythonlibrary.org/2026/07/14/python-101-3rd-edition-kickstarter-launch/&quot;&gt;Python 101 3rd Edition Kickstarter Launch&lt;/a&gt; appeared first on &lt;a href=&quot;https://blog.pythonlibrary.org&quot;&gt;Mouse Vs Python&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Tue, 14 Jul 2026 13:05:15 +0000</pubDate>
</item>
<item>
	<title>PyPodcats: Trailer: Episode 12 With Juanita Gomez</title>
	<guid>https://pypodcats.live/episodes/ep-12-trailer/</guid>
	<link>https://pypodcats.live/episodes/ep-12-trailer/</link>
	<description>A preview of our chat with Juanita Gomez. Watch the full episode on July 17, 2026A preview of our chat with Juanita Gomez. Watch the full episode on July 17, 2026&lt;p&gt;Sneak Peek of our chat with Juanita Gomez, hosted by Cheuk Ting Ho and Mariatta Wijaya.&lt;/p&gt;
&lt;p&gt;Juanita is a Ph.D. candidate in Computer Science at UC Santa Cruz, where her research focuses on improving the
security of scientific open source software. She is a former developer of the Spyder IDE, one of the community
managers for the Scientific Python project, and part of the organizing committee for the SciPy conference.&lt;/p&gt;
&lt;p&gt;In this episode, Juanita shares how she went from making music videos on YouTube to creating friendlier documentation
for Spyder, her research on open source security, practical security tips for maintainers, and her journey navigating
imposter syndrome as a woman and Latina in tech. Plus: The X Factor, Shakira, and singing on stage at SciPy.&lt;/p&gt;
&lt;p&gt;Full episode is coming on &lt;strong&gt;July 17th, 2026&lt;/strong&gt;! Subscribe to our podcast now!&lt;/p&gt;</description>
	<pubDate>Tue, 14 Jul 2026 13:00:00 +0000</pubDate>
</item>
<item>
	<title>Python Bytes: #488 tau - it's 2pi and it writes code</title>
	<guid>https://pythonbytes.fm/episodes/show/488/tau-its-2pi-and-it-writes-code</guid>
	<link>https://pythonbytes.fm/episodes/show/488/tau-its-2pi-and-it-writes-code</link>
	<description>&amp;lt;strong&amp;gt;Topics covered in this episode:&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;ul&amp;gt;
	&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;The trusted-publishing debate: how to do it right vs. why you shouldn't trust it&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&quot;https://link.mail.beehiiv.com/ss/c/u001.nhis-D9RLtwtIum5I0BjhZ22Z4E_bpBKQN-16RenQ3ws2TZPhzEfwjZMSGiGAQx3p407RO5QUnbYLEGjQnorGAGD5oCA5TGTjsy6RbCrTYDXJN8BUDTRz-W0ZLYlAKrwzGPByECjf7lwVCl3nZRCGXvvhp8TvBLNfJRgnY-wJ9ktogLFr2YqqQyXhwmgzpa-6HsPhylQ_9BWTK3teRtSwrRXrLfxrVWwQXEG6Zbqaz5nRGc6xNV7pMdWvEGpfoBMUwbGl0aGZ40ZX_cYbR-sgKDJdl0v95gGqtcySNXfNgokF54k8Xao40CrloFhcFtX/4s6/5odqdEikSeKZEjId8lTcSg/h29/h001.6m_9ZXKKfEi-Sx1OcsN8EInQX8eEjhrHaS4h_Yo0T7o?featured_on=pythonbytes&quot;&amp;gt;JupyterLab 4.6 and Notebook 7.6 are out!&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&quot;https://twotimespi.dev/?featured_on=pythonbytes&quot;&amp;gt;Tau&amp;lt;/a&amp;gt;  – new small, readable terminal coding agent&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href=&quot;https://docs.djangoproject.com/en/6.0/topics/tasks/?featured_on=pythonbytes&quot;&amp;gt;Django Tasks and Django 6.1&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Extras&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Joke&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;

&amp;lt;/ul&amp;gt;&amp;lt;a href='https://www.youtube.com/watch?v=lJpOzcVTlho' style='font-weight: bold;'data-umami-event=&quot;Livestream-Past&quot; data-umami-event-episode=&quot;488&quot;&amp;gt;Watch on YouTube&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;About the show&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Sponsored by us! Support our work through:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Our &amp;lt;a href=&quot;https://training.talkpython.fm/?featured_on=pythonbytes&quot;&amp;gt;&amp;lt;strong&amp;gt;courses at Talk Python&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Consulting from &amp;lt;a href=&quot;https://sixfeetup.com/?featured_on=pythonbytes&quot;&amp;gt;&amp;lt;strong&amp;gt;Six Feet Up&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Connect with the hosts&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Michael: &amp;lt;a href=&quot;https://fosstodon.org/@mkennedy&quot;&amp;gt;Mastodon&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://bsky.app/profile/mkennedy.codes?featured_on=pythonbytes&quot;&amp;gt;BlueSky&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://x.com/mkennedy?featured_on=pythonbytes&quot;&amp;gt;X&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://www.linkedin.com/in/mkennedy/?featured_on=pythonbytes&quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Calvin: &amp;lt;a href=&quot;https://sixfeetup.social/@calvin?featured_on=pythonbytes&quot;&amp;gt;Mastodon&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://bsky.app/profile/calvinhp.com?featured_on=pythonbytes&quot;&amp;gt;BlueSky&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://x.com/calvinhp?featured_on=pythonbytes&quot;&amp;gt;X&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://www.linkedin.com/in/calvinhp/?featured_on=pythonbytes&quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Show: &amp;lt;a href=&quot;https://fosstodon.org/@pythonbytes&quot;&amp;gt;Mastodon&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://bsky.app/profile/pythonbytes.fm&quot;&amp;gt;BlueSky&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://x.com/PythonBytes?featured_on=pythonbytes&quot;&amp;gt;X&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;Join us on YouTube at &amp;lt;a href=&quot;https://pythonbytes.fm/stream/live&quot;&amp;gt;&amp;lt;strong&amp;gt;pythonbytes.fm/live&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt; to be part of the audience. Usually &amp;lt;strong&amp;gt;Tuesday at 7am PT&amp;lt;/strong&amp;gt;. Older video versions available there too.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;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 &amp;lt;a href=&quot;https://pythonbytes.fm/friends-of-the-show&quot;&amp;gt;our friends of the show list&amp;lt;/a&amp;gt;, we'll never share it.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Calvin #1:&amp;lt;/strong&amp;gt; The trusted-publishing debate: how to do it right vs. why you shouldn't trust it&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;https://snarky.ca/how-to-publish-to-pypi-using-github-actions-securely/ (Brett Cannon) and https://blog.yossarian.net/2026/07/07/You-shouldnt-trust-trusted-publishing (W&amp;lt;strong&amp;gt;illiam Woodruff&amp;lt;/strong&amp;gt;)&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Trusted Publishing (PyPI's OIDC-based auth scheme, also now used by npm, RubyGems, &amp;lt;a href=&quot;http://crates.io?featured_on=pythonbytes&quot;&amp;gt;crates.io&amp;lt;/a&amp;gt;, NuGet) replaces long-lived API tokens with short-lived, auto-scoped credentials tied to CI/CD machine identity.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Yossarian's post: it's purely an &amp;lt;em&amp;gt;authentication&amp;lt;/em&amp;gt; mechanism between a machine identity and a package — it says nothing about package safety or quality. PyPI deliberately avoids any &quot;verified/trusted&quot; badge for it, unlike its verified-URL checkmarks.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Same logic applies to PyPI attestations: anyone can sign with any machine identity they control, so an attestation's presence isn't itself a trust signal.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Bottom line from that post: don't confuse &quot;trusted&quot; (machine-to-machine) with &quot;trustworthy&quot; (human judgment about the package).&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;http://Snarky.ca?featured_on=pythonbytes&quot;&amp;gt;Snarky.ca&amp;lt;/a&amp;gt;'s companion piece is more practical: given GitHub Actions compromises in the news, the real fix is 3 concrete steps — run zizmor to lock down workflow permissions/checkout credentials and pin actions to commit hashes, adopt Trusted Publishing to eliminate stored PyPI tokens, and require manual approval via a GitHub environment before any publish job runs.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Takeaway for listeners: Trusted Publishing is good hygiene for &amp;lt;em&amp;gt;how&amp;lt;/em&amp;gt; you authenticate to PyPI, but it's not a substitute for securing your CI pipeline itself — or for actually vetting the packages you install.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Michael #2: &amp;lt;a href=&quot;https://link.mail.beehiiv.com/ss/c/u001.nhis-D9RLtwtIum5I0BjhZ22Z4E_bpBKQN-16RenQ3ws2TZPhzEfwjZMSGiGAQx3p407RO5QUnbYLEGjQnorGAGD5oCA5TGTjsy6RbCrTYDXJN8BUDTRz-W0ZLYlAKrwzGPByECjf7lwVCl3nZRCGXvvhp8TvBLNfJRgnY-wJ9ktogLFr2YqqQyXhwmgzpa-6HsPhylQ_9BWTK3teRtSwrRXrLfxrVWwQXEG6Zbqaz5nRGc6xNV7pMdWvEGpfoBMUwbGl0aGZ40ZX_cYbR-sgKDJdl0v95gGqtcySNXfNgokF54k8Xao40CrloFhcFtX/4s6/5odqdEikSeKZEjId8lTcSg/h29/h001.6m_9ZXKKfEi-Sx1OcsN8EInQX8eEjhrHaS4h_Yo0T7o?featured_on=pythonbytes&quot;&amp;gt;JupyterLab 4.6 and Notebook 7.6 are out!&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Michał Krassowski's rundown - a chunky minor release: 68 features, 97 bug fixes, 95 contributors, one of the biggest ever.&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Scratchpad console&amp;lt;/strong&amp;gt; (Notebook 7.6 headliner) - a console next to your notebook sharing its kernel, for throwaway experiments. Ctrl+B.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Jump to last-edited cell&amp;lt;/strong&amp;gt; - new commands hop through recently edited cells.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;File browser glow-up&amp;lt;/strong&amp;gt; - Date Created column, editable breadcrumbs with Tab-completion, and Open in Terminal.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Debugger&amp;lt;/strong&amp;gt; - sources open in the main area, floating step/continue overlay, live kernel-sources filter.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Custom layouts (Lab)&amp;lt;/strong&amp;gt; - activity bar top/bottom, draggable panels, four-way tab splits, per-panel Ctrl+scroll zoom.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;~5x faster extension builds&amp;lt;/strong&amp;gt; - webpack → Rspack, and &amp;lt;code&amp;gt;jupyter-builder&amp;lt;/code&amp;gt; means no full Lab install needed to build extensions.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Keyboard/a11y&amp;lt;/strong&amp;gt; - add shortcuts from the UI (no JSON), Find &amp;amp;amp; Replace in Edit menu (Ctrl+H).&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Calvin #3: &amp;lt;a href=&quot;https://twotimespi.dev/?featured_on=pythonbytes&quot;&amp;gt;Tau&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt; – new small, readable terminal coding agent&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Tau&amp;lt;/strong&amp;gt; – new small, readable terminal coding agent (Python 3.12+), built as both a working tool and a teaching project for how coding agents work under the hood&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Install via &amp;lt;code&amp;gt;uv tool install tau-ai&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pipx&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt;; ships a &amp;lt;code&amp;gt;tau&amp;lt;/code&amp;gt; CLI&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Three-layer architecture: &amp;lt;code&amp;gt;tau_ai&amp;lt;/code&amp;gt; (provider-neutral model layer) → &amp;lt;code&amp;gt;tau_agent&amp;lt;/code&amp;gt; (reusable &quot;brain&quot;: messages, tools, events, loop) → &amp;lt;code&amp;gt;tau_coding&amp;lt;/code&amp;gt; (CLI/TUI, file &amp;amp;amp; shell tools, sessions)&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Supports OpenAI, Anthropic, OpenAI Codex, OpenRouter, Hugging Face, and custom/local OpenAI-compatible endpoints&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Built-in tools (read/write/edit/bash), durable JSONL sessions with resume/branching, project instructions via &amp;lt;code&amp;gt;AGENTS.md&amp;lt;/code&amp;gt;, and context compaction&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Core harness is UI-agnostic — same brain can power the TUI, print mode, or a custom frontend — usable as a standalone library too&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Michael #4: &amp;lt;a href=&quot;https://docs.djangoproject.com/en/6.0/topics/tasks/?featured_on=pythonbytes&quot;&amp;gt;Django Tasks and Django 6.1&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Django 6.0 finally ships first-party background tasks&amp;lt;/strong&amp;gt; (&amp;lt;code&amp;gt;django.tasks&amp;lt;/code&amp;gt;) - out of Jake Howard's DEP 14, accepted May 2024, after two decades of everyone bolting on Celery/RQ/Huey.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;It's an API, not a worker.&amp;lt;/strong&amp;gt; Django handles task definition, validation, queuing, and result storage - it does not execute them. You bring the backend.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;The default backend traps people.&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;ImmediateBackend&amp;lt;/code&amp;gt; runs tasks inline on the request thread and blocks until done - so out of the box &amp;lt;code&amp;gt;.enqueue()&amp;lt;/code&amp;gt; backgrounds nothing (a 5-second task means a 5-second response). The other built-in, &amp;lt;code&amp;gt;DummyBackend&amp;lt;/code&amp;gt;, runs nothing at all. Both are dev/test only.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Nice API otherwise:&amp;lt;/strong&amp;gt; slap &amp;lt;code&amp;gt;@task&amp;lt;/code&amp;gt; on a function, call &amp;lt;code&amp;gt;.enqueue()&amp;lt;/code&amp;gt;, get back a &amp;lt;code&amp;gt;TaskResult&amp;lt;/code&amp;gt; you look up later by id - with async twins like &amp;lt;code&amp;gt;aenqueue()&amp;lt;/code&amp;gt;. Gotcha: args and return values must survive a JSON round-trip, so a tuple sneakily comes back as a list.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;The community local backend to know: &amp;lt;code&amp;gt;django-tasks-local&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt; by Chris Beaven (SmileyChris). A &amp;lt;code&amp;gt;ThreadPoolExecutor&amp;lt;/code&amp;gt; backend that gives real background threads with zero infrastructure - no Redis, no Celery, no database - plus a &amp;lt;code&amp;gt;ProcessPoolBackend&amp;lt;/code&amp;gt; for CPU-bound work → &amp;lt;a href=&quot;http://github.com/lincolnloop/django-tasks-local?featured_on=pythonbytes&quot;&amp;gt;github.com/lincolnloop/django-tasks-local&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Its catch:&amp;lt;/strong&amp;gt; results live in memory, so pending tasks vanish on restart or deploy. Great for dev and low-traffic production; for persistence, drop to Jake Howard's &amp;lt;code&amp;gt;django-tasks&amp;lt;/code&amp;gt; (DatabaseBackend + worker command).&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Extras&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Calvin:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://hugovk.dev/blog/2026/fixing-dict/?featured_on=pythonbytes&quot;&amp;gt;Fixing the dictionary with Python 3.14&amp;lt;/a&amp;gt; —  Hugo van Kemenade stumbled on - and got fixed - a markup bug in the OED's own citation of a 1706 use of the pi symbol.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;Michael:&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://bunny.net/blog/were-making-bunny-dns-free/?featured_on=pythonbytes&quot;&amp;gt;Bunny DNS is now free&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Jokes:&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;What's the object-oriented way to become wealthy?&amp;lt;/strong&amp;gt; Inheritance&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;To understand what recursion is...&amp;lt;/strong&amp;gt; You must first understand what recursion is&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;3 SQL statements walk into a NoSQL bar.&amp;lt;/strong&amp;gt; Soon, they walk out They couldn't find a table.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;</description>
	<pubDate>Tue, 14 Jul 2026 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Django Weblog: Explore the DjangoCon US 2026 Speaker Lineup and Reserve Your Spot</title>
	<guid>https://www.djangoproject.com/weblog/2026/jul/13/explore-the-djangocon-us-2026-speaker-lineup-and-r/</guid>
	<link>https://www.djangoproject.com/weblog/2026/jul/13/explore-the-djangocon-us-2026-speaker-lineup-and-r/</link>
	<description>&lt;p&gt;&lt;a href=&quot;https://2026.djangocon.us&quot;&gt;DjangoCon US 2026&lt;/a&gt; is just around the corner, and now is the perfect time to start planning your conference experience.&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;https://2026.djangocon.us/news/announcing-lineup/&quot;&gt;speaker lineup is now available&lt;/a&gt;, featuring talks from Django contributors, maintainers, educators, and community members covering everything from web development and APIs to deployment, security, testing, AI, and the future of the Django ecosystem.&lt;/p&gt;
&lt;p&gt;Whether you're attending your first DjangoCon US or returning to reconnect with friends and colleagues, you'll find opportunities to learn, share ideas, and meet people from across the global Django community.&lt;/p&gt;
&lt;p&gt;Beyond the talks, your conference registration includes access to tutorials, Open Spaces, community sprints, hallway conversations, and social events that make DjangoCon US a unique experience.&lt;/p&gt;
&lt;p&gt;If you haven't registered yet, there's still time to join us in Chicago, August 24–28.&lt;/p&gt;
&lt;p&gt;Register for DjangoCon US 2026: &lt;a href=&quot;https://2026.djangocon.us&quot;&gt;https://2026.djangocon.us&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Browse the speaker lineup: &lt;a href=&quot;https://2026.djangocon.us/news/announcing-lineup/&quot;&gt;https://2026.djangocon.us/news/announcing-lineup/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We'll be sharing more updates in the coming weeks, including the full conference schedule, travel reminders, and everything you need to make the most of your time at DjangoCon US.&lt;/p&gt;
&lt;p&gt;We look forward to seeing you in Chicago this August!&lt;/p&gt;</description>
	<pubDate>Mon, 13 Jul 2026 22:51:23 +0000</pubDate>
</item>
<item>
	<title>Hugo van Kemenade: Security: line goes up</title>
	<guid>https://hugovk.dev/blog/2026/security-line-goes-up/</guid>
	<link>https://hugovk.dev/blog/2026/security-line-goes-up/</link>
	<description>&lt;p&gt;Like many other projects, CPython is experiencing a huge increase in security reports.&lt;/p&gt;
&lt;h2 id=&quot;cves-per-year&quot; class=&quot;relative group&quot;&gt;CVEs per year &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#cves-per-year&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Last month, PSF Security Developer-in-Residence &lt;a href=&quot;https://sethmlarson.dev/&quot;&gt;Seth Larson&lt;/a&gt;
posted a chart of
&lt;a href=&quot;https://mastodon.social/@sethmlarson/116680835974208152&quot;&gt;CVEs per year&lt;/a&gt;, showing a
large increase in 2026:&lt;/p&gt;
&lt;p&gt;






 
 








 
 
 
 
 
 
 
 
 &lt;img width=&quot;1257&quot; height=&quot;705&quot; class=&quot;mx-auto my-0 rounded-md&quot; alt=&quot;2007-2024 all below 20 per year. 2025 and year-to-date 2026 had just over 20, with 2026 extrapolated to around 65.&quot; src=&quot;https://hugovk.dev/blog/2026/security-line-goes-up/cves-per-year_hu_2601403f38fe525a.png&quot; /&gt;
 
 



&lt;/p&gt;
&lt;p&gt;But this only represents the &lt;em&gt;output&lt;/em&gt; of security work, and doesn&amp;rsquo;t show all the work
dealing with incoming reports. Many are closed and dealt with as non-security bug
reports instead; many are closed as neither security nor bug reports.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s reveal some of this unseen work by the
&lt;a href=&quot;https://devguide.python.org/security/psrt/&quot;&gt;Python Security Response Team&lt;/a&gt; (PSRT).&lt;/p&gt;
&lt;h2 id=&quot;ghsas-by-month&quot; class=&quot;relative group&quot;&gt;GHSAs by month &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#ghsas-by-month&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Here are the number of incoming GitHub Security Advisories (GHSA) reports created since
July 2024:&lt;/p&gt;
&lt;p&gt;






 
 








 
 
 
 
 
 
 
 
 &lt;img width=&quot;2100&quot; height=&quot;900&quot; class=&quot;mx-auto my-0 rounded-md&quot; alt=&quot;Chart of new security reports. Single digits or zero per month from 2024, increasing to around 40 in 2026.&quot; src=&quot;https://hugovk.dev/blog/2026/security-line-goes-up/ghsas-by-month_hu_e0223ff9b32735ff.png&quot; /&gt;
 
 



&lt;/p&gt;
&lt;h2 id=&quot;ghsas-by-year&quot; class=&quot;relative group&quot;&gt;GHSAs by year &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#ghsas-by-year&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Here is the same thing by year, and remembering we&amp;rsquo;re only &lt;em&gt;halfway through 2026&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;






 
 








 
 
 
 
 
 
 
 
 &lt;img width=&quot;2100&quot; height=&quot;900&quot; class=&quot;mx-auto my-0 rounded-md&quot; alt=&quot;18 in 2024, 41 in 2025, 175 so far in 2026.&quot; src=&quot;https://hugovk.dev/blog/2026/security-line-goes-up/ghsas-by-year_hu_fa7a5184a8320d7e.png&quot; /&gt;
 
 



&lt;/p&gt;
&lt;h2 id=&quot;email-reports-by-month&quot; class=&quot;relative group&quot;&gt;Email reports by month &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#email-reports-by-month&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;We&amp;rsquo;ve only fairly recently been
&lt;a href=&quot;https://devguide.python.org/security/policy/&quot;&gt;encouraging new reports&lt;/a&gt; be made via
GHSA. Before this, they were usually made by email. The next chart is the number of
email discussions (or threads) and participants by month:&lt;/p&gt;
&lt;p&gt;






 
 








 
 
 
 
 
 
 
 
 &lt;img width=&quot;2100&quot; height=&quot;900&quot; class=&quot;mx-auto my-0 rounded-md&quot; alt=&quot;Number of discussions and participants per month follow each other closely. Single digits from 2014, around 20 by 2019, 40 by 2021 and 2022, a dip to 15 for 2023 to 2025, up to 50 for 2026 so far.&quot; src=&quot;https://hugovk.dev/blog/2026/security-line-goes-up/email_hu_f73ebb8b42dcf9fe.png&quot; /&gt;
 
 



&lt;/p&gt;
&lt;h2 id=&quot;thanks&quot; class=&quot;relative group&quot;&gt;Thanks &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#thanks&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Big thanks to Seth for all his work as Security Developer-in-Residence: helping shepherd
all these reports, developing a
&lt;a href=&quot;https://devguide.python.org/security/policy/&quot;&gt;security policy&lt;/a&gt; to improve the quality
of incoming reports and help us assess them, and defining PSRT membership and
responsibilities via &lt;a href=&quot;https://peps.python.org/pep-0811/&quot;&gt;PEP 811&lt;/a&gt; to build an active
team. All this would be much harder without his guidance! And thanks to
&lt;a href=&quot;https://alpha-omega.dev/&quot;&gt;Alpha-Omega&lt;/a&gt; for sponsoring his position at the PSF.&lt;/p&gt;</description>
	<pubDate>Mon, 13 Jul 2026 20:44:50 +0000</pubDate>
</item>
<item>
	<title>Talk Python to Me: #555: Marimo Pair - A Canvas for Agent + Developers Collaboration</title>
	<guid>https://talkpython.fm/episodes/show/555/marimo-pair-a-canvas-for-agent-developers-collaboration</guid>
	<link>https://talkpython.fm/episodes/show/555/marimo-pair-a-canvas-for-agent-developers-collaboration</link>
	<description>Coding agents have gotten really good at one kind of work. You scope a feature, edit some files, run the tests, ship it. It all happens on disk. But that is not how data work feels. You load something, you look at it, you run a cell, you watch how it responds, and you decide the next move from whatever is sitting in memory. And until now, your agent couldn't see any of that. It only saw the files. Never the live state.
&amp;lt;br/&amp;gt;

&amp;lt;br/&amp;gt;
This episode, that wall comes down. marimo pair drops a coding agent right inside a running notebook, with full access to every variable Python is holding in memory. The notebook becomes a shared canvas. You point, it runs the code. You tell it to zoom in on the Picasso paintings, and the chart just updates. No MCP tools to wire up, no schema to describe. Just Python, and an agent that can finally see what you see. Trevor Manz is back to walk us through it.&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode sponsors&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;a href='https://talkpython.fm/sentry'&amp;gt;Sentry Error Monitoring, Code talkpython26&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;a href='https://talkpython.fm/training'&amp;gt;Talk Python Courses&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;h2 class=&quot;links-heading mb-4&quot;&amp;gt;Links from the show&amp;lt;/h2&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;marimo pair&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://marimo.io/pair?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;marimo.io/pair&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Course transcripts announcement&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/blog/posts/announcing-german-subtitles-on-courses/&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/blog&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;anywidget: Jupyter Widgets made easy&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/show/530/anywidget-jupyter-widgets-made-easy&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;marimo&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://marimo.io/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;marimo.io&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;blog&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://marimo.io/blog/marimo-pair?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;marimo.io&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;GitHub&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://github.com/marimo-team/marimo-pair?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;github.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;given this&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://martinalderson.com/posts/wall-street-lost-285-billion-because-of-13-markdown-files/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;martinalderson.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;llms.txt&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/llms.txt&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;mcp&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/ai-integration&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;cli&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/blog/posts/talk-python-now-has-a-cli/&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;open issues&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://github.com/marimo-team/marimo-pair/issues?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;github.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Discord&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://marimo.io/discord?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;marimo.io&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Marimo Pair&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://marimo.io/pair?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;marimo.io&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;OpenCode&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://opencode.ai?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;opencode.ai&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;AI Tooling for Software Engineers in 2026&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/ai-tooling-2026?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;newsletter.pragmaticengineer.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Watch this episode on YouTube&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.youtube.com/watch?v=6LAQnnW-gTY&quot; target=&quot;_blank&quot; &amp;gt;youtube.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode #555 deep-dive&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/show/555/marimo-pair-a-canvas-for-agent-developers-collaboration#takeaways-anchor&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/555&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode transcripts&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/transcript/555/marimo-pair-a-canvas-for-agent-developers-collaboration&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Theme Song: Developer Rap&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;🥁 Served in a Flask 🎸&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/flasksong&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/flasksong&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;---==  Don't be a stranger  ==---&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;YouTube&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/youtube&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-youtube&quot;&amp;gt;&amp;lt;/i&amp;gt; youtube.com/@talkpython&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Bluesky&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://bsky.app/profile/talkpython.fm&quot; target=&quot;_blank&quot; &amp;gt;@talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Mastodon&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://fosstodon.org/web/@talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-mastodon&quot;&amp;gt;&amp;lt;/i&amp;gt; @talkpython@fosstodon.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;X.com&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://x.com/talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-twitter&quot;&amp;gt;&amp;lt;/i&amp;gt; @talkpython&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on Bluesky&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://bsky.app/profile/mkennedy.codes?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;@mkennedy.codes&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on Mastodon&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://fosstodon.org/web/@mkennedy&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-mastodon&quot;&amp;gt;&amp;lt;/i&amp;gt; @mkennedy@fosstodon.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on X.com&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://x.com/mkennedy?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-twitter&quot;&amp;gt;&amp;lt;/i&amp;gt; @mkennedy&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;</description>
	<pubDate>Mon, 13 Jul 2026 17:07:43 +0000</pubDate>
</item>
<item>
	<title>Rodrigo Girão Serrão: itertools cheatsheet</title>
	<guid>https://mathspp.com/blog/itertools-cheatsheet</guid>
	<link>https://mathspp.com/blog/itertools-cheatsheet</link>
	<description>&lt;img alt=&quot;&quot; src=&quot;https://mathspp.com/images/f/b/1/5/e/fb15eb757e36ed758eab1a2578dfddb225e69d62-thumbnail.webp&quot; /&gt;
                                &lt;p&gt;Cheatsheet with visual diagrams that explain how the iterables from &lt;code&gt;itertools&lt;/code&gt; work.&lt;/p&gt;

&lt;p&gt;This cheatsheet contains diagrams that explain how the iterables from the module &lt;code&gt;itertools&lt;/code&gt; work in a visual way.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gumroad.com/l/cheatsheet-itertools&quot; class=&quot;btn btn-lg btn-center external-link no-image&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Download this cheatsheet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A4 itertools cheatsheet shown in light and dark themes.&quot; class=&quot;dark-theme-only&quot; src=&quot;https://mathspp.com/user/pages/02.blog/itertools-cheatsheet/_cheatsheets-light-front.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A4 itertools cheatsheet shown in light and dark themes.&quot; class=&quot;light-theme-only&quot; src=&quot;https://mathspp.com/user/pages/02.blog/itertools-cheatsheet/_cheatsheets-dark-front.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gumroad.com/l/itertools-uv&quot; class=&quot;btn btn-lg btn-center external-link no-image&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Download this cheatsheet&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 13 Jul 2026 14:28:00 +0000</pubDate>
</item>
<item>
	<title>Mike C. Fletcher: PyVRML97 2.3.4b1</title>
	<guid>http://blog.vrplumber.com/b/2026/07/12/pyvrml97-234b1/</guid>
	<link>http://blog.vrplumber.com/b/2026/07/12/pyvrml97-234b1/</link>
	<description>&lt;p&gt;Continuing on with the Open Source work. PyVRML97 2.3.4b1 is almost all build and CI process updates. There are a few minor fixes for modern Python's where bool can't be used as a list index and a change for NumPy 2.x array comparison failures. This beta is mostly just so that we can pull it from OpenGLContext's alpha when it's released.&lt;/p&gt;</description>
	<pubDate>Mon, 13 Jul 2026 01:53:42 +0000</pubDate>
</item>
<item>
	<title>Bob Belderbos: Learning New Skills in the AI Era (vBrownBag)</title>
	<guid>https://belderbos.dev/blog/vbrownbag-learning-skills-ai-era/</guid>
	<link>https://belderbos.dev/blog/vbrownbag-learning-skills-ai-era/</link>
	<description>&lt;p&gt;I joined the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://vbrownbag.com/&quot;&gt;vBrownBag podcast&lt;/a&gt; with &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.linkedin.com/in/damiankarlson&quot;&gt;Damian&lt;/a&gt; to talk about how to actually learn a new language or skill when an agent can write the code before you finish typing the prompt.&lt;/p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;/span&gt;&lt;h2 id=&quot;keep-the-friction-in&quot;&gt;Keep the friction in&lt;/h2&gt;
&lt;p&gt;The thread running through the whole conversation is friction. Agents are close to slot machines: a bit of dopamine, the path of least resistance, and suddenly you are delegating the thinking, not just the typing. The weeks where I hand off the most are the weeks I come out least happy with my own skills.&lt;/p&gt;
&lt;img src=&quot;https://belderbos.dev/images/outsourcing-thinking-drake.png&quot; alt=&quot;Drake meme: rejecting outsourcing your thinking to the model, preferring to read it yourself and ask where you get stuck&quot; /&gt;
&lt;p&gt;So I keep deliberate friction in the loop. I built coding platforms for &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://pybitesplatform.com&quot;&gt;Python&lt;/a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://rustplatform.com&quot;&gt;Rust&lt;/a&gt; with no AI in them, on purpose, so you still write the code in the browser without assistance.&lt;/p&gt;
&lt;p&gt;When you are learning something, you have to go through the cycles at least once before you let an agent do it for you.&lt;/p&gt;
&lt;p&gt;That is also why I can lean on agents more in Python (20 years of programming in, I can smell-test the output) than in a language I am still new to.&lt;/p&gt;
&lt;p&gt;The litmus test is simple: how well do I understand the thing I am shipping?&lt;/p&gt;
&lt;h2 id=&quot;ai-to-explain-not-ai-to-do&quot;&gt;AI to explain, not AI to do&lt;/h2&gt;
&lt;p&gt;AI is remarkable at explaining a specific concept. It is dangerous as a crutch for deeper understanding. The distinction I keep drawing: use it to explain, not to do the work you signed up to learn.&lt;/p&gt;
&lt;p&gt;We got into where the silent errors hide. Reviewed code can look completely plausible and still be only 70% right, because you never went deep enough to feel the wrong part (I also discussed this recently on &lt;a href=&quot;https://belderbos.dev/blog/complexity-dot-fm-podcast/&quot;&gt;complexity.fm&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;On &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://askthecanon.com&quot;&gt;a recent project&lt;/a&gt; the app worked and returned good results, but it was silently never searching the second half of every chunk (see &lt;a href=&quot;https://belderbos.dev/blog/semantic-search-without-a-vector-database/&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;That is the failure mode I see most with students shipping AI-built code, which is why I keep coming back to rubber-stamping AI PRs as the real risk.&lt;/p&gt;
&lt;h2 id=&quot;learn-by-building-with-tests-as-the-guide&quot;&gt;Learn by building, with tests as the guide&lt;/h2&gt;
&lt;p&gt;When people ask how to learn Rust (or anything) without losing ownership, the shape is always the same:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read enough to get the concepts (the first six to eight chapters of the Rust book, not all 600 pages).&lt;/li&gt;
&lt;li&gt;Pick a real project you have a stake in, then break it into digestible pieces.&lt;/li&gt;
&lt;li&gt;Write the tests first so you have a definition of done that guides each step.&lt;/li&gt;
&lt;li&gt;Contrast sources: read the reference in parallel, and compare answers across models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;http://scriptertorust.com&quot;&gt;Rust cohort&lt;/a&gt; we build a JSON parser this way: tokenizer first, then bindings with PyO3, then benchmarking. Several students beat the C parser on performance (see &lt;a href=&quot;https://belderbos.dev/blog/josh-rust-cohort-beat-cpython-json&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://belderbos.dev/blog/jochen-rust-cohort-beat-cpython/&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This only happens because they &lt;strong&gt;owned&lt;/strong&gt; every line instead of having an agent generate it.&lt;/p&gt;
&lt;p&gt;Watch the full conversation:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6DY7GjnQEbo&quot;&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The line I keep repeating: AI is &lt;a href=&quot;https://belderbos.dev/blog/ai-accelerator-needs-direction/&quot;&gt;an accelerator, not a compass&lt;/a&gt;. Start with your own thinking, then let it help, and keep a high enough bar that you never accept the first draft.&lt;/p&gt;
&lt;h2 id=&quot;keep-reading&quot;&gt;Keep reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://belderbos.dev/blog/ai-accelerator-needs-direction/&quot;&gt;The AI accelerator needs direction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://belderbos.dev/blog/ai-doesnt-change-what-software-engineering-is/&quot;&gt;AI Doesn't Change What Software Engineering Is&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://belderbos.dev/blog/rust-made-me-a-better-python-developer/&quot;&gt;Learning Rust made me a better Python developer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks Damian / vBrownBag for having me on. If you want to stay technical without outsourcing the thinking, that is exactly what we work on in the &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://scriptertorust.com&quot;&gt;Rust&lt;/a&gt; and &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://pythonagenticai.com&quot;&gt;agentic AI&lt;/a&gt; cohorts.&lt;/p&gt;</description>
	<pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Armin Ronacher: The Tower Keeps Rising</title>
	<guid>https://lucumr.pocoo.org/2026/7/13/the-tower-keeps-rising/</guid>
	<link>https://lucumr.pocoo.org/2026/7/13/the-tower-keeps-rising/</link>
	<description>&lt;p&gt;I feel that some vibecoded software changes somewhat randomly and unexpectedly.
That made me think about Bruegel&amp;#8217;s &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Tower_of_Babel_(Bruegel)&quot;&gt;&amp;#8220;The Tower of
Babel&amp;#8221;&lt;/a&gt; which shows
an already quite chaotic depiction of the Tower of Babel.  The story is usually
told as one about pride and ambition and ultimately why people no longer speak
the same language.  But it is also a story about the unity that makes
technological progress work.&lt;/p&gt;
&lt;p&gt;The text begins with a technology upgrade:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And they said one to another, Go to, let us make brick, and burn them
thoroughly.  And they had brick for stone, and slime had they for morter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;They use it for a civilizational project:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;let us build us a city and a tower, whose top may reach unto heaven&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But when God assesses the situation the bricks are not what concern him:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the people is one, and they have all one language, […] and now nothing will be
restrained from them.&lt;sup class=&quot;footnote-ref&quot; id=&quot;fnref-1&quot;&gt;&lt;a href=&quot;https://lucumr.pocoo.org/feed.atom#fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The source of their power is coordination.  They share a language and with that
shared language they can combine their work into something no one of them could
build alone.  God does not take away the bricks or their knowledge of how to
make them.  He takes away their ability to understand one another, and
construction stops.&lt;/p&gt;
&lt;p&gt;There is the appealing idea that AI-assisted programming means better tools
which lets us build more ambitious software.  That is certainly true at the
level of the individual and without doubt a developer with an agent will be
dramatically more capable of changing a codebase.  But large software projects
have never been limited only by how quickly an individual can produce code.
They are limited by how well people can coordinate their understanding of the
system they are changing.&lt;/p&gt;
&lt;p&gt;The shared language of a software project is not English or Python but it is the
common understanding of what its concepts mean, where the boundaries are, which
invariants matter, who owns what, and why the system has the shape it does.
This language is rarely written down in one place.  It lives partly in
documentation and code, but also in code review, conversations, arguments, and
the experience of having to explain a change to somebody else.&lt;/p&gt;
&lt;p&gt;Before agents, some of this shared understanding was maintained by friction.
If I wanted to change your storage layer, I usually had to read your code, ask
you questions, and perhaps coordinate with another team whose service depended
on it.  This was slow, and much of that slowness was waste but not all of it
was.  Some of it was the process by which your understanding became mine, and
by which both of us discovered whether we still agreed about how the system
worked.  This friction synchronizes people.&lt;/p&gt;
&lt;p&gt;Agents remove much of that friction.  I can ask an agent to add OAuth, you can
ask one to add caching, and somebody else can ask one to rebuild the database
from first principles and make the UI pink.  Each change can be reasonable in
isolation.  The code can compile, the tests can pass, and the explanations can
be generated on demand.  None of us necessarily has to talk to the others, or
even acquire the part of the shared model that the change once would have forced
us to learn.&lt;/p&gt;
&lt;p&gt;As I said many times before: agents do not feel pain, only humans do.  Agents
now let us act in parts of the system where we would previously have needed
other people and in code bases where the people would have revolted.&lt;/p&gt;
&lt;p&gt;When I look at some vibecoded scaled-up projects the codebases become Babel not
because nobody can communicate, but because nobody needs to.  Every developer
has a tireless translator that can explain a corner of the tower and make
whatever local alteration they ask of it.  The changes keep landing, even as the
architectural language that would let the humans reason about them together
disappears.&lt;/p&gt;
&lt;p&gt;But it&amp;#8217;s not the biblical story.  At Babel, the loss of common language stops
construction whereas in AI-assisted engineering, construction can continue after
shared understanding has already collapsed.  The lack of an immediate failure is
what makes it curious and a bit disorienting.  The tower does not fall, and so
we do not notice what was lost.  It just keeps rising.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;ol&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://www.biblegateway.com/passage/?search=Genesis%2011%3A3-6&amp;version=KJV&quot;&gt;Genesis 11:3-6, KJV&lt;/a&gt;.&lt;a href=&quot;https://lucumr.pocoo.org/feed.atom#fnref-1&quot; class=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
	<pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Christian Ledermann: Buzzword Bingo: An Experiment in Spec-Driven AI Development</title>
	<guid>https://dev.to/ldrscke/buzzword-bingo-an-experiment-in-spec-driven-ai-development-1m88</guid>
	<link>https://dev.to/ldrscke/buzzword-bingo-an-experiment-in-spec-driven-ai-development-1m88</link>
	<description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href=&quot;https://dev.to/challenges/weekend-2026-07-09&quot;&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Buzzword Bingo&lt;/strong&gt;, a multiplayer bingo game for conferences, webinars and meetings where players mark off the inevitable buzzwords as they appear.&lt;/p&gt;

&lt;p&gt;The application allows someone to create a game, share a link with participants, and let everyone play along on their own unique bingo board. The first player to complete a row, column or diagonal wins.&lt;/p&gt;

&lt;p&gt;Under the hood, though, the game itself was almost secondary.&lt;/p&gt;

&lt;p&gt;The real goal was to answer a question I had been wondering about for a while:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How far can I push Claude with specification-driven development while still achieving reliable type coverage and maintaining the coding standards I expect from a production Python project?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The project became an experiment in AI-assisted software engineering, strict typing, and how much guidance modern coding agents actually need to produce maintainable software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;There is no live demo, but you can have a &lt;a href=&quot;https://github.com/cleder/bsbingo/blob/main/docs/user-guide.md&quot; rel=&quot;noopener noreferrer&quot;&gt;look at the screenshots&lt;/a&gt; taken by &lt;a href=&quot;https://playwright.dev/&quot; rel=&quot;noopener noreferrer&quot;&gt;playwright&lt;/a&gt; during testing&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/cleder/bsbingo&quot; rel=&quot;noopener noreferrer&quot;&gt;bsbingo GitHub repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Specification Driven Development
&lt;/h3&gt;

&lt;p&gt;The project followed a specification-driven approach using Speckit.&lt;/p&gt;

&lt;p&gt;Rather than iterating directly in code, I created specifications describing what the system should do and allowed Claude to implement them.&lt;/p&gt;

&lt;p&gt;A big accelerator for the project was using &lt;a href=&quot;https://github.com/getscaf/scaf&quot; rel=&quot;noopener noreferrer&quot;&gt;scaf&lt;/a&gt; for the initial bootstrap. Rather than spending the first few hours wiring together repository structure, CI, containerization, infrastructure, and developer tooling, I started from a production-oriented foundation and focused on shaping it to match my own preferences. Having Kubernetes manifests, Terraform, deployment pipelines, and modern Python tooling available from day one made it much easier to concentrate on the actual experiment: how far specification-driven development and AI coding agents could take the application.&lt;/p&gt;

&lt;p&gt;I ended up needing three major specifications:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Project scaffolding&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Starting from a project generated with &lt;code&gt;scaf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Refining the generated structure to match my personal preferences.&lt;/li&gt;
&lt;li&gt;Adding all the infrastructure and tooling I typically expect in a modern project.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Backend implementation&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Django models and business logic.&lt;/li&gt;
&lt;li&gt;Server-rendered templates.&lt;/li&gt;
&lt;li&gt;HTMX interactions.&lt;/li&gt;
&lt;li&gt;Capability URL based authorization.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Frontend implementation&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Visual styling and user experience.&lt;/li&gt;
&lt;li&gt;Responsive layouts.&lt;/li&gt;
&lt;li&gt;End-to-end testing using Playwright.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Django Without the JavaScript Framework
&lt;/h3&gt;

&lt;p&gt;The application uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Django&lt;/li&gt;
&lt;li&gt;HTMX&lt;/li&gt;
&lt;li&gt;Django templates&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTMX turned out to be an excellent fit for this type of application.&lt;/p&gt;

&lt;p&gt;Most interactions consist of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clicking a square,&lt;/li&gt;
&lt;li&gt;sending a POST request,&lt;/li&gt;
&lt;li&gt;returning an updated HTML fragment,&lt;/li&gt;
&lt;li&gt;swapping it into the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No client-side state management was required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Capability URLs
&lt;/h3&gt;

&lt;p&gt;One design decision I particularly liked was using capability URLs instead of authentication.&lt;/p&gt;

&lt;p&gt;Each board receives a unique UUID:&lt;br /&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;/board/5b97b663-1f2f-4e54-8d2f-f45f3272f870/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possession of the URL grants access to that board.&lt;/p&gt;

&lt;p&gt;This removes the need for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user accounts,&lt;/li&gt;
&lt;li&gt;sessions,&lt;/li&gt;
&lt;li&gt;authentication,&lt;/li&gt;
&lt;li&gt;authorization logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a lightweight conference game this felt like the right trade-off.&lt;/p&gt;

&lt;h3&gt;
  
  
  Going All-In On Type Safety
&lt;/h3&gt;

&lt;p&gt;I care a lot about clean code and strong typing in Python, so I decided to push the type system as far as possible.&lt;/p&gt;

&lt;p&gt;Instead of relying on a single type checker, I combined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astral.sh/ty/&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;ty&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zubanls.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;zuban&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pyrefly.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;pyrefly&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was paired with a strict &lt;a href=&quot;https://docs.astral.sh/ruff/&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;ruff&lt;/code&gt;&lt;/a&gt; configuration with almost every rule enabled.&lt;/p&gt;

&lt;p&gt;One of the goals of the experiment was to see whether Claude could operate effectively within these constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Worked
&lt;/h3&gt;

&lt;p&gt;This instruction worked well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prefer precise, narrow types (&lt;code&gt;Enum&lt;/code&gt;, &lt;code&gt;NewType&lt;/code&gt;, &lt;code&gt;TypedDict&lt;/code&gt;, dataclasses with &lt;code&gt;Final&lt;/code&gt; or &lt;code&gt;Literal&lt;/code&gt; fields) over &lt;code&gt;Any&lt;/code&gt;, untyped &lt;code&gt;dict&lt;/code&gt; or &lt;code&gt;list&lt;/code&gt;, or stringly-typed values. Illegal states should be unrepresentable in the type system rather than guarded against only at runtime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once Claude had a few examples to follow, it started producing significantly better type annotations and more expressive domain models.&lt;/p&gt;

&lt;p&gt;Pre-commit hooks proved to be the first line of defence, catching issues before they ever reached CI. Linters, formatters, and all three type checkers ran automatically on every commit, providing rapid feedback and keeping the codebase consistent throughout the experiment.&lt;br /&gt;
To avoid spending time hand-crafting the configuration, I used &lt;a href=&quot;https://github.com/cleder/gpc-init&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;code&gt;pc-init&lt;/code&gt;&lt;/a&gt; to generate a strict &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; tailored for modern Python projects. This ensured that formatting, linting, and type checking became part of the development workflow rather than an afterthought.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Didn't Work
&lt;/h3&gt;

&lt;p&gt;Claude struggled with this instruction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All Python code MUST be fully type-annotated; untyped function signatures and untyped module-level values are not permitted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of fixing missing annotations, it occasionally attempted to disable checks in &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Some manual intervention and code review were required to steer it back towards the desired standards.&lt;/p&gt;

&lt;p&gt;The experience reinforced an observation I've made repeatedly with coding agents:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agents optimize for making the error disappear, not necessarily for preserving your engineering constraints.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you care about those constraints, you still need strong feedback loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type Checker Observations
&lt;/h3&gt;

&lt;p&gt;Running all three type checkers together was still faster than a single &lt;code&gt;mypy&lt;/code&gt; run.&lt;/p&gt;

&lt;p&gt;Interestingly, they complemented each other rather than duplicating effort:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ty&lt;/code&gt; found some issues the others missed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pyrefly&lt;/code&gt; found different classes of problems.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zuban&lt;/code&gt; felt the closest to &lt;code&gt;mypy&lt;/code&gt; and was by far the easiest to configure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The newer type-checking ecosystem is still catching up with &lt;code&gt;mypy&lt;/code&gt; in terms of documentation and examples, so reaching the level of strictness I wanted involved a fair amount of experimentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Not submitting for any specific prize category.&lt;/p&gt;

&lt;p&gt;The real prize was finding out how far AI-assisted, specification-driven development can be pushed before human review becomes the limiting factor. 😉️&lt;/p&gt;</description>
	<pubDate>Sun, 12 Jul 2026 21:23:52 +0000</pubDate>
</item>
<item>
	<title>Mike C. Fletcher: PyOpenGL 4.0.0a1</title>
	<guid>http://blog.vrplumber.com/b/2026/07/12/pyopengl-400a1/</guid>
	<link>http://blog.vrplumber.com/b/2026/07/12/pyopengl-400a1/</link>
	<description>&lt;p&gt;I've been trying to make some time for Open Source projects again. I've been using LLMs for much of the coding because the vast bulk of it at this point is just grunt work. First up is PyOpenGL. The tests the LLM produced turned up a bunch of bugs in the core that have lain dormant for years because the endpoints weren't getting used. The LLM tests are not particularly fun or interesting, but they did a pretty good job of finding wrapping errors. They also exercised GLES and EGL enough to make it far more reasonable to actually use those two interfaces.&lt;/p&gt;

&lt;p&gt;Shout out to glfw python library for working cleanly on the Wayland only environment. Definitely helped to find the hidden GLX dependencies we had throughout the Linux platform implementation. One of the biggest ones there was the GLUT library. The other thing that came out was the GLE library being legacy (compatibility) OpenGL.&lt;/p&gt;

&lt;p&gt;PyOpenGL 4.0.0a1 is classified as a major release mostly because of the abandonment of old Pythons (&amp;lt;3.9) and old Numpy (&amp;lt;2). Other than that there's mostly just bug-fixes that came from the new test suites.&lt;/p&gt;

&lt;p&gt;GLU&lt;br /&gt;* gluUnProject4 missing arguments&lt;br /&gt;* gluNewQuadric/gluQuadricCallback fix the callback mechanism to work like Nurbs code&lt;br /&gt;* gluTessVertex/gluTessBeginPolygon and combine callback, original object return fixes&lt;br /&gt;* gluGetNurbsProperty added, allocates the output&lt;br /&gt;* gluNurbsCallbackData(EXT) argtype fix&lt;/p&gt;

&lt;p&gt;glGet Sizes&lt;br /&gt;* sizing tables regenerated based on results from size probing, lots of incorrect sizes fixed; note that these fixes are constrained to extensions I happen to have access to on my platforms&lt;br /&gt;* fix the code generator's constant generation&lt;br /&gt;* glGetPolygonStipple fixed size output&lt;br /&gt;* glGetCompressedTexImage glGetTexImageCompressed was ignoring level and using an ARB constant&lt;/p&gt;

&lt;p&gt;Wrappers&lt;br /&gt;* remove double wrapping on glGetHistogramParameter{f,i}vEXT, glGenVertexArrays, glDrawBuffersEXT (which was also mis-named glDrawBuffers)&lt;br /&gt;* glHistogram double wrapped as well, which was crashing vertex_array_object on import which was then causing higher level code to treat the extension as unsupported&lt;/p&gt;

&lt;p&gt;64-bit Integer Arrays&lt;br /&gt;* GL_INT64 / GL_UNSIGNED_INT64 new array types for all of the array handlers&lt;/p&gt;

&lt;p&gt;No-Numpy Operation&lt;br /&gt;* ctypesarrays zeros/ones handler&lt;br /&gt;* a few spots where GLchar arrays were needed as return types&lt;br /&gt;* gl(Get)ProgramNamedParameter*NV input size fix&lt;br /&gt;* glGetActiveAttribARB optional bufSize parameter added&lt;br /&gt;* ARB.vertex_shader allow passign in size parameter&lt;br /&gt;* allow passing a ctypes char_p as shader-text&lt;/p&gt;

&lt;p&gt;GLES&lt;br /&gt;* images module for GLES&lt;br /&gt;* friendly wrappers mimicing the GL ones for lots of endpoints&lt;br /&gt;* glGetString/glGetStringi restype fix&lt;br /&gt;* Normalising of GLES extension names to the GL_* form (same as GL)&lt;/p&gt;

&lt;p&gt;General Bug Fixes&lt;br /&gt;* Large constant wrapping fix&lt;br /&gt;* Caching of extension/version data per-context&lt;br /&gt;* Core/version extension handles cases where &quot;VERSION&quot; is not the *first* token&lt;br /&gt;* ShaderProgram.retrieve() fix for unpacking glGetProgramBinary&lt;br /&gt;* input-or-output converter for args that can be either&lt;br /&gt;* ArrayDatatype.get_ffi_argtype etc PyPy specific mechanisms for array interactions&lt;/p&gt;

&lt;p&gt;Logging&lt;br /&gt;* make the log decorator more type-check friendly&lt;/p&gt;

&lt;p&gt;Packaging&lt;br /&gt;* License declaration fixes for more modern packaging tools&lt;/p&gt;

&lt;p&gt;There shouldn't be many significant regressions, as almost everything is a correctness fix, but there's a lot of new code, particularly for the GLES improvements. The alpha is up now for those who want to test the changes against their codebase, but this is an alpha release, so there may be more significant code changes as we move toward a 4.0.0 final release.&lt;/p&gt;

&lt;p&gt;There's still some work to do on the OpenGLContext release, but the teaser image above should give you an idea where it's going. It's a direct render of the Khronos sample asset &lt;a href=&quot;https://github.com/KhronosGroup/glTF-Sample-Assets/blob/main/Models/ABeautifulGame/README.md&quot;&gt;A Beautiful Game&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 12 Jul 2026 20:55:51 +0000</pubDate>
</item>
<item>
	<title>Python⇒Speed: 8× faster binary search: from compiled code to mechanical sympathy</title>
	<guid>https://pythonspeed.com/articles/branchless-binary-search/</guid>
	<link>https://pythonspeed.com/articles/branchless-binary-search/</link>
	<description>&lt;p&gt;How do you speed up computational Python code? A common, and useful,
starting point is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pick a good algorithm.&lt;/li&gt;
  &lt;li&gt;Use a compiled language to write a Python extension.&lt;/li&gt;
  &lt;li&gt;Maybe add parallelism so you can use multiple CPU cores.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But what if you need more speed? Consider the following real problem,
one of the steps in scikit-learn’s gradient histogram boosting
algorithm:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You have a large array of floating point numbers.&lt;/li&gt;
  &lt;li&gt;You want to assign them to the integer range 0-254, spread out evenly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;scikit-learn implements this by splitting up the full range of float
values into 255 buckets, creating a sorted array of bucket boundaries,
and then using binary search to choose the appropriate bucket for each
value. The binary search is implemented in a compiled language, and it
can run in parallel on multiple cores.&lt;/p&gt;

&lt;p&gt;Recently, as part of my work at
&lt;a href=&quot;https://labs.quansight.org/&quot;&gt;Quansight&lt;/a&gt;, and inspired by
&lt;a href=&quot;https://pvk.ca/Blog/2012/07/03/binary-search-star-eliminates-star-branch-mispredictions/&quot;&gt;two&lt;/a&gt;
&lt;a href=&quot;https://pvk.ca/Blog/2015/11/29/retrospective-on-binary-search-and-on-compression-slash-compilation/&quot;&gt;posts&lt;/a&gt;
by Paul Khuong, I sped up this implementation significantly. How? By
making sure the code wasn’t fighting against the CPU.&lt;/p&gt;

&lt;p&gt;In this article I’m going to walk you through that speed-up,
demonstrated on a simplified example. Then I’m going to demonstrate a
series of additional optimizations, with the final version running 6×
faster than the original one.&lt;/p&gt;

&lt;p&gt;It’s worth knowing that I will be speeding through mentions of many
different low-level hardware topics: instruction-level parallelism,
branch (mis)prediction, and more. This is only one
article, it can only briefly introduce you to what’s possible, it can’t
function as an in-depth tutorial. So I’ll talk about how you can learn
more about these topics at the end of the article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed stupid mistake involving f64 comparisons, you can just do them.
SIMD doesn’t help anymore—but that’s OK, the code is even faster.&lt;/li&gt;
  &lt;li&gt;Clarified benefits of precalculating &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;halves&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


   &lt;a href=&quot;https://pythonspeed.com/articles/branchless-binary-search/&quot;&gt;Read more...&lt;/a&gt;</description>
	<pubDate>Sat, 11 Jul 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Mike Driscoll: An Intro to Spiel – Creating Presentations in Your Terminal with Python</title>
	<guid>https://blog.pythonlibrary.org/2026/07/10/an-intro-to-spiel-creating-presentations-in-your-terminal-with-python/</guid>
	<link>https://blog.pythonlibrary.org/2026/07/10/an-intro-to-spiel-creating-presentations-in-your-terminal-with-python/</link>
	<description>&lt;p&gt;Have you ever wanted to create a presentation in your computer&amp;#8217;s terminal? While this is an uncommon need, a clever open source developer has provided a solution to this problem! The project is called &lt;a href=&quot;https://github.com/JoshKarpel/spiel&quot;&gt;Spiel&lt;/a&gt;, and while it is currently archived, the idea is pretty cool. Spiel uses the &lt;a href=&quot;https://github.com/Textualize/rich&quot;&gt;Rich&lt;/a&gt; package to create the slides for your presentation. Note: while the GitHub page doesn&amp;#8217;t explain why the project is archived, it appears to use a very old version of Textual which cannot be upgraded.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s spend a little time learning how this all works.&lt;/p&gt;
&lt;h2&gt;Installing Spiel&lt;/h2&gt;
&lt;p&gt;According to the Spiel GitHub page, you can try Spiel without even installing it if you have docker installed. Here&amp;#8217;s how to try Spiel:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;$ docker run -it --rm ghcr.io/joshkarpel/spiel&lt;/pre&gt;
&lt;p&gt;However, for the purposes of this tutorial, you really should install Spiel. To do that, you will be using pip. Open up your terminal and run the following:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;pip install spiel&lt;/pre&gt;
&lt;p&gt;Feel free to create a Python virtual environment first if you don&amp;#8217;t want to install Spiel into your global Python packages.&lt;/p&gt;
&lt;p&gt;Once you have Spiel installed, you can check that it is working by running the Spiel demo, like this:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;spiel demo present&lt;/pre&gt;
&lt;p&gt;If that works, you are good to go!&lt;/p&gt;
&lt;h2&gt;Creating Your Presentation&lt;/h2&gt;
&lt;p&gt;The documentation gives a good example of how to create a one-slide presentation. Here&amp;#8217;s their example:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;from rich.console import RenderableType

from spiel import Deck, present

deck = Deck(name=&quot;Your Deck Name&quot;)


@deck.slide(title=&quot;Slide 1 Title&quot;)
def slide_1() -&amp;gt; RenderableType:
    return &quot;Your content here!&quot;


if __name__ == &quot;__main__&quot;:
    present(__file__)&lt;/pre&gt;
&lt;p&gt;According to the &lt;a href=&quot;https://www.spiel.how/slides/&quot;&gt;documentation&lt;/a&gt;, there are two ways to add slides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the decorator like in the example above&lt;/li&gt;
&lt;li&gt;Use `&lt;span class=&quot;n&quot;&gt;deck&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_slides()` and pass in one or more Slide objects&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a more complete example that creates a couple of custom slides:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;from rich.align import Align
from rich.console import RenderableType
from rich.style import Style
from rich.text import Text
from spiel import Deck, Slide, present


def make_slide(
    title_prefix: str,
    text: Text,
) -&amp;gt; Slide:
    def content() -&amp;gt; RenderableType:
        return Align(text, align=&quot;center&quot;, vertical=&quot;middle&quot;)
    return Slide(title=f&quot;{title_prefix} Slide&quot;, content=content)

deck = Deck(&quot;Test Deck&quot;)

title_slide = make_slide(title_prefix=&quot;First&quot;, text=Text(&quot;Python 101 - All About Lists&quot;,
                                             style=Style(color=&quot;blue&quot;)))

intro_slide = make_slide(title_prefix=&quot;Second&quot;,
                    text=Text(&quot;A Python list is&quot;,
                              style=Style(color=&quot;red&quot;))
                    )

deck.add_slides(title_slide, intro_slide)

if __name__ == &quot;__main__&quot;:
    present(__file__)&lt;/pre&gt;
&lt;p&gt;When you run this code in your terminal, you will see something like this:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-large wp-image-12808&quot; src=&quot;https://blog.pythonlibrary.org/wp-content/uploads/2026/07/spiel_slide-1024x547.png&quot; alt=&quot;Spiel slide example&quot; width=&quot;1024&quot; height=&quot;547&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can move to the next or previous slide using the arrow keys on your keyboard. If you want to exit, press CTRL+C.&lt;/p&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Spiel seems like a neat package. It&amp;#8217;s a shame that it is currently archived. Hopefully, the author will reopen it at some point, or someone else will pick up the torch. In the meantime, you can easily use it in a Python virtual environment and give it a try.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://blog.pythonlibrary.org/2026/07/10/an-intro-to-spiel-creating-presentations-in-your-terminal-with-python/&quot;&gt;An Intro to Spiel &amp;#8211; Creating Presentations in Your Terminal with Python&lt;/a&gt; appeared first on &lt;a href=&quot;https://blog.pythonlibrary.org&quot;&gt;Mouse Vs Python&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 10 Jul 2026 15:13:38 +0000</pubDate>
</item>
<item>
	<title>Talk Python to Me: #554: Trustworthy AI in Healthcare and Longevity</title>
	<guid>https://talkpython.fm/episodes/show/554/trustworthy-ai-in-healthcare-and-longevity</guid>
	<link>https://talkpython.fm/episodes/show/554/trustworthy-ai-in-healthcare-and-longevity</link>
	<description>You ask an AI a question and it answers with total confidence. Most of the time, a confidently wrong answer is just an annoyance. But what if the question is medical, and there's a real patient on the other end? In that world, a hallucination isn't a bug, it's a patient-safety event. Sumit Gundawar is a London-based software engineer who builds the clinical platform for a UK longevity and aesthetic-medicine clinic, and his whole argument is that in high-stakes AI, the model is the easy part. Earning trust is the real engineering. We dig into grounding, refusal logic, human-in-the-loop design, and the messy frontier of longevity and biohacking, plus a live demo of an assistant that refuses to answer when it can't back up the claim. Let's get into it.&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode sponsors&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;a href='https://talkpython.fm/sixfeetup'&amp;gt;Six Feet Up&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;a href='https://talkpython.fm/training'&amp;gt;Talk Python Courses&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;h2 class=&quot;links-heading mb-4&quot;&amp;gt;Links from the show&amp;lt;/h2&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Guest&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Sumit Gundawar&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/sumit-gundawar-759470129/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Course transcripts announcement&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/blog/posts/announcing-german-subtitles-on-courses/&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/blog&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Sumit Gundawar - JAX London Speaker&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://jaxlondon.com/speaker/sumit-gundawar/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;jaxlondon.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Anthropic&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://anthropic.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;anthropic.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;OpenAI Platform&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://platform.openai.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;platform.openai.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Anthropic&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://anthropic.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;anthropic.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;LangChain&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://langchain.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;langchain.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;OWASP&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://owasp.org/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;owasp.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Pydantic&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://pydantic.dev/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;pydantic.dev&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;EU AI Act - Regulatory Framework&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;digital-strategy.ec.europa.eu&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;HIPAA - HHS&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.hhs.gov/hipaa?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.hhs.gov&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;NHS&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.nhs.uk/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.nhs.uk&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Llama&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://llama.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;llama.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Qwen - QwenLM on GitHub&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://github.com/QwenLM?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;github.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;OpenAI Platform&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://platform.openai.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;platform.openai.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Hugging Face&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://huggingface.co/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;huggingface.co&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Llama&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://llama.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;llama.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Granola&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.granola.ai/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.granola.ai&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;HIPAA - HHS&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.hhs.gov/hipaa?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.hhs.gov&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;CodeRabbit&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.coderabbit.ai/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.coderabbit.ai&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Cursor Origin&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://cursor.com/origin?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;cursor.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;GitHub Status&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.githubstatus.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.githubstatus.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Midjourney Medical&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.midjourney.com/medical?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.midjourney.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Neko Health&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.nekohealth.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;www.nekohealth.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;CERN&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://home.cern/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;home.cern&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;ATLAS Experiment&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://atlas.cern/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;atlas.cern&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Watch this episode on YouTube&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.youtube.com/watch?v=pp2v9paEoq4&quot; target=&quot;_blank&quot; &amp;gt;youtube.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode #554 deep-dive&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/show/554/trustworthy-ai-in-healthcare-and-longevity#takeaways-anchor&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/554&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode transcripts&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/transcript/554/trustworthy-ai-in-healthcare-and-longevity&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Theme Song: Developer Rap&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;🥁 Served in a Flask 🎸&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/flasksong&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/flasksong&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;---==  Don't be a stranger  ==---&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;YouTube&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/youtube&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-youtube&quot;&amp;gt;&amp;lt;/i&amp;gt; youtube.com/@talkpython&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Bluesky&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://bsky.app/profile/talkpython.fm&quot; target=&quot;_blank&quot; &amp;gt;@talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Mastodon&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://fosstodon.org/web/@talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-mastodon&quot;&amp;gt;&amp;lt;/i&amp;gt; @talkpython@fosstodon.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;X.com&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://x.com/talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-twitter&quot;&amp;gt;&amp;lt;/i&amp;gt; @talkpython&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on Bluesky&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://bsky.app/profile/mkennedy.codes?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;@mkennedy.codes&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on Mastodon&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://fosstodon.org/web/@mkennedy&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-mastodon&quot;&amp;gt;&amp;lt;/i&amp;gt; @mkennedy@fosstodon.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on X.com&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://x.com/mkennedy?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-twitter&quot;&amp;gt;&amp;lt;/i&amp;gt; @mkennedy&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;</description>
	<pubDate>Fri, 10 Jul 2026 05:10:31 +0000</pubDate>
</item>

</channel>
</rss>
