<?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>Real Python: Quiz: Context Managers and Using Python's with Statement</title>
	<guid>https://realpython.com/quizzes/with-statement-python/</guid>
	<link>https://realpython.com/quizzes/with-statement-python/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test what you learned in the video course &lt;a href=&quot;https://realpython.com/courses/with-statement-python/&quot;&gt;Context Managers and Using Python&amp;rsquo;s with Statement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how the &lt;code&gt;with&lt;/code&gt; statement runs setup and teardown for you, how to use standard-library context managers like &lt;code&gt;open()&lt;/code&gt;, and how to write your own context managers as classes or with the &lt;code&gt;@contextmanager&lt;/code&gt; decorator.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 21 May 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>PyCharm</title>
	<guid></guid>
	<link></link>
	<description>&lt;p&gt;Making software accessible often comes down to removing small but repeated points of friction in everyday workflows. Today, on &lt;a href=&quot;https://accessibility.day/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Global Accessibility Awareness Day&lt;/a&gt;, we’re sharing recent improvements in JetBrains IDEs across several areas: compatibility with assistive technologies on various platforms, keyboard navigation, and non-visual feedback. Some of these improvements are already available, and some are coming later this year.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;You can use the audio player below to listen to this blog post.&lt;/em&gt;&lt;/p&gt;


                                    
                
                &lt;a href=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/Accessibility-Blog-Post-Audio.mp4&quot;&gt;
                    Accessibility Blog Post Audio                &lt;/a&gt;
            
            


&lt;h2 class=&quot;wp-block-heading&quot;&gt;Better compatibility with assistive technologies&lt;/h2&gt;



&lt;p&gt;One of the key areas we’ve been working on is improving how JetBrains IDEs interact with OS-level accessibility tools.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Improved Magnifier support on Windows&lt;/h3&gt;



&lt;p&gt;Screen magnifiers are among the most commonly used assistive technologies in JetBrains IDEs. Until recently, the built-in Windows Magnifier didn’t reliably follow the text cursor in the editor, making navigation and editing more difficult for low-vision users. We’ve implemented support for cursor tracking so Magnifier follows text as you type, just as it does in other applications.&lt;/p&gt;







&lt;p&gt;This builds on earlier work on macOS, where we addressed text cursor tracking with macOS Zoom. Now, the same support is being extended to Windows.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Orca and GNOME Magnifier support on Linux&lt;/h3&gt;



&lt;p&gt;With version 2026.2, coming this summer, JetBrains IDEs will allow you to use the Orca screen reader and GNOME Magnifier in &lt;a href=&quot;https://www.jetbrains.com/help/idea/2026.1/installation-guide.html#operating-systems&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;supported Linux environments&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;This is an active area of work, with multiple related tasks already underway. Accessibility shouldn’t depend on your operating system, and we’re continuing to improve support across platforms.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;More predictable keyboard navigation&lt;/h2&gt;



&lt;p&gt;We’ve also been making it easier to move through the IDE without relying on a mouse.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Main menu access with &lt;em&gt;Alt &lt;/em&gt;on Windows&lt;/h3&gt;



&lt;p&gt;In native Windows applications, pressing &lt;em&gt;Alt&lt;/em&gt; moves the focus to the main menu, allowing you to navigate it with the keyboard. This behavior was previously missing from JetBrains IDEs, and screen readers, such as NVDA, would sometimes announce the system menu instead.&lt;/p&gt;



&lt;p&gt;Now, the main menu behaves in a way that feels familiar and predictable for keyboard-only and screen-reader users, and the bright focus indicator helps low-vision users identify the selected item.&amp;nbsp;&amp;nbsp;&lt;/p&gt;







&lt;h3 class=&quot;wp-block-heading&quot;&gt;Navigating between major parts of the IDE&lt;/h3&gt;



&lt;p&gt;Another focus area is the experience of moving between different parts of the IDE interface, such as toolbars, panels, and the editor. We’re working on a more structured model for navigating through the big component groups:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Tab&lt;/em&gt; and &lt;em&gt;Shift+Tab&lt;/em&gt; move the focus within the current area.&lt;/li&gt;



&lt;li&gt;A dedicated shortcut lets you jump between larger sections of the IDE.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;This reduces the effort required to reach essential controls and makes the overall layout easier to navigate. For the current iteration, we made it possible to bring the main toolbar and status bar into focus, and we fixed the &lt;em&gt;Project&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;and &lt;em&gt;Git&lt;/em&gt; toolbar widgets, which were not selectable by screen readers, even though other elements already were.&amp;nbsp;&lt;/p&gt;







&lt;p&gt;As the next step, we’ll polish specific controls and include tool window bars on both sides of the IDE frame in the navigation flow.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Exploring richer non-visual feedback with audio cues&lt;/h2&gt;



&lt;p&gt;Accessibility is not only about reaching controls, but also about understanding what’s happening while you work. We’re exploring ways to provide richer audio feedback in the IDE. Two directions we’re currently investigating:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Contextual signals when the caret lands on lines with errors, warnings, breakpoints, or version control changes. We want the IDE to provide immediate, non-visual feedback in context.&lt;/li&gt;



&lt;li&gt;More general audio notifications for IDE actions and state changes.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The goal is to reduce the need to rely on visual indicators or switch contexts just to understand what changed. Instead, we want the IDE to provide that information more directly.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Accessibility as an ongoing effort&lt;/h2&gt;



&lt;p&gt;We’re improving accessibility in JetBrains IDEs across multiple areas at once, including by providing compatibility with assistive technologies like screen readers and magnifiers, as well as by offering more consistent keyboard navigation and clearer feedback for events that are otherwise mostly visual.&lt;/p&gt;



&lt;p&gt;These improvements build on earlier updates, such as support for VoiceOver and NVDA, a high-contrast UI theme, and color schemes for red-green vision deficiency. There’s still more to do, and we’ll continue working in this direction.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;We’d love to hear from you&lt;/h2&gt;



&lt;p&gt;We’re eager to hear from developers who rely on accessibility features, as well as from anyone interested in improving the experience of using them.&lt;/p&gt;



&lt;p&gt;If you have ideas or feedback about accessibility in JetBrains IDEs, you can reach us directly at &lt;strong&gt;accessibility@jetbrains.com&lt;/strong&gt;. You can also report issues through &lt;a href=&quot;https://youtrack.jetbrains.com/newIssue?project=IJPL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;YouTrack&lt;/a&gt; or the &lt;a href=&quot;https://www.jetbrains.com/support/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;support request form&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;If you’d like to stay informed about accessibility improvements, you can subscribe to updates &lt;a href=&quot;https://lp.jetbrains.com/ij-accessibility/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Thu, 21 May 2026 10:40:41 +0000</pubDate>
</item>
<item>
	<title>PyCharm: Improving Accessibility in JetBrains IDEs: What’s New and What’s Next in 2026</title>
	<guid>https://blog.jetbrains.com/platform/2026/05/improving-accessibility-in-jetbrains-ides-what-s-new-and-what-s-next-in-2026/</guid>
	<link>https://blog.jetbrains.com/platform/2026/05/improving-accessibility-in-jetbrains-ides-what-s-new-and-what-s-next-in-2026/</link>
	<pubDate>Thu, 21 May 2026 06:45:13 +0000</pubDate>
</item>
<item>
	<title>Talk Python Blog: Audit Your Python App Like Mozilla Audited Firefox</title>
	<guid>https://talkpython.fm/blog/posts/audit-your-python-app-like-mozilla-audited-firefox/</guid>
	<link>https://talkpython.fm/blog/posts/audit-your-python-app-like-mozilla-audited-firefox/</link>
	<description>&lt;p&gt;Earlier this year, Mozilla announced that they had pointed Claude at the Firefox JavaScript runtime. The agent surfaced more than 100 bugs, 14 of them serious enough to become CVEs. That is the kind of result you used to only get from an expensive pen-testing engagement, and even then it would take weeks. Reading that announcement, I kept circling back to one question: could a working Python web developer pull off the same kind of audit on their own app, without a security firm on retainer and without spending pen-testing-firm money? I built a course to answer that, and the short answer is yes.&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2026 22:02:26 +0000</pubDate>
</item>
<item>
	<title>Paolo Melchiorre: My PyCon US 2026</title>
	<guid>https://www.paulox.net/2026/05/21/my-pycon-us-2026/</guid>
	<link>https://www.paulox.net/2026/05/21/my-pycon-us-2026/</link>
	<description>&lt;p&gt;A timeline of my PyCon &lt;span class=&quot;caps&quot;&gt;US&lt;/span&gt; 2026 journey, in Long Beach (&lt;span class=&quot;caps&quot;&gt;US&lt;/span&gt;), told through the Mastodon posts I shared along the&amp;nbsp;way.&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2026 22:00:00 +0000</pubDate>
</item>
<item>
	<title>Django Weblog: Django 6.1 alpha 1 released</title>
	<guid>https://www.djangoproject.com/weblog/2026/may/20/django-61-alpha-1-released/</guid>
	<link>https://www.djangoproject.com/weblog/2026/may/20/django-61-alpha-1-released/</link>
	<description>&lt;p&gt;Django 6.1 alpha 1 is now available. It represents the first
stage in the 6.1 release cycle and is an opportunity to try out
the changes coming in Django 6.1.&lt;/p&gt;
&lt;p&gt;Django 6.1 offers a harmonious mélange of new features and usability improvements, which you
can read about in
&lt;a href=&quot;https://docs.djangoproject.com/en/dev/releases/6.1/&quot;&gt;the in-development 6.1 release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This alpha milestone marks the feature freeze. The
&lt;a href=&quot;https://www.djangoproject.com/download/6.1/roadmap/&quot;&gt;current release schedule&lt;/a&gt;
calls for a beta release in about a month and a release candidate roughly a
month after that. We'll only be able to keep this schedule with early and
frequent testing from the community. Updates on the release schedule are
available &lt;a href=&quot;https://forum.djangoproject.com/t/django-6-1-release-timeline-and-next-steps/43929&quot;&gt;on the Django forum&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As with all alpha and beta packages, this release is &lt;strong&gt;not&lt;/strong&gt; for production
use. However, if you'd like to take some of the new features for a spin, or
help find and fix bugs (which should be reported to
&lt;a href=&quot;https://code.djangoproject.com/newticket&quot;&gt;the issue tracker&lt;/a&gt;), you can grab a
copy of the alpha package from
&lt;a href=&quot;https://www.djangoproject.com/download/&quot;&gt;our downloads page&lt;/a&gt; or on PyPI.&lt;/p&gt;
&lt;p&gt;The PGP key ID used for this release is Jacob Walls: &lt;a href=&quot;https://github.com/jacobtylerwalls.gpg&quot;&gt;131403F4D16D8DC7&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2026 19:40:00 +0000</pubDate>
</item>
<item>
	<title>death and gravity: reader 3.24 released – help, multi-user updates</title>
	<guid>https://death.andgravity.com/reader-3-24</guid>
	<link>https://death.andgravity.com/reader-3-24</link>
	<description>&lt;p&gt;Hi there!&lt;/p&gt;
&lt;p&gt;I'm happy to announce version 3.24 of &lt;strong&gt;&lt;a class=&quot;external&quot; href=&quot;https://github.com/lemon24/reader&quot;&gt;reader&lt;/a&gt;&lt;/strong&gt;, a Python feed reader library.&lt;/p&gt;
&lt;h2 id=&quot;what-s-new&quot;&gt;What's new?&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#what-s-new&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Here are the highlights since &lt;a class=&quot;internal&quot; href=&quot;https://death.andgravity.com/reader-3-23&quot;&gt;reader 3.23&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;context-sensitive-help&quot;&gt;Context-sensitive help&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#context-sensitive-help&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;In lieu of a tutorial mode,
the web app now offers guidance to new users,
and has a basic context-sensitive help system.
Here's some screenshots:&lt;/p&gt;
&lt;div class=&quot;columns&quot;&gt;&lt;div class=&quot;column col-sm-6 col-xs-12&quot;&gt;


&lt;img class=&quot;img-responsive&quot; src=&quot;https://death.andgravity.com/_file/reader-3-24/empty.png&quot; alt=&quot;new user / empty state&quot; /&gt;
new user / empty state





&lt;/div&gt;
&lt;div class=&quot;column col-sm-6 col-xs-12&quot;&gt;


&lt;img class=&quot;img-responsive&quot; src=&quot;https://death.andgravity.com/_file/reader-3-24/context.png&quot; alt=&quot;context-sensitive help&quot; /&gt;
context-sensitive help





&lt;/div&gt;
&lt;div class=&quot;column col-sm-6 col-xs-12&quot;&gt;


&lt;img class=&quot;img-responsive&quot; src=&quot;https://death.andgravity.com/_file/reader-3-24/help.png&quot; alt=&quot;also help&quot; /&gt;
also help





&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&quot;structured-logging&quot;&gt;Structured logging&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#structured-logging&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;reader&lt;/em&gt; now uses &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/stable/guide.html#logging&quot;&gt;structured logging&lt;/a&gt; internally, through &lt;a class=&quot;external&quot; href=&quot;https://www.structlog.org/&quot;&gt;structlog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By default, output goes to stdlib &lt;a class=&quot;external&quot; href=&quot;https://docs.python.org/3/library/logging.html&quot;&gt;logging&lt;/a&gt;,
but you can opt into structlog-native logging:&lt;/p&gt;
&lt;div class=&quot;highlight code-container&quot;&gt;&lt;pre class=&quot;code&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;reader&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;structlog&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;enable_structlog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;structlog&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;configure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This was relatively challenging to do,
since as a library,
you cannot configure logging,
nor change any global state.
I hope I can contribute a variant of the solution &lt;a class=&quot;external&quot; href=&quot;https://github.com/hynek/structlog/issues/815&quot;&gt;upstream&lt;/a&gt;,
but meanwhile here's a &lt;a class=&quot;external&quot; href=&quot;https://github.com/lemon24/reader/blob/3.24/src/reader/_logging.py&quot;&gt;recipe&lt;/a&gt; you can use in your library
(warning: brittle code).&lt;/p&gt;
&lt;h3 id=&quot;make-update-feeds-parallel-again&quot;&gt;Make update_feeds() parallel again&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#make-update-feeds-parallel-again&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;It turns out the &amp;quot;extensive rework of the parser internal API&amp;quot;
from &lt;a class=&quot;internal&quot; href=&quot;https://death.andgravity.com/reader-3-15#retry-after&quot;&gt;3.15&lt;/a&gt;
caused &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/stable/guide.html#updating-feeds&quot;&gt;update_feeds()&lt;/a&gt; to retrieve feeds in the main thread
regardless of the worker count.&lt;/p&gt;

&lt;p class=&quot;admonition-title&quot;&gt;Protip&lt;/p&gt;
&lt;p&gt;If you have a &lt;a class=&quot;external&quot; href=&quot;https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor.map&quot;&gt;parallel map()&lt;/a&gt; that returns &lt;a class=&quot;external&quot; href=&quot;https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager&quot;&gt;@contextmanager&lt;/a&gt;s,
make sure the work you need to do in parallel
doesn't happen in &lt;code&gt;__enter__&lt;/code&gt;. 😅&lt;/p&gt;

&lt;h3 id=&quot;new-contributors&quot;&gt;New contributors&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#new-contributors&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Thank you to the &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/stable/changelog.html#version-3-24&quot;&gt;new contributors&lt;/a&gt;
that submitted pull requests to this release!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Want to contribute?&lt;/strong&gt;
Check out the &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/latest/contributing.html&quot;&gt;docs&lt;/a&gt; and the &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/latest/dev.html#roadmap&quot;&gt;roadmap&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;hosted-reader-status-update&quot;&gt;Hosted &lt;em&gt;reader&lt;/em&gt; status update&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#hosted-reader-status-update&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;As I said &lt;a class=&quot;internal&quot; href=&quot;https://death.andgravity.com/reader-3-23#hosted-reader-status-update&quot;&gt;last time&lt;/a&gt;,
I'm working on a &lt;strong&gt;hosted version of &lt;em&gt;reader&lt;/em&gt;&lt;/strong&gt;.
Background:
&lt;a class=&quot;internal&quot; href=&quot;https://death.andgravity.com/reader-3-23#why-another-feed-reader-web-app&quot;&gt;Why another feed reader web app?&lt;/a&gt;,
&lt;a class=&quot;internal&quot; href=&quot;https://death.andgravity.com/reader-3-23#why-not-just-self-host-it&quot;&gt;Why not just self-host it?&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;multi-user-feed-updates&quot;&gt;Multi-user feed updates&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#multi-user-feed-updates&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;One of the bigger changes for hosted &lt;em&gt;reader&lt;/em&gt; was handling multi-user feed updates.&lt;/p&gt;
&lt;p&gt;For intentional but questionable reasons,
users have their own &lt;strong&gt;dedicated databases&lt;/strong&gt;,
with the web app routing to the appropriate one
based on session information.&lt;/p&gt;
&lt;p&gt;However, updating feeds should happen in a &lt;strong&gt;single, shared database&lt;/strong&gt;;
this allows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;retrieving feeds once, not once per user&lt;/li&gt;
&lt;li&gt;per-host rate limiting&lt;/li&gt;
&lt;li&gt;preserving a longer history for public feeds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is now done,
complete with a design document (to be published).
As a teaser, here's a neat architecture / data flow diagram:&lt;/p&gt;





...

user@2.sqlite

user



nginx



Flask

auth

app



auth.sqlite



user@1.sqlite


public

shared.sqlite

feeds


public


private



email




yes, it's web scale ಠ_ಠ




&lt;h3 id=&quot;ok-so-what-now&quot;&gt;OK, so what now?&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#ok-so-what-now&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Since I'm rapidly running out of technical things to do,
a launch is imminent.&lt;/p&gt;
&lt;p&gt;This is what is finished so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multi-user version of the web app&lt;/li&gt;
&lt;li&gt;authentication via email&lt;/li&gt;
&lt;li&gt;infrastructure deployments using &lt;a class=&quot;external&quot; href=&quot;https://pyinfra.com/&quot;&gt;pyinfra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;(new)&lt;/small&gt; &lt;a class=&quot;anchor&quot; href=&quot;https://death.andgravity.com/reader-3-24#multi-user-feed-updates&quot;&gt;multi-user feed updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;(new)&lt;/small&gt; tutorial mode – &lt;a class=&quot;anchor&quot; href=&quot;https://death.andgravity.com/reader-3-24#context-sensitive-help&quot;&gt;context-sensitive help&lt;/a&gt; should do&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remaining work to an MVP:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;public demo&lt;/li&gt;
&lt;li&gt;landing page&lt;/li&gt;
&lt;li&gt;give it a good name&lt;/li&gt;
&lt;li&gt;launch announcement + roadmap&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Meanwhile,
if this sounds like something you'd like to use,
&lt;a class=&quot;internal&quot; href=&quot;https://death.andgravity.com/about#contact&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;That's it for now.
For more details, see the full &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/stable/changelog.html#version-3-24&quot;&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learned something new today?&lt;/strong&gt; Share it with others, it really helps! &lt;span class=&quot;text-large&quot;&gt;
&lt;span class=&quot;share-icons&quot;&gt;
&lt;a class=&quot;share-icon pycoders color&quot; href=&quot;https://pycoders.com/submissions&quot; target=&quot;_blank&quot;&gt;PyCoder's Weekly&lt;/a&gt;
&lt;a class=&quot;share-icon hacker-news color&quot; href=&quot;https://news.ycombinator.%63%6f%6d/submitlink?u=https%3A//death.andgravity.com/reader-3-24&amp;t=reader%203.24%20released%20%E2%80%93%20help%2C%20multi-user%20updates&quot;&gt;HN&lt;/a&gt;
&lt;a class=&quot;share-icon bluesky color&quot; href=&quot;https://bsky.%61%70%70/intent/compose?text=reader%203.24%20released%20%E2%80%93%20help%2C%20multi-user%20updates%20https%3A//death.andgravity.com/reader-3-24&quot;&gt;Bluesky&lt;/a&gt;
&lt;!--
&lt;a
    class=&quot;share-icon reddit color&quot;
    href=&quot;https://www.reddit.%63%6f%6d/%73%75%62%6d%69%74?url=https%3A//death.andgravity.com/reader-3-24&amp;amp;title=reader%203.24%20released%20%E2%80%93%20help%2C%20multi-user%20updates&quot;
&gt;Reddit&lt;/a&gt;
--&gt;
&lt;a class=&quot;share-icon linkedin color&quot; href=&quot;https://www.linkedin.%63%6f%6d/sharing/share-offsite/?url=https%3A//death.andgravity.com/reader-3-24&quot;&gt;linkedin&lt;/a&gt;
&lt;a class=&quot;share-icon twitter color&quot; href=&quot;https://twitter.%63%6f%6d/%73%68%61%72%65?text=reader%203.24%20released%20%E2%80%93%20help%2C%20multi-user%20updates&amp;url=https%3A//death.andgravity.com/reader-3-24&amp;via=_andgravity&quot;&gt;Twitter&lt;/a&gt;
&lt;/span&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-is-reader&quot;&gt;What is &lt;em&gt;reader&lt;/em&gt;?&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#what-is-reader&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;reader&lt;/strong&gt; takes care
of the core functionality required by a feed reader,
so you can focus on what makes &lt;strong&gt;yours&lt;/strong&gt; different.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;img-responsive&quot; src=&quot;https://death.andgravity.com/_file/reader-2-0/reader.png&quot; alt=&quot;reader in action&quot; /&gt;
&lt;em&gt;reader&lt;/em&gt; allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;retrieve, store, and manage &lt;strong&gt;Atom&lt;/strong&gt;, &lt;strong&gt;RSS&lt;/strong&gt;, and &lt;strong&gt;JSON&lt;/strong&gt; feeds&lt;/li&gt;
&lt;li&gt;mark articles as read or important&lt;/li&gt;
&lt;li&gt;add arbitrary tags/metadata to feeds and articles&lt;/li&gt;
&lt;li&gt;filter feeds and articles&lt;/li&gt;
&lt;li&gt;full-text search articles&lt;/li&gt;
&lt;li&gt;get statistics on feed and user activity&lt;/li&gt;
&lt;li&gt;import / export feeds as OPML&lt;/li&gt;
&lt;li&gt;write plugins to extend its functionality&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...all these with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a stable, clearly documented API&lt;/li&gt;
&lt;li&gt;excellent test coverage&lt;/li&gt;
&lt;li&gt;fully typed Python&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To find out more, check out the &lt;a class=&quot;external&quot; href=&quot;https://github.com/lemon24/reader&quot;&gt;GitHub repo&lt;/a&gt; and the &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/stable/&quot;&gt;docs&lt;/a&gt;,
or give the &lt;a class=&quot;external&quot; href=&quot;https://reader.readthedocs.io/en/stable/tutorial.html&quot;&gt;tutorial&lt;/a&gt; a try.&lt;/p&gt;
&lt;h2 id=&quot;why-use-a-feed-reader-library&quot;&gt;Why use a feed reader library?&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#why-use-a-feed-reader-library&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Have you been unhappy with existing feed readers and wanted to make your own, but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;never knew where to start?&lt;/li&gt;
&lt;li&gt;it seemed like too much work?&lt;/li&gt;
&lt;li&gt;you don't like writing backend code?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Are you already working with &lt;a class=&quot;external&quot; href=&quot;https://feedparser.readthedocs.io/en/latest/&quot;&gt;feedparser&lt;/a&gt;, but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;want an easier way to store, filter, sort and search feeds and entries?&lt;/li&gt;
&lt;li&gt;want to get back type-annotated objects instead of dicts?&lt;/li&gt;
&lt;li&gt;want to restrict or deny file-system access?&lt;/li&gt;
&lt;li&gt;want to change the way feeds are retrieved by using &lt;a class=&quot;external&quot; href=&quot;https://requests.readthedocs.io&quot;&gt;Requests&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;want to also support &lt;a class=&quot;external&quot; href=&quot;https://jsonfeed.org/&quot;&gt;JSON Feed&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;want to support custom information sources?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... while still supporting all the feed types feedparser does?&lt;/p&gt;
&lt;p&gt;If you answered yes to any of the above, &lt;em&gt;reader&lt;/em&gt; can help.&lt;/p&gt;
&lt;h2 id=&quot;the-reader-philosophy&quot;&gt;The &lt;em&gt;reader&lt;/em&gt; philosophy&lt;span class=&quot;headerlink&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://death.andgravity.com/reader-3-24#the-reader-philosophy&quot; title=&quot;permalink&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is a library&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is for the long term&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is extensible&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is stable (within reason)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is simple to use; API matters&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; features work well together&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is tested&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; is documented&lt;/li&gt;
&lt;li&gt;&lt;em&gt;reader&lt;/em&gt; has minimal dependencies&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Wed, 20 May 2026 16:44:22 +0000</pubDate>
</item>
<item>
	<title>Real Python: How to Use the Claude API in Python</title>
	<guid>https://realpython.com/claude-api-python/</guid>
	<link>https://realpython.com/claude-api-python/</link>
	<description>&lt;div&gt;&lt;p&gt;The fastest way to use the Claude API in Python is to install &lt;code&gt;anthropic&lt;/code&gt;, set your API key, and call &lt;code&gt;client.messages.create()&lt;/code&gt;. You’ll have a working response in under a minute:&lt;/p&gt;
&lt;a href=&quot;https://files.realpython.com/media/How_to_Use_the_Claude_API_in_Python_for_AI-Powered_Applications_-_screenshot.019ec0681f37.png&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;img-fluid mx-auto d-block &quot; src=&quot;https://files.realpython.com/media/How_to_Use_the_Claude_API_in_Python_for_AI-Powered_Applications_-_screenshot.019ec0681f37.png&quot; width=&quot;1822&quot; height=&quot;1320&quot; alt=&quot;How to Use the Claude API in Python for AI-Powered Applications&quot; /&gt;&lt;/a&gt;Example of Using the Claude API in Python

&lt;p&gt;&lt;a href=&quot;https://realpython.com/ref/ai-coding-tools/claude/&quot; class=&quot;ref-link&quot;&gt;Claude&lt;/a&gt; is Anthropic’s &lt;a href=&quot;https://realpython.com/ref/ai-coding-glossary/llm/&quot; class=&quot;ref-link&quot;&gt;large language model&lt;/a&gt;, accessible via a clean &lt;a href=&quot;https://realpython.com/api-integration-in-python/&quot;&gt;REST API&lt;/a&gt; with an official Python SDK. Unlike heavier AI frameworks that require you to wire up multiple components before you see any output, the &lt;code&gt;anthropic&lt;/code&gt; package gets you to a working response in a handful of lines.&lt;/p&gt;
&lt;p&gt;In the following steps, you’ll install the &lt;code&gt;anthropic&lt;/code&gt; SDK, call Claude from Python, shape Claude’s behavior with a &lt;a href=&quot;https://realpython.com/ref/ai-coding-glossary/system-prompt/&quot; class=&quot;ref-link&quot;&gt;system prompt&lt;/a&gt;, and then return structured &lt;a href=&quot;https://realpython.com/python-json/&quot;&gt;JSON&lt;/a&gt; output using a schema or &lt;a href=&quot;https://realpython.com/python-pydantic/&quot;&gt;Pydantic&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Claude’s responses are non-deterministic, so the same prompt produces different output each time, which is expected for a large language model. Also, API calls cost money based on the number of &lt;a href=&quot;https://realpython.com/ref/ai-coding-glossary/token/&quot; class=&quot;ref-link&quot;&gt;tokens&lt;/a&gt; processed. Keep an eye on your usage in the Claude Console as you follow along.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Each step builds on the last, and the final script is short enough to read in one sitting but complete enough to extend into a real application of your own.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot;&gt;
&lt;p&gt;&lt;strong&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/claude-api-python-code/&quot; class=&quot;alert-link&quot;&gt;Click here to download the free sample code&lt;/a&gt; that shows you how to use the Claude API in Python.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt; Test your knowledge with our interactive “How to Use the Claude API in Python” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr /&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;https://realpython.com/quizzes/claude-api-python/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; alt=&quot;Two people at a service counter labeled Claude API, where a robot behind the window prints out a long paper response, with a Python logo on the counter.&quot; src=&quot;https://files.realpython.com/media/How-to-Use-the-Claude-API-in-Python-for-AI-Powered-Applications_Watermarked.2bd1f7ed4e48.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;https://realpython.com/quizzes/claude-api-python/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;How to Use the Claude API in Python&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your understanding of using the Claude API in Python. Send prompts, set system instructions, and return structured JSON with a schema.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#prerequisites&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before diving in, make sure you have the following in place:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Python knowledge:&lt;/strong&gt; You should be comfortable with Python basics, like &lt;a href=&quot;https://realpython.com/defining-your-own-python-function/&quot;&gt;defining functions&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/run-python-scripts/&quot;&gt;running scripts&lt;/a&gt; from the terminal, and working with &lt;a href=&quot;https://realpython.com/ref/glossary/virtual-environment/&quot; class=&quot;ref-link&quot;&gt;virtual environments&lt;/a&gt;. If virtual environments are new to you, &lt;a href=&quot;https://realpython.com/python-virtual-environments-a-primer/&quot;&gt;Python Virtual Environments: A Primer&lt;/a&gt; has you covered before you continue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Python 3.9 or higher:&lt;/strong&gt; The &lt;code&gt;anthropic&lt;/code&gt; SDK requires Python 3.9 as a minimum. If you’re not sure which version you have, run &lt;code&gt;python --version&lt;/code&gt; in your terminal. If you need to install or upgrade, follow the steps in the &lt;a href=&quot;https://realpython.com/installing-python/&quot;&gt;guide on installing Python&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;An Anthropic account:&lt;/strong&gt; You’ll need an Anthropic account to generate an API key in the Claude Console. Step 1 will show you how to find and secure your key once you’re in.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don’t worry if you’ve never worked with an &lt;a href=&quot;https://realpython.com/ref/glossary/api/&quot; class=&quot;ref-link&quot;&gt;API&lt;/a&gt; before. This tutorial will walk you through authentication and help you make your first request from scratch.&lt;/p&gt;
&lt;h2 id=&quot;step-1-set-up-the-claude-api-in-python&quot;&gt;Step 1: Set Up the Claude API in Python&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#step-1-set-up-the-claude-api-in-python&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before you can call Claude from Python, you need an API key and the &lt;code&gt;anthropic&lt;/code&gt; package installed. By the end of this step, you’ll have both, and Claude will be responding to your first prompt.&lt;/p&gt;
&lt;h3 id=&quot;get-your-api-key-and-install-anthropic&quot;&gt;Get Your API Key and Install &lt;code&gt;anthropic&lt;/code&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#get-your-api-key-and-install-anthropic&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Log in to the &lt;a href=&quot;https://console.anthropic.com/&quot;&gt;Claude Console&lt;/a&gt; or create a new account. If you’re starting fresh, you can begin using the API after adding $5 of credits.&lt;/p&gt;
&lt;p&gt;Then navigate to the API Keys section. Click &lt;em&gt;Create Key&lt;/em&gt;, give it a descriptive name like &lt;code&gt;real-python-tutorial&lt;/code&gt;, and copy it immediately. You won’t see it again after you close the dialog.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Never paste your API key directly into your code. Instead, store it as an &lt;a href=&quot;https://realpython.com/ref/stdlib/os/&quot; class=&quot;ref-link&quot;&gt;environment variable&lt;/a&gt;. The &lt;code&gt;anthropic&lt;/code&gt; SDK automatically reads it from &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; at runtime, so you never need to reference it explicitly in your scripts.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Storing your key as an environment variable means it never touches your source code or version control history. The exact command depends on your operating system:&lt;/p&gt;
&lt;ul class=&quot;nav nav-tabs justify-content-end js-platform-widget-tabs&quot;&gt;

  &lt;li class=&quot;nav-item mb-0 js-platform-widget-tab-windows&quot;&gt;
    &lt;a class=&quot;nav-link link-unstyled text-body active small&quot; id=&quot;windows-tab-1&quot; href=&quot;https://realpython.com/atom.xml#windows-1&quot;&gt;&lt;span class=&quot;icon baseline text-muted mr-1&quot;&gt;&lt;/span&gt;Windows&lt;/a&gt;
  &lt;/li&gt;




  &lt;li class=&quot;nav-item mb-0 js-platform-widget-tab-linuxmacos&quot;&gt;
    &lt;a class=&quot;nav-link link-unstyled text-body small&quot; id=&quot;macos-tab-1&quot; href=&quot;https://realpython.com/atom.xml#linux-macos-1&quot;&gt;&lt;span class=&quot;icon baseline text-muted&quot;&gt;&lt;/span&gt;&lt;span class=&quot;icon baseline text-muted mr-1&quot;&gt;&lt;/span&gt;Linux + macOS&lt;/a&gt;
  &lt;/li&gt;

&lt;/ul&gt;
&lt;div class=&quot;tab-content mt-2 mb-0 js-platform-widget-content&quot;&gt;
&lt;div class=&quot;tab-pane fade show active&quot; id=&quot;windows-1&quot;&gt;

  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;PowerShell Script&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;PS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$env:ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;your-api-key-here&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;/div&gt;
&lt;div class=&quot;tab-pane fade &quot; id=&quot;linux-macos-1&quot;&gt;

  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot;&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;your-api-key-here&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With your API key stored safely, you’re ready to install the SDK. Create a fresh virtual environment and activate it before installing anything. This isolation prevents the &lt;code&gt;anthropic&lt;/code&gt; package from conflicting with your system-level tools.&lt;/p&gt;
&lt;ul class=&quot;nav nav-tabs justify-content-end js-platform-widget-tabs&quot;&gt;

  &lt;li class=&quot;nav-item mb-0 js-platform-widget-tab-windows&quot;&gt;
    &lt;a class=&quot;nav-link link-unstyled text-body active small&quot; id=&quot;windows-tab-2&quot; href=&quot;https://realpython.com/atom.xml#windows-2&quot;&gt;&lt;span class=&quot;icon baseline text-muted mr-1&quot;&gt;&lt;/span&gt;Windows&lt;/a&gt;
  &lt;/li&gt;




  &lt;li class=&quot;nav-item mb-0 js-platform-widget-tab-linuxmacos&quot;&gt;
    &lt;a class=&quot;nav-link link-unstyled text-body small&quot; id=&quot;macos-tab-2&quot; href=&quot;https://realpython.com/atom.xml#linux-macos-2&quot;&gt;&lt;span class=&quot;icon baseline text-muted&quot;&gt;&lt;/span&gt;&lt;span class=&quot;icon baseline text-muted mr-1&quot;&gt;&lt;/span&gt;Linux + macOS&lt;/a&gt;
  &lt;/li&gt;

&lt;/ul&gt;
&lt;div class=&quot;tab-content mt-2 mb-0 js-platform-widget-content&quot;&gt;
&lt;div class=&quot;tab-pane fade show active&quot; id=&quot;windows-2&quot;&gt;

  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;PowerShell Script&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;PS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;python&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;venv&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;venv&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;PS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;venv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Scripts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;activate&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;venv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;python&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pip&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;anthropic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;/div&gt;
&lt;div class=&quot;tab-pane fade &quot; id=&quot;linux-macos-2&quot;&gt;

  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot;&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;python&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;venv&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;venv/
&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;venv/bin/activate
&lt;span class=&quot;gp gp-VirtualEnv&quot;&gt;(venv)&lt;/span&gt; &lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;python&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;install&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;anthropic
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&quot;send-your-first-prompt&quot;&gt;Send Your First Prompt&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#send-your-first-prompt&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/claude-api-python/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/claude-api-python/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2026 14:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Quiz: How to Use the Claude API in Python</title>
	<guid>https://realpython.com/quizzes/claude-api-python/</guid>
	<link>https://realpython.com/quizzes/claude-api-python/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test your knowledge of &lt;a href=&quot;https://realpython.com/claude-api-python/&quot;&gt;How to Use the Claude API in Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how to install the &lt;code&gt;anthropic&lt;/code&gt; SDK, send prompts to Claude with &lt;code&gt;client.messages.create()&lt;/code&gt;, shape responses with a system parameter, and return structured JSON output using a schema or Pydantic.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>Python GUIs: Adding QComboBox to a QTableView and getting/setting values after creation — Use QItemDelegate to embed combo boxes in your table views, with per-row data and value tracking</title>
	<guid>https://www.pythonguis.com/faq/adding-qcombobox-to-a-qtableview-and-getting-setting-values-after-creation/</guid>
	<link>https://www.pythonguis.com/faq/adding-qcombobox-to-a-qtableview-and-getting-setting-values-after-creation/</link>
	<description>&lt;blockquote&gt;
&lt;p&gt;I'm using a QTableView to display data, and would like to limit the choices in some of the fields using a drop-down. I can use &lt;code&gt;QComboBox&lt;/code&gt; to provide a list of choices in a normal UI, but how can I do that in a table view?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you're working with &lt;code&gt;QTableView&lt;/code&gt; in PyQt6, you'll sometimes want cells that offer a dropdown selection instead of plain text. A &lt;code&gt;QComboBox&lt;/code&gt; is the natural fit here &amp;mdash; but embedding one inside a table view takes a bit of wiring up.&lt;/p&gt;
&lt;p&gt;In this tutorial, we'll walk through how to use a &lt;code&gt;QItemDelegate&lt;/code&gt; to place a &lt;code&gt;QComboBox&lt;/code&gt; into specific cells of a &lt;code&gt;QTableView&lt;/code&gt;. We'll also cover how to populate each combo box with different items per row, and how to retrieve the selected value so you can use it elsewhere in your application.&lt;/p&gt;
&lt;h2 id=&quot;how-delegates-work-in-qts-modelview-framework&quot;&gt;How delegates work in Qt's Model/View framework&lt;/h2&gt;
&lt;p&gt;Qt's &lt;a href=&quot;https://www.pythonguis.com/tutorials/pyqt6-modelview-architecture/&quot;&gt;Model/View architecture&lt;/a&gt; separates your data (the model) from how it's displayed (the view). Between these two sits the &lt;strong&gt;delegate&lt;/strong&gt;, which controls how individual cells are rendered and edited. When you want a cell to use a widget like a combo box instead of a plain text editor, you create a custom delegate.&lt;/p&gt;
&lt;p&gt;The delegate has a few methods you'll override:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;createEditor()&lt;/code&gt; &amp;mdash; creates the widget (in our case, a &lt;code&gt;QComboBox&lt;/code&gt;) when the user starts editing a cell.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setEditorData()&lt;/code&gt; &amp;mdash; populates the editor widget with the current data from the model.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setModelData()&lt;/code&gt; &amp;mdash; writes the user's selection back into the model.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updateEditorGeometry()&lt;/code&gt; &amp;mdash; makes sure the widget is sized and positioned correctly inside the cell.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let's build this up step by step.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-the-model-and-view&quot;&gt;Setting up the model and view&lt;/h2&gt;
&lt;p&gt;First, let's create a simple application with a &lt;code&gt;QTableView&lt;/code&gt; and a &lt;code&gt;QStandardItemModel&lt;/code&gt;. Each row will represent a software package, and one of the columns will hold a list of available versions. We'll store those version lists directly in the model data, so each row can have its own set of options.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import sys
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableView, QComboBox, QItemDelegate,
)
from PyQt6.QtGui import QStandardItemModel, QStandardItem
from PyQt6.QtCore import Qt, QItemDataRole


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;QComboBox in QTableView&quot;)

        self.table = QTableView()
        self.setCentralWidget(self.table)

        # Create a model with 3 rows and 2 columns.
        self.model = QStandardItemModel(3, 2)
        self.model.setHorizontalHeaderLabels([&quot;Package&quot;, &quot;Version&quot;])

        # Each row has a package name and a list of available versions.
        packages = [
            (&quot;Widget Library&quot;, [&quot;1.0&quot;, &quot;1.1&quot;, &quot;2.0&quot;, &quot;2.1&quot;]),
            (&quot;Data Toolkit&quot;, [&quot;0.9&quot;, &quot;1.0&quot;]),
            (&quot;Render Engine&quot;, [&quot;3.0&quot;, &quot;3.1&quot;, &quot;3.2&quot;, &quot;4.0&quot;]),
        ]

        for row, (name, versions) in enumerate(packages):
            # Column 0: package name (plain text).
            self.model.setItem(row, 0, QStandardItem(name))

            # Column 1: store the version list in the item's data.
            # We use Qt.ItemDataRole.UserRole to keep the full list alongside the display text.
            item = QStandardItem(versions[-1])  # Display the latest version by default.
            item.setData(versions, Qt.ItemDataRole.UserRole)
            self.model.setItem(row, 1, item)

        self.table.setModel(self.model)

        # Apply our custom delegate to column 1.
        delegate = ComboDelegate(self.table)
        self.table.setItemDelegateForColumn(1, delegate)

        self.resize(400, 200)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice how we store the list of versions using &lt;code&gt;Qt.ItemDataRole.UserRole&lt;/code&gt;. This is a custom data role &amp;mdash; it lets us attach extra information to a model item without interfering with the text that's displayed (which uses &lt;code&gt;Qt.ItemDataRole.DisplayRole&lt;/code&gt;). Each row gets its own version list, so when the combo box opens, it will show only the versions relevant to that row.&lt;/p&gt;
&lt;h2 id=&quot;creating-the-combo-box-delegate&quot;&gt;Creating the combo box delegate&lt;/h2&gt;
&lt;p&gt;Now let's write the &lt;code&gt;ComboDelegate&lt;/code&gt; class. This is where the combo box gets created and connected to the model.&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;class ComboDelegate(QItemDelegate):
    &quot;&quot;&quot;
    A delegate that places a QComboBox in cells of the assigned column.
    &quot;&quot;&quot;

    def createEditor(self, parent, option, index):
        # Create the combo box and populate it with the version list for this row.
        combo = QComboBox(parent)
        versions = index.data(Qt.ItemDataRole.UserRole)
        if versions:
            combo.addItems(versions)
        return combo

    def setEditorData(self, editor, index):
        # Set the combo box to show the currently selected value.
        current_text = index.data(Qt.ItemDataRole.DisplayRole)
        idx = editor.findText(current_text)
        if idx &amp;gt;= 0:
            editor.setCurrentIndex(idx)

    def setModelData(self, editor, model, index):
        # Write the selected value back into the model.
        model.setData(index, editor.currentText(), Qt.ItemDataRole.DisplayRole)

    def updateEditorGeometry(self, editor, option, index):
        editor.setGeometry(option.rect)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Let's walk through each method:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;createEditor()&lt;/code&gt;&lt;/strong&gt; is called when the user double-clicks (or otherwise activates) a cell in column 1. We create a fresh &lt;code&gt;QComboBox&lt;/code&gt;, pull the version list from &lt;code&gt;Qt.ItemDataRole.UserRole&lt;/code&gt; for that specific row, and add those items to the combo box. Because each row stores its own list, different rows will show different options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;setEditorData()&lt;/code&gt;&lt;/strong&gt; makes sure the combo box starts with the right item selected. We read the current display text from the model and find the matching entry in the combo box.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;setModelData()&lt;/code&gt;&lt;/strong&gt; fires when the user finishes editing (for example, by clicking away from the cell). It takes whatever the user selected in the combo box and writes it back into the model's &lt;code&gt;DisplayRole&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;updateEditorGeometry()&lt;/code&gt;&lt;/strong&gt; simply ensures the combo box fills the cell neatly.&lt;/p&gt;
&lt;h2 id=&quot;running-the-application&quot;&gt;Running the application&lt;/h2&gt;
&lt;p&gt;Add the standard entry point at the bottom of your script:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Run the script and double-click any cell in the &quot;Version&quot; column. You'll see a combo box appear with the version options for that specific row. Select a value, click away, and the cell updates.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;QTableView with combo box delegates showing per-row version lists&quot; src=&quot;https://www.pythonguis.com/feeds/combo-delegate-table.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;getting-the-selected-value&quot;&gt;Getting the selected value&lt;/h2&gt;
&lt;p&gt;After the user makes a selection, the value is stored in the model. You can read it at any time:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;# Read the selected version for row 0.
selected = self.model.item(0, 1).text()
print(f&quot;Row 0 selected version: {selected}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you want to react immediately when a selection changes, you can connect to the model's &lt;code&gt;dataChanged&lt;/code&gt; signal. If you're new to how signals work in Qt, see our guide on &lt;a href=&quot;https://www.pythonguis.com/tutorials/pyqt6-signals-slots-events/&quot;&gt;signals, slots and events&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;self.model.dataChanged.connect(self.on_data_changed)

def on_data_changed(self, top_left, bottom_right, roles):
    if top_left.column() == 1:
        row = top_left.row()
        value = top_left.data(Qt.ItemDataRole.DisplayRole)
        print(f&quot;Row {row} version changed to: {value}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This approach keeps things nicely separate &amp;mdash; you're working through the model rather than trying to hold references to individual combo box widgets. The combo boxes are created and destroyed as the user interacts with cells.&lt;/p&gt;
&lt;h2 id=&quot;setting-a-value-programmatically&quot;&gt;Setting a value programmatically&lt;/h2&gt;
&lt;p&gt;To change a cell's value from code, update the model directly:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;# Set row 2's version to &quot;3.1&quot;.
self.model.item(2, 1).setText(&quot;3.1&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The next time the user opens the combo box on that row, the delegate's &lt;code&gt;setEditorData()&lt;/code&gt; will position the combo box on &quot;3.1&quot;.&lt;/p&gt;
&lt;p&gt;You can also update the list of available versions for a row:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;# Add a new version to row 1's options.
item = self.model.item(1, 1)
versions = item.data(Qt.ItemDataRole.UserRole)
versions.append(&quot;1.1&quot;)
item.setData(versions, Qt.ItemDataRole.UserRole)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id=&quot;why-each-row-gets-its-own-combo-box-items&quot;&gt;Why each row gets its own combo box items&lt;/h2&gt;
&lt;p&gt;A common stumbling block is ending up with the same items in every combo box across the column. This happens when you store the item list on the delegate itself (as a single shared list) rather than on the model. Since the delegate is shared across all rows, any list stored on it will be the same everywhere.&lt;/p&gt;
&lt;p&gt;The solution, as we've done here, is to store per-row data in the model using &lt;code&gt;Qt.ItemDataRole.UserRole&lt;/code&gt;. Each call to &lt;code&gt;createEditor()&lt;/code&gt; reads from the specific index it's given, so each row naturally gets its own set of options. This is a pattern you'll use often when different rows need different editor configurations.&lt;/p&gt;
&lt;h2 id=&quot;complete-code&quot;&gt;Complete code&lt;/h2&gt;
&lt;p&gt;Here's the full working example in one block:&lt;/p&gt;
&lt;div class=&quot;code-block&quot;&gt;
&lt;span class=&quot;code-block-language code-block-python&quot;&gt;python&lt;/span&gt;
&lt;pre&gt;&lt;code class=&quot;python&quot;&gt;import sys
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QTableView, QComboBox, QItemDelegate,
)
from PyQt6.QtGui import QStandardItemModel, QStandardItem
from PyQt6.QtCore import Qt


class ComboDelegate(QItemDelegate):
    &quot;&quot;&quot;
    A delegate that places a QComboBox in cells of the assigned column.
    &quot;&quot;&quot;

    def createEditor(self, parent, option, index):
        combo = QComboBox(parent)
        versions = index.data(Qt.ItemDataRole.UserRole)
        if versions:
            combo.addItems(versions)
        return combo

    def setEditorData(self, editor, index):
        current_text = index.data(Qt.ItemDataRole.DisplayRole)
        idx = editor.findText(current_text)
        if idx &amp;gt;= 0:
            editor.setCurrentIndex(idx)

    def setModelData(self, editor, model, index):
        model.setData(index, editor.currentText(), Qt.ItemDataRole.DisplayRole)

    def updateEditorGeometry(self, editor, option, index):
        editor.setGeometry(option.rect)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(&quot;QComboBox in QTableView&quot;)

        self.table = QTableView()
        self.setCentralWidget(self.table)

        self.model = QStandardItemModel(3, 2)
        self.model.setHorizontalHeaderLabels([&quot;Package&quot;, &quot;Version&quot;])

        packages = [
            (&quot;Widget Library&quot;, [&quot;1.0&quot;, &quot;1.1&quot;, &quot;2.0&quot;, &quot;2.1&quot;]),
            (&quot;Data Toolkit&quot;, [&quot;0.9&quot;, &quot;1.0&quot;]),
            (&quot;Render Engine&quot;, [&quot;3.0&quot;, &quot;3.1&quot;, &quot;3.2&quot;, &quot;4.0&quot;]),
        ]

        for row, (name, versions) in enumerate(packages):
            self.model.setItem(row, 0, QStandardItem(name))
            item = QStandardItem(versions[-1])
            item.setData(versions, Qt.ItemDataRole.UserRole)
            self.model.setItem(row, 1, item)

        self.table.setModel(self.model)

        delegate = ComboDelegate(self.table)
        self.table.setItemDelegateForColumn(1, delegate)

        # React to changes.
        self.model.dataChanged.connect(self.on_data_changed)

        self.resize(400, 200)

    def on_data_changed(self, top_left, bottom_right, roles):
        if top_left.column() == 1:
            row = top_left.row()
            value = top_left.data(Qt.ItemDataRole.DisplayRole)
            print(f&quot;Row {row} version changed to: {value}&quot;)


app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Using a custom &lt;code&gt;QItemDelegate&lt;/code&gt; gives you full control over how cells in a &lt;code&gt;QTableView&lt;/code&gt; are edited. By storing per-row data in the model with &lt;code&gt;Qt.ItemDataRole.UserRole&lt;/code&gt;, you can give each combo box its own set of items &amp;mdash; solving the common problem of all combo boxes showing the same options.&lt;/p&gt;
&lt;p&gt;The pattern here &amp;mdash; store data in the model, read it in the delegate, write changes back to the model &amp;mdash; works well beyond combo boxes. You can use the same approach to embed spin boxes, date pickers, or any other widget into your table cells. Once you're comfortable with this flow, you'll find Qt's Model/View framework surprisingly flexible. For a deeper dive into using &lt;code&gt;QTableView&lt;/code&gt; with real-world data sources like NumPy and Pandas, see our &lt;a href=&quot;https://www.pythonguis.com/tutorials/pyqt6-qtableview-modelviews-numpy-pandas/&quot;&gt;QTableView with numpy and pandas&lt;/a&gt; tutorial. You can also explore how to &lt;a href=&quot;https://www.pythonguis.com/faq/editing-pyqt6-tableview/&quot;&gt;make table cells editable&lt;/a&gt; for other common editing patterns.&lt;/p&gt;
            &lt;p&gt;For an in-depth guide to building Python GUIs with PyQt6 see my book, &lt;a href=&quot;https://www.pythonguis.com/pyqt6-book/&quot;&gt;Create GUI Applications with Python &amp;amp; Qt6.&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 20 May 2026 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Kay Hayen: Nuitka Release 4.1</title>
	<guid>https://nuitka.net/posts/nuitka-release-41.html</guid>
	<link>https://nuitka.net/posts/nuitka-release-41.html</link>
	<description>&lt;p&gt;This is to inform you about the new stable release of &lt;a class=&quot;reference external&quot; href=&quot;https://nuitka.net&quot;&gt;Nuitka&lt;/a&gt;. It is the extremely compatible Python compiler,
&lt;a class=&quot;reference external&quot; href=&quot;https://nuitka.net/doc/download.html&quot;&gt;“download now”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release adds many new features and corrections with a focus on
async code compatibility, missing generics features, and Python 3.14
compatibility and Python compilation scalability yet again.&lt;/p&gt;

&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Fix, decorators were breaking when disabling
deferred annotations. (Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, nested loops could have wrong traces lead to mis-optimization.
(Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Fix, run-time check of package configuration was
incorrect. (Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;__builtins__&lt;/span&gt;&lt;/code&gt; lacked necessary
compatibility in compiled functions. (Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distutils:&lt;/strong&gt; Fix, incorrect UTF-8 decoding was used for TOML input
file parsing. (Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, multiple hard value assignments could cause compile time
crashes. (Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, string concatenation was not properly annotating exception
exits. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--verbose-output&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--show-modules-output&lt;/span&gt;&lt;/code&gt;
did not work with forward slashes. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Fix, there were various compatibility issues
including dictionary watchers and inline values. (Fixed in 4.0.2
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Fix, stack pointer initialization to &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;localsplus&lt;/span&gt;&lt;/code&gt;
was incorrect to avoid garbage collection issues. (Fixed in 4.0.2
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Fix, generic type variable scoping in classes was
incorrect. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Fix, there were various issues with function
generics. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.8+:&lt;/strong&gt; Fix, names in named expressions were not mangled.
(Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Fix, module checksums were not robust against quoting
style of module-name entry in YAML configurations. (Fixed in 4.0.2
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Fix, doing imports in queried expressions caused
corruption. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Fix, support for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;uv_build&lt;/span&gt;&lt;/code&gt; in the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--project&lt;/span&gt;&lt;/code&gt; option was
broken. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility:&lt;/strong&gt; Fix, names assigned in assignment expressions were
not mangled. (Fixed in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Fix, there were still various issues with function
generics. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clang:&lt;/strong&gt; Fix, debug mode was disabled for clang generally, but only
ClangCL and macOS Clang didn’t want it. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zig:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--windows-console-mode=attach|disable&lt;/span&gt;&lt;/code&gt; was not
working when using Zig. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Fix, yet another way self dependencies can look like,
needed to have support added. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Fix, generic types in classes had bugs with
multiple type variables. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Fix, repeated builds were not producing binary identical
results. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Fix, compiling with newer Python versions did not fall
back to Zig when the developer prompt MSVC was unusable, and error
reporting could crash. (Fixed in 4.0.4 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zig:&lt;/strong&gt; Fix, the workaround for Windows console mode &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;attach&lt;/span&gt;&lt;/code&gt; or
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;disable&lt;/span&gt;&lt;/code&gt; was incorrectly applied on non-Windows platforms. (Fixed
in 4.0.4 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Fix, linking with Python Build Standalone failed
because &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;libHacl_Hash_SHA2&lt;/span&gt;&lt;/code&gt; was not filtered out unconditionally.
(Fixed in 4.0.4 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.6+:&lt;/strong&gt; Fix, exceptions like &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;CancelledError&lt;/span&gt;&lt;/code&gt; thrown into
an async generator awaiting an inner awaitable could be swallowed,
causing crashes. (Fixed in 4.0.4 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, not all ordered set modules accepted generators for update.
(Fixed in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Disabled warning about rebuilding the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pytokens&lt;/span&gt;&lt;/code&gt;
extension module. (Fixed in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Filtered &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;libHacl_Hash_SHA2&lt;/span&gt;&lt;/code&gt; from link libs
unconditionally. (Fixed in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Disabled unusable unicode consistency checks for
Python versions 3.4 to 3.6. (Fixed in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python3.12+&lt;/strong&gt; Avoided cloning call nodes on class level which
caused issues with generic functions in combination with decorators.
(Added in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Added support for generic type variables in &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;async&lt;/span&gt;
&lt;span class=&quot;pre&quot;&gt;def&lt;/span&gt;&lt;/code&gt; functions. (Added in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Fix, flushing outputs for prompts was not working in all
cases when progress bars were enabled. (Fixed in 4.0.6 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Fix, unused variable warnings were missing at C compile time
when using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;zig&lt;/span&gt;&lt;/code&gt; as a C compiler. (Fixed in 4.0.6 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Fix, forced stdout and stderr paths as a feature was
broken. (Fixed in 4.0.6 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, replacing a branch did not accurately track shared active
variables causing optimization crashes. (Fixed in 4.0.7 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Fix, failed to remove extended attributes because files
need to be made writable first. (Fixed in 4.0.7 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, dict &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pop&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;setdefault&lt;/span&gt;&lt;/code&gt; using with &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;:=&lt;/span&gt;&lt;/code&gt; rewrites
lacked exception-exit annotations for un-hashable keys. (Fixed in
4.0.8 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.13:&lt;/strong&gt; Fix, the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;__parameters__&lt;/span&gt;&lt;/code&gt; attribute of generic
classes was not working. (Fixed in 4.0.8 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.11+:&lt;/strong&gt; Fix, starred arguments were not working as type
variables. (Fixed in 4.0.8 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python2:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;FileNotFoundError&lt;/span&gt;&lt;/code&gt; compatibility fallback
handling was not working properly. (Fixed in 4.0.8 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility:&lt;/strong&gt; Fix, loop ownership check in value traces was
missing, causing issues with nested loops.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Improved &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--windows-console-mode=attach&lt;/span&gt;&lt;/code&gt; to properly
handle console handles, enabling cases like &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;os.system&lt;/span&gt;&lt;/code&gt; to work
nicely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python2:&lt;/strong&gt; Fix, there was a compatibility issue where providing
default values to the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;mkdtemp&lt;/span&gt;&lt;/code&gt; function was failing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Fix, there were spurious issues with C23 embedding in
32-bit MinGW64 by switching to &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;coff_obj&lt;/span&gt;&lt;/code&gt; resource mode for it as
well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Fix, the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;post-import-code&lt;/span&gt;&lt;/code&gt; execution could fail
because the triggering sub-package was not yet available in
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;sys.modules&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Fix, listing package DLLs with &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--list-package-dlls&lt;/span&gt;&lt;/code&gt; was
broken due to recent plugin lifecycle changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--list-package-exe&lt;/span&gt;&lt;/code&gt; was not working properly on
non-Windows platforms failing to detect executable files correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Handled paths starting with &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;{PROGRAM_DIR}&lt;/span&gt;&lt;/code&gt; the same as a
relative path when parsing the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--onefile-tempdir-spec&lt;/span&gt;&lt;/code&gt; option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Followed multiprocessing &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;forkserver&lt;/span&gt;&lt;/code&gt; changes for
newer Python versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Fix, generic class type parameters handling was
incorrect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12:&lt;/strong&gt; Fix, deferred evaluation of type aliases was
failing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.12+:&lt;/strong&gt; Aligned &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;sum&lt;/span&gt;&lt;/code&gt; built-in float summation with
CPython’s compensated sum for better accuracy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.10+:&lt;/strong&gt; Fix, uncompiled coroutine &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;throw()&lt;/span&gt;&lt;/code&gt; return
handling was incorrect, restoring completed coroutine results via
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;StopIteration.value&lt;/span&gt;&lt;/code&gt; rather than exposing them as ordinary return
values to the outer await chain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.13+:&lt;/strong&gt; Fix, uncompiled coroutine &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;cancel()/await&lt;/span&gt;&lt;/code&gt;
suspension handling was incorrect, improved to ensure integration
compatibility.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Made finding &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;create-dmg&lt;/span&gt;&lt;/code&gt; more robustly by also checking
the Homebrew path for Intel and from &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PATH&lt;/span&gt;&lt;/code&gt; properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility:&lt;/strong&gt; Fix, class frames were not exposing frame locals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Detected &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;static-libpython&lt;/span&gt;&lt;/code&gt; problems, which affected some
forms of Anaconda.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distutils:&lt;/strong&gt; Rejected &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--project&lt;/span&gt;&lt;/code&gt; mixed with &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--main&lt;/span&gt;&lt;/code&gt; arguments
as it is not useful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;zig&lt;/span&gt;&lt;/code&gt; from &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PATH&lt;/span&gt;&lt;/code&gt; or from &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;ziglang&lt;/span&gt;&lt;/code&gt; was not
being used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distutils:&lt;/strong&gt; Fix, the wrong &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;module-root&lt;/span&gt;&lt;/code&gt; config value was being
checked for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;uv&lt;/span&gt;&lt;/code&gt; build backend.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Fix, was attempting to change removed (rejected) DLLs,
which of course failed and errored out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Fix, tuple reuse was not fully compatible,
potentially causing crashes due to outdated hash caches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, fake modules were still being attempted to located when imported
by other code, which could conflict with existing modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.5+:&lt;/strong&gt; Fix, failed to send uncompiled coroutines the sent
in value in &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;from&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, older &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;gcc&lt;/span&gt;&lt;/code&gt; compilers lacking newer intrinsic methods had
compilation issues that needed to be addressed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Fix, multiphase module extension modules with
post-load code were not working properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, Avoid using the non-inline copy of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pkg_resources&lt;/span&gt;&lt;/code&gt; with the
inline copy of Jinja2. These could mismatch and cause errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, loops could make releasing of previous values very unclear,
causing optimization errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;incbin&lt;/span&gt;&lt;/code&gt; resource mode was not working with old &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;gcc&lt;/span&gt;&lt;/code&gt; C++
fallback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.4 to 3.6:&lt;/strong&gt; Fix, bytecode demotion was not working
properly for these versions, also bytecode only files not working.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Added a check for the broken &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;patchelf&lt;/span&gt;&lt;/code&gt; versions 0.10
and 0.11 to prevent breaking Qt plugins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Android:&lt;/strong&gt; Allowed &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;patchelf&lt;/span&gt;&lt;/code&gt; version 0.18 on Android.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Fix, the header path for self uninstalled Python was not
detected correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; Fix, inclusion of the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pkg_resources&lt;/span&gt;&lt;/code&gt; inline copy for
Python 2 to source distributions was missing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Detected the OBS versions of SUSE Linux better.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Suse:&lt;/strong&gt; Allowed using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;patchelf&lt;/span&gt;&lt;/code&gt; 0.18.0 there too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.11:&lt;/strong&gt; Fix, package and module dicts were not aligned close
enough to avoid a CPython bug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, unbound compiled methods could crash when called without an
object passed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Fix, multiphase module extension modules with
postload. (Fixed in 4.0.8 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onefile:&lt;/strong&gt; Fix, while waiting for the child, it may already be
terminated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Removed existing absolute rpaths for Homebrew and
MacPorts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Avoided warning in CPython headers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Followed allocator changes more closely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibility:&lt;/strong&gt; Avoided using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pkg_resources&lt;/span&gt;&lt;/code&gt; for Jinja2
template location for loading.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No-GIL:&lt;/strong&gt; Applied some bug fixes to get basic things to work.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Package Support&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Add support for newer &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;paddle&lt;/span&gt;&lt;/code&gt; version. (Added in
4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Add workaround for refcount checks of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pandas&lt;/span&gt;&lt;/code&gt;.
(Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Add support for newer &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;h5py&lt;/span&gt;&lt;/code&gt; version. (Added in
4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Add support for newer &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;scipy&lt;/span&gt;&lt;/code&gt; package. (Added in
4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Revert accidental &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;os.getenv&lt;/span&gt;&lt;/code&gt; over &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;os.environ.get&lt;/span&gt;&lt;/code&gt;
changes in anti-bloat configurations that stopped them from working.
Affected packages are &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;networkx&lt;/span&gt;&lt;/code&gt;, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;persistent&lt;/span&gt;&lt;/code&gt;, and
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;tensorflow&lt;/span&gt;&lt;/code&gt;. (Fixed in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Added missing DLLs for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;openvino&lt;/span&gt;&lt;/code&gt;. (Added in 4.0.7
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced the package configuration YAML schema by adding the
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;relative_to&lt;/span&gt;&lt;/code&gt; parameter for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;from_filenames&lt;/span&gt;&lt;/code&gt; DLL specification,
avoiding error-prone purely relative paths.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;flet_desktop&lt;/span&gt;&lt;/code&gt; app assets were missing, now
preserving the packaged runtime and sidecar DLLs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Added support for the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;tyro&lt;/span&gt;&lt;/code&gt; package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Added data files for the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;perfetto&lt;/span&gt;&lt;/code&gt; package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Added support for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;anyio&lt;/span&gt;&lt;/code&gt; process forking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Added support for the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;plotly.graph&lt;/span&gt;&lt;/code&gt; package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anaconda:&lt;/strong&gt; Fix, dependencies for the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;numpy&lt;/span&gt;&lt;/code&gt; conda package on
Windows were incorrect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Enhanced the auto-icon hack in PySide6 to use compatible
class names.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standalone:&lt;/strong&gt; Fix, Qt libraries were duplicated with &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PySide6&lt;/span&gt;&lt;/code&gt;
WebEngine framework support on macOS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Fix, automatic detection of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;mypyc&lt;/span&gt;&lt;/code&gt; runtime
dependencies was including all top level modules of the containing
package by accident. (Fixed in 4.0.5 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anaconda:&lt;/strong&gt; Fix, &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;delvewheel&lt;/span&gt;&lt;/code&gt; plugin was not working with Python
3.8+. This enhances compatibility with installed PyPI packages that
use it for their DLLs. (Fixed in 4.0.6 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Fix, our protection workaround could confuse methods
used with &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PySide6&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;New Features&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Added the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--recommended-python-version&lt;/span&gt;&lt;/code&gt; option to display
recommended Python versions for supported, working, or commercial
usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Add message to inform users about &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;Nuitka[onefile]&lt;/span&gt;&lt;/code&gt; if
compression is not installed. (Added in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Add support for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;uv_build&lt;/span&gt;&lt;/code&gt; in the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--project&lt;/span&gt;&lt;/code&gt; option.
(Added in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onefile:&lt;/strong&gt; Allow extra includes as well. (Added in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Add &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;nuitka-project-set&lt;/span&gt;&lt;/code&gt; feature to define project
variables, checking for collisions with reserved runtime variables.
(Added in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Added new option to select &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--reproducible&lt;/span&gt;&lt;/code&gt; builds or
not. (Added in 4.0.6 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.10+:&lt;/strong&gt; Added support for
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;importlib.metadata.package_distributions()&lt;/span&gt;&lt;/code&gt;. (Added in 4.0.8
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Added support for the multiprocessing &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;forkserver&lt;/span&gt;&lt;/code&gt;
context. (Added in 4.0.8 already, for 4.1 Python 3.6 and earlier, as
well as 3.14 support were added too.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reports:&lt;/strong&gt; Added structured resource usage (&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;rusage&lt;/span&gt;&lt;/code&gt;) performance
information to compilation reports.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reports:&lt;/strong&gt; Included individual module-level C compiler caching
(&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;ccache&lt;/span&gt;&lt;/code&gt;/&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;clcache&lt;/span&gt;&lt;/code&gt;) statistics in compilation reports.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for detecting and correctly resolving the Python prefix
for the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PyEnv&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;on&lt;/span&gt; &lt;span class=&quot;pre&quot;&gt;Homebrew&lt;/span&gt;&lt;/code&gt; Python flavor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Added support for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;rusage&lt;/span&gt;&lt;/code&gt; information for Scons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Added the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;__compiled__.extension_filename&lt;/span&gt;&lt;/code&gt; attribute to
give the real filename of the containing extension module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Added support for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--clang&lt;/span&gt;&lt;/code&gt; or ARM. (Added in 4.0.8
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Added support for resources names as not just integers,
important when we copy them from template files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MacPorts:&lt;/strong&gt; Added basic support for this Python flavor. More work
will be needed to get it to work fully though.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Optimization&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;Avoid including &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;importlib._bootstrap&lt;/span&gt;&lt;/code&gt; and
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;importlib._bootstrap_external&lt;/span&gt;&lt;/code&gt;. (Added in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt; Cached the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;syscall&lt;/span&gt;&lt;/code&gt; used for time keeping during
compilation to avoid loading &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;libc&lt;/span&gt;&lt;/code&gt; for each trace. (Added in 4.0.8
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Output a warning for modules that remain unfinished after the
third optimization pass.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added an extra micro pass trigger when new variables are introduced
or variable usage changes severely, ensuring optimizations are fully
propagated, avoiding unnecessary extra full passes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provided scripts to compile Python statically with PGO tailored for
Nuitka on Linux, Windows, and macOS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added support for running the Data Composer tool from a compiled
Nuitka binary without spawning an uncompiled Python process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced the usage of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;vectorcall&lt;/span&gt;&lt;/code&gt; for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PyCFunction&lt;/span&gt;&lt;/code&gt; objects by
directly checking for its presence instead of relying purely on
flags, allowing more frequent use of this faster execution path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cached frequently used declarations for top-level variables to speed
up C code generation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sped up trace collection merging by avoiding unnecessary set creation
and using a set instead of a list for escaped traces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimized plugin hook execution by tracking overloaded methods and
added an option to show plugin usage statistics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved performance of module location by avoiding unnecessary
module name reconstruction and redundant filesystem checks for
pre-loaded packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improved the caching of distribution name lookups to effectively
avoid repeated IO operations across all package types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plugins:&lt;/strong&gt; Cached callback plugin dispatch for
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;onFunctionBodyParsing&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;onClassBodyParsing&lt;/span&gt;&lt;/code&gt; to skip argument
computation when no plugin overrides them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.13:&lt;/strong&gt; Handled sub-packages of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pathlib&lt;/span&gt;&lt;/code&gt; as hard modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handled hard attributes through merge traces as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Made constant blobs more compact by avoiding repeated identifiers and
unnecessary fields.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enhanced Python compilation scripts further. (Fixed in 4.0.8
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recognized late incomplete variables better. (Fixed in 4.0.8
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Made constant blobs more compact. (Fixed in 4.0.8 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimized calls with only constant keywords and variable posargs too.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Anti-Bloat&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;Fix, memory bloat occurred when C compiling &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;sqlalchemy&lt;/span&gt;&lt;/code&gt;. (Fixed in
4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoid using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pydoc&lt;/span&gt;&lt;/code&gt; in &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;PySimpleGUI&lt;/span&gt;&lt;/code&gt;. (Added in 4.0.2 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoided using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;doctest&lt;/span&gt;&lt;/code&gt; from &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;zodbpickle&lt;/span&gt;&lt;/code&gt;. (Added in 4.0.5
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoided inclusion of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;cython&lt;/span&gt;&lt;/code&gt; when using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;pyav&lt;/span&gt;&lt;/code&gt;. (Added in 4.0.7
already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoided including &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;typing_extensions&lt;/span&gt;&lt;/code&gt; when using &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;numpy&lt;/span&gt;&lt;/code&gt;. (Added
in 4.0.7 already.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Organizational&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Relocated the warning about the available source code of
extension modules to be evaluated at a more appropriate time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debian:&lt;/strong&gt; Remove recommendation for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;libfuse2&lt;/span&gt;&lt;/code&gt; package as it is
no longer useful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debian:&lt;/strong&gt; Used &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;platformdirs&lt;/span&gt;&lt;/code&gt; instead of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;appdirs&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Removed Python 3.11+ restriction for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;clang-format&lt;/span&gt;&lt;/code&gt;
as it is available everywhere, even Python 2.7, and we still want
nicely formatted code when we read things. (Added in 4.0.6 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed no longer useful inline copy of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;wax_off&lt;/span&gt;&lt;/code&gt;. We have our own
stubs generator project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt; Added missing package to the CI container for building
Nuitka Debian packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Updated AI instructions for creating Minimal
Reproducible Examples (MRE) to skip unneeded C compilation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Added an internal function for checking if a string is
a valid Python identifier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; Added a task in Visual Studio Code to export the currently
selected Python interpreter path to a file, making it available as
“python” and “pip” matching the selected interpreter. This makes it
easier to use a specific version with no instructions needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI:&lt;/strong&gt; Updated the rules to instruct AI to only generate useful
comments that add context not present in the code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Containers:&lt;/strong&gt; Added template rendering support for Jinja2 (&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;.j2&lt;/span&gt;&lt;/code&gt;)
container files in our internal Podman tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt; Clarified the current status and rationale of Python
2.6 support in the developer manual.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Added experimental flag
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--experimental=ignore-extra-micro-pass&lt;/span&gt;&lt;/code&gt; to allow ignoring extra
micro pass detection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Visual Code:&lt;/strong&gt; Added integration scripts for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;bash&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;zsh&lt;/span&gt;&lt;/code&gt;
autocompletion of Nuitka CLI options. These are now also integrated
into Visual Studio Code terminal profiles and the Debian package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RPM:&lt;/strong&gt; Included the Python compile script for Linux.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RPM:&lt;/strong&gt; Removed the requirement for &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;distutils&lt;/span&gt;&lt;/code&gt; in the spec.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Tests&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;Install only necessary build tools for test cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoided spurious failures in reference counting tests due to Python
internal caching differences. (Fixed in 4.0.3 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, the parsing of the compilation report for reflected tests was
incorrect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Ignored a syntax error message change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Python 3.14:&lt;/strong&gt; Added test execution support options to the main
test runner to use this version as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, the runner binary path was mishandled for the third pass of
reflected compilations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed the usage of obsolete plugins in reflected compilation tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Prevented boolean testing of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;namedtuples&lt;/span&gt;&lt;/code&gt; to avoid
unexpected bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;Test&lt;/span&gt;&lt;/code&gt; suffix to syntax test files and disabled “python”
mode and spell checking for them to resolve issues reported in IDEs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix, newline handling in diff outputs from the output comparison tool
was incorrect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Covered &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;post-import-code&lt;/span&gt;&lt;/code&gt; functionality with a new subpackage test
case.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prevented the program test suite from running an unnecessary variant
to save execution time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Ignored differences from GUI framework error traces in
headless runs in output comparisons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reflected test for Nuitka, where it compiles itself and compares its
operation has been restored to functional state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Used the new method to clear internal caches if available for
reference counts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disabled running nested loops test with Python 2.6.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Containers:&lt;/strong&gt; Detected Python 2 defaulting containers in Podman
tooling.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Cleanups&lt;/h2&gt;
&lt;ul class=&quot;simple&quot;&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UI:&lt;/strong&gt; Fix, there was a double space in the Windows Runtime DLLs
inclusion message. (Fixed in 4.0.1 already.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onefile:&lt;/strong&gt; Separated files and defines for extra includes for
onefile boot and Python build.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Provided nicer errors in case of “unset” variables being
used, so we can tell it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Refactored the process execution results to correctly utilize our
&lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;namedtuples&lt;/span&gt;&lt;/code&gt; variant, that makes it easier to understand what code
does with the results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Enabled automatic conversion of em-dashes and en-dashes
in code comments to the autoformat tool. AI won’t stop producing them
and they can cause &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;SyntaxError&lt;/span&gt;&lt;/code&gt; for older Python versions, nor is
unnecessarily using UTF-8 welcome.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensured that cloned outline nodes are assigned their correct names
immediately upon creation, that avoids inconsistencies during their
creation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Updated to the latest versions of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;black&lt;/span&gt;&lt;/code&gt; and adopted
a faster &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;isort&lt;/span&gt;&lt;/code&gt; execution by caching results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Modified the PyLint wrapper to exit gracefully instead
of raising an error when no matching files require checking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Avoided checking YAML package configuration files twice,
since autoformat already handles them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Ensured that YAML package configuration checks output
the original filename instead of the temporary one when a failure
occurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Prevented pushing of tags from triggering git pre-push
quality checks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Silenced the output of &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;optipng&lt;/span&gt;&lt;/code&gt; and &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;jpegoptim&lt;/span&gt;&lt;/code&gt;
during image optimization auto-formatting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Visual Code:&lt;/strong&gt; Added the generated Python alias path file to the
ignore list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Enabled auto-formatting for the Nuitka devcontainer
configuration file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Watch:&lt;/strong&gt; Avoided absolute paths in compilation to make reports more
comparable across machines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Changed &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;mdformat&lt;/span&gt;&lt;/code&gt; checks to run only once and
silently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Disabled format security errors in debug mode and moved
Python-related warning disables into common build setup code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt; Updated to the latest &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;deepdiff&lt;/span&gt;&lt;/code&gt; version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scons:&lt;/strong&gt; Avoided MSVC telemetry since it can produce outputs that
break CI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Enhanced non-deployment handler for importing excluded
modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Split import module finding functionality into more pieces for
enhanced readability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Added more assertions for constants loading and
checking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Dropped the &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;universal&lt;/span&gt;&lt;/code&gt; target arch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Added more traces for deep hash verification.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This release builds on the scalability improvements established in 4.0,
with enhanced Python 3.14 support, expanded package compatibility, and
significant optimization work.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;docutils literal notranslate&quot;&gt;&lt;span class=&quot;pre&quot;&gt;--project&lt;/span&gt;&lt;/code&gt; option seems usable now.&lt;/p&gt;
&lt;p&gt;Python 3.14 support remains experimental, but only barely made the cut,
and probably will get there in hotfixes. Some of the corrections came in
so late before the release, that it was just not possible to feel good
about declaring it fully supported just yet.&lt;/p&gt;</description>
	<pubDate>Tue, 19 May 2026 22:00:00 +0000</pubDate>
</item>
<item>
	<title>PyCoder’s Weekly: Issue #735: Agentic Architecture, Python is Weird, 3.15, and More (2026-05-19)</title>
	<guid>https://pycoders.com/issues/735</guid>
	<link>https://pycoders.com/issues/735</link>
	<description>&lt;p&gt; &lt;span&gt;#735 – MAY 19, 2026&lt;/span&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/issues/735/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/16476/feed&quot; target=&quot;_blank&quot;&gt;Agentic Architecture: Why Files Aren&amp;rsquo;t Always Enough&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; What are the limitations of using a file-based agent workflow? Why do massive context windows tend to collapse? This week on the show, Mikiko Bazeley from MongoDB joins us to discuss agentic architecture and context engineering.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16476/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/16485/feed&quot; target=&quot;_blank&quot;&gt;Python Is Weird&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Here is a collection of things that surprised Maciej about Python. Some you might know and some that might surprise you too.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16485/feed&quot; target=&quot;_blank&quot;&gt;MACIEJ KOWALSKI&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/16493/feed&quot; target=&quot;_blank&quot;&gt;Harness Orchestration: The Next Primitive for AI Agents&lt;/a&gt;&lt;/h3&gt; &lt;a href=&quot;https://pycoders.com/link/16493/feed&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://cdn.pycoders.com/408649fcefb848c34806dcf2d3621f4c&quot; alt=&quot;alt&quot; /&gt;&lt;/a&gt; &lt;p&gt; A Python SDK that lets you compose Claude Code, Codex, and Gemini as one autonomous harness - agents become FastAPI-style routes you can wire, version, and deploy. Open source. Fork SWE-AF (a 100+ agent software factory) or our cloud-security harness as starter kits. &lt;a href=&quot;https://pycoders.com/link/16493/feed&quot; target=&quot;_blank&quot;&gt;Clone a Recipe →&lt;/a&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16493/feed&quot; target=&quot;_blank&quot;&gt;AGENTFIELD&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/16474/feed&quot; target=&quot;_blank&quot;&gt;Python 3.15: Features That Didn&amp;rsquo;t Make the Headlines&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Every release there are changes that don&amp;rsquo;t make the headlines, here are a few in the upcoming Python 3.15 release&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16474/feed&quot; target=&quot;_blank&quot;&gt;CHANGS.CO.UK&lt;/a&gt; • Shared by Jamie Chang&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16490/feed&quot; target=&quot;_blank&quot;&gt;Python 3.15.0 Beta 1 Released&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16490/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/16466/feed&quot; target=&quot;_blank&quot;&gt;Python 3.14.5 Released&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16466/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/16472/feed&quot; target=&quot;_blank&quot;&gt;Announcing PSF Community Service Award Recipients&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16472/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/16471/feed&quot; target=&quot;_blank&quot;&gt;PEP 830: Add Timestamps to Exceptions and Tracebacks (Deferred to 3.16)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16471/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/16468/feed&quot; target=&quot;_blank&quot;&gt;PEP 788: Protecting the C API From Interpreter Finalization (Final)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16468/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/16491/feed&quot; target=&quot;_blank&quot;&gt;PEP 813: The Pretty Print Protocol (Deferred to 3.16)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16491/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/16475/feed&quot; target=&quot;_blank&quot;&gt;2026 Django Developers Survey&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16475/feed&quot; target=&quot;_blank&quot;&gt;DJANGO 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/16484/feed&quot; target=&quot;_blank&quot;&gt;DjangoCon US 2026 Tickets Available&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16484/feed&quot; target=&quot;_blank&quot;&gt;DJANGOCON.US&lt;/a&gt; • Shared by Aayush Gauba&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/16461/feed&quot; target=&quot;_blank&quot;&gt;PyCon US 2026 Typing Summit Recap&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Per-talk notes from the PyCon US 2026 Typing Summit. Includes info on: Pyrefly and AI agents, ty constraint sets, Lean formalization, tensor shape types, intersection types, PEP 827, Guido on the direction of typing, and the Typing Council Q&amp;amp;A.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16461/feed&quot; target=&quot;_blank&quot;&gt;BERNÁT GÁBOR&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/16470/feed&quot; target=&quot;_blank&quot;&gt;Event Sourcing Design Pattern&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Talk Python interviews Chris May and they discuss the event sourcing design pattern: a mechanism for databases to work like git with immutable, replayable events. Learn what libraries help you do this in Python and when to use the pattern.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16470/feed&quot; target=&quot;_blank&quot;&gt;TALK 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/16486/feed&quot; target=&quot;_blank&quot;&gt;Strategic Planning at the PSF&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; The Python Software Foundation Board has been developing a strategic plan to guide the foundation&amp;rsquo;s direction over the next five years. This post describes the process and future goals.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16486/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/16492/feed&quot; target=&quot;_blank&quot;&gt;How Python&amp;rsquo;s GIL Actually Works (And When It Bites You)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This post explains how Python&amp;rsquo;s GIL limits the amount of concurrency you can get through threading alone, why it is there, and how it is changing as Python evolves.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16492/feed&quot; target=&quot;_blank&quot;&gt;ATHREYA AKA MANESHWAR&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/16480/feed&quot; target=&quot;_blank&quot;&gt;Concurrency: A Deep Dive Into Multithreading With Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &amp;ldquo;This article explains concurrency in Python including topics like multithreading, multiprocessing, race conditions, and synchronization mechanisms such as locks.&amp;rdquo;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16480/feed&quot; target=&quot;_blank&quot;&gt;NIKOS VAGGALIS&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/16489/feed&quot; target=&quot;_blank&quot;&gt;Shipping Django as a Desktop App&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This is a summary of Jochen Wersdörfer&amp;rsquo;s talk at DjangoCon EU where he outlined how his team used Electron to turn a Django project into an installable app.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16489/feed&quot; target=&quot;_blank&quot;&gt;REINOUT VAN REES&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/16465/feed&quot; target=&quot;_blank&quot;&gt;Pydantic Forks &lt;code&gt;httpx&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; The Pydantic team has forked httpx and named it httpx2. The folks who created httpxyz have decided to let the larger organization take the reins.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16465/feed&quot; target=&quot;_blank&quot;&gt;MICHIEL BEIJEN&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/16483/feed&quot; target=&quot;_blank&quot;&gt;How to Flatten a List of Lists in Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Learn how to flatten a list of lists in Python using for loops, list comprehensions, itertools, functools, NumPy, and recursion.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16483/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/16479/feed&quot; target=&quot;_blank&quot;&gt;Quiz: How to Flatten a List of Lists in Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16479/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/16473/feed&quot; target=&quot;_blank&quot;&gt;Building Type-Safe LLM Agents With Pydantic AI&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Build type-safe LLM agents in Python with Pydantic AI using structured outputs, function calling, and dependency injection.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16473/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/16469/feed&quot; target=&quot;_blank&quot;&gt;Pyrefly v1.0 Is Here!&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Pyrefly has reached stable version 1.0 status, read about the new features and how to get started.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16469/feed&quot; target=&quot;_blank&quot;&gt;PYREFLY.ORG&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/16460/feed&quot; target=&quot;_blank&quot;&gt;kubex: Python Asynchronous Client for Kubernetes&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16460/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/CODEMAGEDDON&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/16488/feed&quot; target=&quot;_blank&quot;&gt;gh-profiler: Examine GitHub User&amp;rsquo;s Profile&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16488/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/EHMATTHES&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/16478/feed&quot; target=&quot;_blank&quot;&gt;presidio: Detect, Redact, &amp;amp; Anonymize Sensitive Data (PII)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16478/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/MICROSOFT&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/16463/feed&quot; target=&quot;_blank&quot;&gt;fotomagoufis: CLI Photo Correction Tool&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16463/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/DIMATOSJ&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/16487/feed&quot; target=&quot;_blank&quot;&gt;DiffSinger: Advanced Singing Voice Synthesis&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16487/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/OPENVPI&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/16481/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; May 20, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16481/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/16462/feed&quot; target=&quot;_blank&quot;&gt;PyData Bristol Meetup&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; May 21, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16462/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/16467/feed&quot; target=&quot;_blank&quot;&gt;PyLadies Dublin&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; May 21, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16467/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/16477/feed&quot; target=&quot;_blank&quot;&gt;Python Sheffield&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; May 26, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16477/feed&quot; target=&quot;_blank&quot;&gt;GOOGLE.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/16464/feed&quot; target=&quot;_blank&quot;&gt;PyCon Italia 2026&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; May 27 to May 31, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16464/feed&quot; target=&quot;_blank&quot;&gt;PYCON.IT&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/16482/feed&quot; target=&quot;_blank&quot;&gt;Python Southwest Florida (PySWFL)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; May 27, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16482/feed&quot; target=&quot;_blank&quot;&gt;MEETUP.COM&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 #735.&lt;br /&gt;&lt;a href=&quot;https://pycoders.com/issues/735/feed&quot;&gt;View in Browser »&lt;/a&gt;&lt;/p&gt; &lt;img src=&quot;https://pycoders.com/issues/735/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, 19 May 2026 19:30:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Tapping Into the Zen of Python</title>
	<guid>https://realpython.com/courses/tapping-into-the-zen-of-python/</guid>
	<link>https://realpython.com/courses/tapping-into-the-zen-of-python/</link>
	<description>&lt;p&gt;The &lt;strong&gt;Zen of Python&lt;/strong&gt; is a collection of 19 aphorisms that capture the guiding principles behind Python&amp;rsquo;s design. You can display them anytime by running &lt;code&gt;import this&lt;/code&gt; in a Python REPL. Tim Peters wrote them in 1999 as a joke, but they became an iconic part of Python culture that was even formalized as &lt;a href=&quot;https://realpython.com/ref/glossary/pep/&quot; class=&quot;ref-link&quot;&gt;PEP&lt;/a&gt; 20.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this video course, you&amp;rsquo;ll understand:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Zen of Python is a &lt;strong&gt;humorous poem&lt;/strong&gt; of 19 aphorisms describing Python&amp;rsquo;s design philosophy&lt;/li&gt;
&lt;li&gt;Running &lt;code&gt;import this&lt;/code&gt; in a Python &lt;a href=&quot;https://realpython.com/ref/glossary/interpreter/&quot; class=&quot;ref-link&quot;&gt;interpreter&lt;/a&gt; displays the &lt;strong&gt;complete text&lt;/strong&gt; of the Zen of Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tim Peters&lt;/strong&gt; wrote the Zen of Python in 1999 as a tongue-in-cheek comment on a mailing list&lt;/li&gt;
&lt;li&gt;The aphorisms are &lt;strong&gt;guidelines, not strict rules&lt;/strong&gt;, and some intentionally contradict each other&lt;/li&gt;
&lt;li&gt;The principles promote &lt;strong&gt;readability, simplicity, and explicitness&lt;/strong&gt; while acknowledging that practicality matters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Experienced Pythonistas often refer to the Zen of Python as a source of wisdom and guidance, especially when they want to settle an argument about certain design decisions in a piece of code. In this video course, you&amp;rsquo;ll explore the origins of the Zen of Python, learn how to interpret its mysterious aphorisms, and discover the Easter eggs hidden within it.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t need to be a Python master to understand the Zen of Python! But you do need to answer an important question: &lt;strong&gt;What exactly is the Zen of Python?&lt;/strong&gt;&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 19 May 2026 14:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Quiz: Absolute vs Relative Imports in Python</title>
	<guid>https://realpython.com/quizzes/absolute-vs-relative-python-imports/</guid>
	<link>https://realpython.com/quizzes/absolute-vs-relative-python-imports/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of &lt;a href=&quot;https://realpython.com/absolute-vs-relative-python-imports/&quot;&gt;Absolute vs Relative Imports in Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how Python&amp;rsquo;s import system resolves modules, the differences between absolute and relative imports, and the PEP 8 conventions for styling import statements.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 19 May 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Quiz: Tapping Into the Zen of Python</title>
	<guid>https://realpython.com/quizzes/tapping-into-the-zen-of-python/</guid>
	<link>https://realpython.com/quizzes/tapping-into-the-zen-of-python/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of &lt;a href=&quot;https://realpython.com/courses/tapping-into-the-zen-of-python/&quot;&gt;Tapping Into the Zen of Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit the origins of the poem, the meaning of several aphorisms, and the inside jokes hidden throughout.&lt;/p&gt;
&lt;p&gt;The questions explore how the principles apply in practice and when it&amp;rsquo;s okay to bend the rules in the name of practicality.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 19 May 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>PyCharm: LLM Evaluation and AI Observability for Agent Monitoring</title>
	<guid>https://blog.jetbrains.com/pycharm/2026/05/llm-evaluation-and-ai-observability-for-agent-monitoring/</guid>
	<link>https://blog.jetbrains.com/pycharm/2026/05/llm-evaluation-and-ai-observability-for-agent-monitoring/</link>
	<description>&lt;p&gt;&lt;em&gt;This is a guest post from &lt;/em&gt;&lt;strong&gt;&lt;em&gt;&lt;a href=&quot;https://blog.jetbrains.com/pycharm/2026/05/llm-evaluation-and-ai-observability-for-agent-monitoring/#author&quot;&gt;Naa Ashiorkor&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;, a data scientist and tech community builder.&lt;/em&gt;&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/PC-social-BlogFeatured-1280x720-1-4.png&quot; alt=&quot;&quot; class=&quot;wp-image-708070&quot; /&gt;



&lt;p&gt;Artificial intelligence keeps evolving at a rapid pace. The latest major application of AI, specifically of LLMs, is AI agents. These are systems that use their perception of their environment, processes, and input to take action to achieve specific goals, and they are built on LLMs.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Increasingly, complex AI agents are being used in real-world applications. While simpler agentic applications that use only one agent to achieve a goal still exist, organizations are now shifting towards multi-agent systems that use multiple subagents coordinated by a main agent. These are more adaptable and can mimic human teams when it comes to performing specialized tasks such as data analysis, compliance, customer support, and more. The reasoning and autonomy of AI agents have improved; consequently, they can gather data, conduct cross-references, and generate analysis.&lt;/p&gt;



&lt;p&gt;As we move towards these complex, real-world applications of agents, an ever-stronger spotlight is being shone both on how we observe AI agents and how we evaluate the LLMs they’re built upon. The complexity, interactions, and autonomous processes under the surface of AI agents make rigorous monitoring and assessment an essential part of building and maintaining these applications. LLM evaluation determines if the AI agent &lt;em&gt;can&lt;/em&gt; &lt;em&gt;work&lt;/em&gt;, while AI agent observability determines if it &lt;em&gt;is working&lt;/em&gt;. LLM evaluation tests an agent’s basic capabilities before and during deployment, while agent observability provides deep, real-time visibility into an agent’s internal reasoning and operational health once it is live. It is pretty obvious that having just one of these is a loss and a formula for failure.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;In this blog post, we’ll explore how to evaluate agents using advanced metrics and observability tools. It’s designed as a practical, end-to-end reference for teams that want to move beyond demos and actually run AI agents in live, real-world environments, avoiding the common pitfalls that cause failure in production.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Core LLM evaluation metrics for modern AI systems&lt;/h2&gt;



&lt;p&gt;As LLMs are now applied to a wide range of use cases, it is important that their evaluation covers both the tasks they may perform and their potential risks. Evaluation metrics give a better understanding of the strengths and weaknesses of LLMs, influence the guidance of human-LLM interactions, and highlight the importance of ensuring LLM safety and reliability. Hence, LLM evaluation metrics for assessing the performance of an LLM are indispensable in modern AI systems. Without well-defined evaluation metrics, assessing model quality becomes subjective.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;There are several key evaluation metrics, each with a different purpose, and the table below provides a summary of some of them.&lt;/p&gt;



&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Evaluation Metric&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;What the metric evaluates&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hallucination rate&lt;/td&gt;&lt;td&gt;Factual accuracy and truthfulness of generated content&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Toxicity scores&lt;/td&gt;&lt;td&gt;Harmful, offensive, or inappropriate content&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RAGAS (Retrieval Augmented Generation Assessment)&lt;/td&gt;&lt;td&gt;Measures whether the RAG system retrieves the right documents and generates answers that are faithful to those sources&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DeepEval&lt;/td&gt;&lt;td&gt;Tests everything from basic accuracy and safety to complex agent behaviors and security vulnerabilities across the entire LLM application&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Hallucination rate&lt;/h3&gt;



&lt;p&gt;Hallucinations in LLMs produce outputs that seem convincing yet are factually unsupported and can be categorized as either intrinsic, where the output contradicts the source content, or extrinsic, where it simply cannot be verified. They can stem from a range of factors across data, training, and inference, from quality issues in the large datasets used for initial training and the data used to fine-tune model behavior to post-training techniques that make models overly eager to provide responses to imperfect decoding strategies at inference. Because hallucination is an unsolved challenge cutting across every stage of model development, measuring and assessing it remains a vital part of LLM evaluation.&lt;/p&gt;



&lt;p&gt;There is a wide variety of techniques for detecting hallucinations. These include:&amp;nbsp;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fact-checking: &lt;/strong&gt;Extracting independent factual statements from the model&amp;#8217;s outputs (fact extraction) and then verifying these against trusted knowledge sources (fact verification).&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Uncertainty estimation:&lt;/strong&gt; Using the certainty provided in the model&amp;#8217;s internal state to estimate how likely a piece of factual content is to be a hallucination.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Faithfulness hallucination detection:&lt;/strong&gt; Ensures the faithfulness of LLMs to provide context or user instructions.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;There are several metrics for hallucination detection. Some of the most commonly used metrics include:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fact-based metrics:&lt;/strong&gt; Assessing faithfulness by measuring the overlap of facts between the generated content and the source content.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Classifier-based metrics:&lt;/strong&gt; Utilizing trained classifiers to distinguish between the level of entailment between the generated content and the source content.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;QA-based metrics:&lt;/strong&gt; Using question-answering systems to validate the consistency of information between the source content and the generated content.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Uncertainty-based metrics:&lt;/strong&gt; Assessing faithfulness by measuring the model’s confidence in its generated outputs.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;LLM-based metrics:&lt;/strong&gt; Using LLMs as evaluators to assess the faithfulness of generated content through specific prompting strategies.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;PyCharm&amp;#8217;s &lt;a href=&quot;http://jetbrains.com/help/pycharm/hugging-face.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hugging Face integration&lt;/a&gt; lets you discover evaluation models and datasets without leaving the IDE. Use the &lt;em&gt;Insert HF Model&lt;/em&gt; feature to search for hallucination or toxicity classifiers, and hover over any model or dataset name in your code to instantly preview its model card, including training data, intended use, and limitations. This means you can import a dataset, evaluate your LLM, and verify the tools you&amp;#8217;re using, all from one place.&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image1-2.png&quot; alt=&quot;PyCharm's Hugging Face integration&quot; class=&quot;wp-image-707885&quot; /&gt;&lt;em&gt;Opening the Hugging Face model browser in PyCharm from the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Code&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; menu, then selecting &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Insert HF Model&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image3.png&quot; alt=&quot;PyCharm's &quot; /&gt;&lt;em&gt;Searching for a specific hallucination model and selecting one. &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Use Model&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; inserts a ready-to-use code snippet into the editor.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image2.png&quot; alt=&quot;PyCharm's &quot; /&gt;&lt;em&gt;A ready-to-use code snippet of the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Vectara hallucination evaluation model &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;is inserted into the editor.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image-19.png&quot; alt=&quot;Vectara hallucination evaluation model&quot; class=&quot;wp-image-707808&quot; /&gt;&lt;em&gt;Hovering over the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Vectara hallucination evaluation model&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; in the code to preview its model card within PyCharm.&lt;/em&gt;



&lt;p&gt;Trust is imperative in the acceptance and adoption of technology. Trust in AI is especially important in areas such as healthcare, finance, personal assistance, autonomous vehicles, and others. Hallucinations have a huge impact on users&amp;#8217; trust in LLMs.&lt;/p&gt;



&lt;p&gt;In 2023, &lt;a href=&quot;https://hai.stanford.edu/news/hallucinating-law-legal-mistakes-large-language-models-are-pervasive&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;a story went viral&lt;/a&gt; about a Manhattan lawyer who submitted a legal brief largely generated by ChatGPT. The judge quickly noticed how different it was from a human-written submission, revealing clear signs of hallucination. Incidents like this highlight the real-world risks of LLM errors and their impact on user trust. As people encounter more examples of hallucination, skepticism around LLM reliability continues to grow.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Toxicity scores&lt;/h3&gt;



&lt;p&gt;LLMs that have been pretrained on large datasets from the web have the tendency to generate harmful, offensive, and disrespectful content as well as toxic language, such as hate speech, harassment, threats, and biased language, which have a negative impact on their safe deployment. Toxicity detection is the process of identifying and flagging toxic content by integrating open-source tools or APIs into the LLM workflow to analyze both the user input and the LLM output. Some of the available toxicity tools include the &lt;a href=&quot;https://developers.openai.com/api/docs/guides/moderation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OpenAI Moderation API&lt;/a&gt;, which is free, works with any text, and has a quick implementation. &lt;a href=&quot;https://perspectiveapi.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Perspective API&lt;/a&gt; by Google is also widely used with a transparent methodology, but will no longer be in service after 2026. &lt;a href=&quot;https://github.com/unitaryai/detoxify&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Detoxify&lt;/a&gt;, which is open source, has no API costs, and is Python-friendly, and &lt;a href=&quot;https://azure.microsoft.com/en-us/products/ai-services/ai-content-safety&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Azure AI Content Safety&lt;/a&gt; by Microsoft, which is customizable and best for enterprise deployments and existing Azure users. &lt;a href=&quot;https://huggingface.co/models?other=toxicity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hugging Face Toxicity Models&lt;/a&gt; have many model options and easy integration with Transformers.&lt;/p&gt;



&lt;p&gt;Toxicity detection has become a guardrail; hence, it is important in public-facing applications. They prevent toxic content from reaching users, which protects both individuals and organizations. In public-facing applications, toxicity detection operates by input filtering, output monitoring, and real-time scoring. This prevents attacks where users intentionally train AI to produce toxic content through coordinated toxic inputs; toxic content will never reach the user, even if produced by the underlying AI, so systems can adjust their behavior dynamically based on conversation content and escalating risks. Unguarded AI can be exploited, which leads to reputational damage.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;For toxicity evaluation, PyCharm&amp;#8217;s &lt;a href=&quot;http://jetbrains.com/help/pycharm/hugging-face.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hugging Face&lt;/a&gt; &lt;em&gt;Insert HF Model feature &lt;/em&gt;helps you discover classifiers like s-nlp/roberta_toxicity_classifier directly in the IDE. Hovering over the model name reveals its model card, where you can see it was trained on the Jigsaw toxic comment datasets, helping you understand what the model can and can&amp;#8217;t detect before you write a single line of evaluation code.&amp;nbsp;&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image4.png&quot; alt=&quot;PyCharm's Hugging Face Insert HF Model feature&quot; class=&quot;wp-image-707947&quot; /&gt;&lt;em&gt;Opening the Hugging Face model browser in PyCharm from the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Code&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; menu, then selecting the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Insert HF Model&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image7-1.png&quot; alt=&quot;PyCharm's &quot; /&gt;&lt;em&gt;Searching for a specific toxicity model and selecting one. &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Use Model&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; inserts a ready-to-use code snippet into the editor.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image6-2.png&quot; alt=&quot;&quot; class=&quot;wp-image-707983&quot; /&gt;&lt;em&gt;A ready-to-use code snippet of the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;roberta_toxicity_classifier &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;is inserted into the editor.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image9-2.png&quot; alt=&quot;&quot; class=&quot;wp-image-707996&quot; /&gt;&lt;em&gt;Hovering over the &lt;/em&gt;&lt;strong&gt;&lt;em&gt;roberta_toxicity_classifier&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; in the code to preview its model card within PyCharm.&lt;/em&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Frameworks for LLM evaluation&lt;/h3&gt;



&lt;p&gt;Frameworks for LLM evaluation have changed the game; teams don’t have to rely on manual reviews, gut instinct, and subjective judgment to assess model quality. These frameworks automate the measurement of model quality using standardized, quantifiable metrics. They assign numerical scores to outputs that measure faithfulness, relevancy, toxicity, and other important dimensions. This automation results in reproducibility, speed, and objectivity.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Consequently, the same input always produces the same score; evaluation runs 10–100 times faster, so in minutes instead of days; and there are no more debates on the quality of the output. Some of these frameworks include &lt;a href=&quot;https://deepeval.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DeepEva&lt;/a&gt;l and &lt;a href=&quot;https://docs.ragas.io/en/stable/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Retrieval Augmented Generation Assessment (Ragas)&lt;/a&gt;. DeepEval is an open-source evaluation framework built with seven principles in mind, such as the ability to easily &amp;#8220;unit test&amp;#8221; LLM outputs in a similar way to Pytest and plug in and use over 50 LLM-evaluated metrics, most of which are backed by research and all of which are multimodal.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;It is extremely easy to build and iterate on LLM applications with two modes of evaluation, namely, end-to-end LLM evals and component-level LLM evals. It is used for comprehensive testing across RAG, agents, and chatbots. Ragas is a framework for reference-free evaluation of RAG pipelines. There are several dimensions to consider, such as the ability of the retrieval system to identify relevant and focused context passages, as well as the capability of the LLM to exploit such passages in a faithful way; hence, it is challenging to evaluate RAG systems. Ragas provides a suite of metrics for evaluating these dimensions without relying on ground-truth human annotations.&amp;nbsp;&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;The limits of static prompt evaluation&lt;/h3&gt;



&lt;p&gt;Traditional LLM evaluation methods are useful for single prompt-response pairs, measuring output quality, RAG systems with straightforward retrieval, and static evaluation with fixed inputs. But they are limited for multi-step agents because LLM evaluation focuses on the final output quality, not the decision-making process that produced it. Multi-step agents exhibit a different kind of complexity, as they chain multiple decisions.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Why traditional LLM evaluation isn’t enough for agents&amp;nbsp;&lt;/h2&gt;



&lt;p&gt;Agents operate independently within complex workflows, and this independence can introduce challenges such as deviation from expected behavior, errors in production, and more failure points than in traditional software applications. Hence, an agent can perform well in testing but fail in production. Traditional LLM evaluations don’t have the capacity to test such use cases. Testing is usually done in a controlled environment with limited scenarios, but production involves real users, edge cases, unpredictable inputs, and scale. This means that agents can make decisions that are not seen in testing, and in production, tasks could be completed, though incorrectly, without generating an error signal. This is where advanced evaluation and monitoring practices come to the rescue! They provide the visibility and systematic measurement needed to deploy agents confidently, rather than relying on trial and error.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;The complexity of agent behavior&lt;/h3&gt;



&lt;p&gt;Traditional LLM evaluation measures single prompt-response pairs: provide an input prompt, receive an output response, and measure quality through metrics such as accuracy, relevance, and faithfulness. Due to the complexity and non-deterministic, multi-step reasoning of AI agents, they cannot be reliably evaluated using traditional evaluation metrics.&lt;/p&gt;



&lt;p&gt;Agent behavior is complex, and this complexity introduces challenges. Agents operate in dynamic environments where APIs might be down, databases change between queries, and the “right” answer depends on current conditions. They can use external tools and APIs to complete tasks, and may either use the wrong tool or use the right tool with the wrong parameters or input type. Their internal reasoning traces remain hidden unless they are logged explicitly, so it might be challenging to determine whether an agent was successful through logic or chance. An agent&amp;#8217;s output could be perfectly correct despite poor internal decisions, or the entire task could fail despite correct step execution.&lt;/p&gt;



&lt;p&gt;This is where observability tooling becomes essential. PyCharm&amp;#8217;s &lt;a href=&quot;http://blog.jetbrains.com/pycharm/2025/08/pycharm-2025-2/#ai-agents-debugger&quot;&gt;AI Agents Debugger&lt;/a&gt; breaks open the black box of agentic systems, letting you trace LangGraph workflows and inspect each agent node&amp;#8217;s inputs, outputs, and reasoning directly in the IDE, with zero extra code. Just install the plugin, run your agent, and the debugger automatically captures execution traces. Click the &lt;em&gt;Graph&lt;/em&gt; button to visualize the full workflow, making it easy to spot where an agent chose the wrong tool, passed bad parameters, or succeeded by luck rather than logic.&lt;/p&gt;



&lt;p&gt;To see this in action, I built a simple travel-planning agent using LangGraph in two steps: a research node that suggests summer destinations based on my preferences, and a plan node that picks the best option and builds a three-day itinerary. With the AI Agents Debugger, you can trace exactly what information flowed between these two steps – what the research node suggested and how the planner used those suggestions to build the final itinerary.&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image8-1.png&quot; alt=&quot;&quot; class=&quot;wp-image-708007&quot; /&gt;&lt;em&gt;The &lt;/em&gt;&lt;strong&gt;&lt;em&gt;AI Agents Debugger&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; shows how the agent moves from initialization to the research stage, displaying the data passed in and out, and the LLM call used to generate the research results.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image12.png&quot; alt=&quot;&quot; class=&quot;wp-image-708018&quot; /&gt;&lt;em&gt;The &lt;/em&gt;&lt;strong&gt;&lt;em&gt;AI Agents Debugger&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; shows how the planning step processes inputs and produces outputs, using an LLM call to construct the final travel itinerary.&lt;/em&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image10-1.png&quot; alt=&quot;&quot; class=&quot;wp-image-708029&quot; /&gt;&lt;em&gt;The &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Graph &lt;/em&gt;&lt;/strong&gt;&lt;em&gt;viewprovides a high-level overview of the agent’s workflow, mapping how it progresses from the initial step through research and planning to the final result.&lt;/em&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Advanced agent evaluation metrics&lt;/h2&gt;



&lt;p&gt;The complexity of AI agents demands evaluation that goes beyond considering the final output quality, that is, measuring whether it is accurate, relevant, and grounded. Specialized agent evaluation assesses the complete decision-making process, including the planning logic, tool selection, parameter construction, reasoning coherence, and resource efficiency that led to the final output. Hence, the advanced agent evaluation metrics are designed to make such a process visible and measurable. Some of them are task completion rate, tool usage, reasoning quality, efficiency, and error handling.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Task completion rate&lt;/h3&gt;



&lt;p&gt;Task completion rate measures the percentage of tasks where an agent successfully achieves the end goal. This is calculated as the number of completed tasks divided by the total number of tasks attempted. The context of “completed” differs by use case. There are real-world use cases for task completion rate. Let’s start with a basic use case. Consider a customer service agent handling a specific food delivery order: &amp;#8220;Where is my order #0001? It has not been delivered to me.” Completion rate means successfully looking up the order ID, retrieving the tracking information, and providing an accurate delivery estimate, so all three steps must succeed. If the agent retrieves the wrong order or fails to assess the tracking system, that is a failed task, even if it produces the same output.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Next, let us look at a medium-complexity use case, sequential API calls. Consider an agent tasked with creating a Jira support ticket and notifying the relevant team in Slack. The agent calls the Jira API to create a ticket, parses the response to get the ticket ID, calls the Slack API with the ticket link, and finally verifies the success of both. If the agent successfully creates the Jira ticket, but the Slack notification fails, that is considered a failed task even if the ticket exists in Jira, since the team wasn’t notified.&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Finally, let’s examine a high-complexity use case: An agent is given the task of completing an online purchase, which means it must handle everything from checkout to order confirmation. Six steps are involved: Verify the item is still in stock, process the payment with a credit or debit card, reserve or decrement inventory, create an order record, generate an order confirmation number, and send a confirmation email to the customer. If the agent successfully charges the customer’s card but the confirmation email fails to send, that’s a failed task, even if the payment was processed and the order was created. In such a situation, the customer has no proof of purchase, so they will likely contact support or attempt to purchase again.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Tool usage correctness&lt;/h3&gt;



&lt;p&gt;Tool usage correctness assesses whether an agent correctly identifies and invokes the relevant tools and APIs. It is a deterministic measure that is assessed using techniques such as LLM as a judge, like most LLM evaluation metrics. It has three dimensions:&amp;nbsp;&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Did the agent choose the right tool for the task (tool selection)?&amp;nbsp;&lt;/li&gt;



&lt;li&gt;Were the parameters constructed correctly (input parameters)?&amp;nbsp;&lt;/li&gt;



&lt;li&gt;Did the agent properly use the tool results (output handling)?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Hence, it is important for reliability and functional correctness.&amp;nbsp;&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Step-by-step reasoning accuracy&lt;/h3&gt;



&lt;p&gt;In real-world use cases, an LLM agent’s reasoning is shaped by much more than just the model itself. Modern frameworks such as &lt;a href=&quot;https://docs.langchain.com/oss/python/langchain/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LangChain&lt;/a&gt; expose the agent’s internal &amp;#8220;thoughts&amp;#8221; through structured logging of intermediate reasoning steps. This is done using the ReAct (Reasoning and Acting) pattern, which involves the agent thinking about what to do, using a tool, observing the tool result, and then repeating until the task is complete. Each “thought” is logged as text, which creates a complete trace of the reasoning process from initial query to final answer. These traces can be extracted programmatically and evaluated to assess whether the agent’s logic is sound even when the final output appears correct. Evaluating planning steps involves assessing aspects such as the overall approach&amp;#8217;s logic, the ordering of steps, and whether any steps are unnecessary or redundant. Evaluating execution assesses whether the implementation worked, such as whether tools were called with correct parameters, whether each step was completed successfully, whether errors were handled appropriately, and whether the output was interpreted correctly. This can be done seamlessly in PyCharm using the &lt;a href=&quot;https://plugins.jetbrains.com/plugin/26921-ai-agents-debugger/edit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Agents Debugger&lt;/a&gt;.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Groundedness (faithfulness)&lt;/h3&gt;



&lt;p&gt;Groundedness, also known as faithfulness, is the most critical metric for retrieval-augmented generation (RAG), which is a common component of agentic applications. It assesses whether the agent’s response is actually supported by the retrieved source documents or whether, instead, the model hallucinated information. Different evaluation techniques include:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Atomic claim verification:&lt;/strong&gt; Breaks up the response into atomic claims and checks each claim against the retrieved context. It is slow but best for production RAG and thorough evaluation.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Semantic similarity:&lt;/strong&gt; Compares the embeddings of the response and source documents. It is fast, so it is best for quick checks and first-pass filtering.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;LLM-as-Judge:&lt;/strong&gt; works by prompting the LLM to score groundedness by extracting factual statements from the response and then checking each statement against the retrieved context. It offers medium speed and is best for flexible, custom criteria.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;AI observability and why it matters&lt;/h2&gt;



&lt;p&gt;AI observability is about visibility into what the agent is doing. This covers recording everything that happens when a task is executed, including the agent’s reasoning at each step, which tools were called with what parameters, what data was retrieved, and how decisions were made from start to finish. With such a transparent system where every decision can be logged and traced, teams are able to understand why an agent fails, behaves unexpectedly, or becomes expensive to run because issues can be debugged and behavior can be audited. Consequently, system design improves, and guesswork is eliminated.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Definition of AI observability&lt;/h3&gt;



&lt;p&gt;AI observability is the real-time monitoring of agent actions, thoughts, and environmental interactions: what went in, what came out, how the agent thought through the problem, and which tools, APIs, and data were used. AI observability builds on the three pillars of DevOps observability – that is, metrics, logs, and traces – but extends each one for AI’s unique needs. DevOps metrics track CPU and latency, while AI metrics track token usage and cost per interaction. DevOps logs capture system errors, while AI logs capture reasoning traces and decision points. DevOps traces follow requests through services, while AI traces follow reasoning through agent steps, tool calls, and observations.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Benefits for agent monitoring&lt;/h3&gt;



&lt;p&gt;Agent monitoring has immense benefits – here are some of the most important:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It debugs reasoning errors:&lt;/strong&gt; When an agent fails or gives an unexpected output, monitoring provides a complete trace of its decision-making process, which shows exactly where the logic broke down. Hence, there is no need to spend hours guessing the causes.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;It measures performance and latency over time:&lt;/strong&gt; Since metrics such as average latency, token usage, cost per interaction, and completion rates across all queries are tracked, degradation patterns can be identified before they affect users. As a result, performance issues can be identified and resolved before users file any complaints.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;It identifies regressions after model or prompt updates:&lt;/strong&gt; Baseline metrics such as completion rate, faithfulness scores, latency, and cost are established and then monitored for deviations after deployments. If a new prompt drops the compilation rate or a model update increases the hallucination rate, automated alerts catch it immediately. Hence, issues are caught before users are affected.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Popular tools for agent monitoring&lt;/h3&gt;



&lt;p&gt;Several frameworks and platforms have emerged to provide built-in observability for AI agents, with each having different strengths and integration approaches and matching different features and requirements. The choice of the right tool depends on the framework, deployment preferences, and primary needs. The table below shows some popular tools and whether they match different features and requirements.&lt;/p&gt;



&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tool&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Traces agent steps?&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Tracks costs?&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Detects regressions?&amp;nbsp;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Self-&lt;/strong&gt;&lt;strong&gt;hostable?&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Open source?&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Easy integration?&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.helicone.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Helicone&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.langchain.com/langsmith/observability&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LangSmith&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://langfuse.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LangFuse&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/traceloop/openllmetry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OpenLLMetry&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://arize.com/docs/phoenix&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Phoenix&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.trulens.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TruLens&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.datadoghq.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DataDog&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Limited&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Moderate&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Best practices for evaluating agents in production&lt;/h2&gt;



&lt;p&gt;Evaluation does not end after deployment; rather, it is intensified. This continuous evaluation tracks how much the system costs to run, how quickly it responds under various loads, and how it handles errors or unusual inputs. Without such evaluation, problems can only be identified after the users are affected. An agent can pass all the quality checks with excellent faithfulness scores, high completion rates, and strong reasoning but fail in production if costs spiral, latency increases, or edge cases cause instability. Hence, there is a critical need for ongoing evaluation and monitoring, which will lead to systems that are reliable, scalable, and financially sustainable.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Monitor cost and latency&lt;/h3&gt;



&lt;p&gt;Monitoring cost and latency is critical for production sustainability. Token usage and response time must be tracked continuously because small inefficiencies compound dramatically over time, and the cost per token of the powerful reasoning models used for agents can be high. Production workloads require cost and latency monitoring to identify problems before user experience and budget are impacted. Cost monitoring tracks token usage at different levels, such as per request, per query type, and over time. Without visibility into patterns generated by these, teams end up discovering cost problems through surprise bills. With monitoring, they can proactively cache common queries and optimize prompts to reduce token use. Latency monitoring reveals track response time and component breakdowns to identify bottlenecks.&lt;/p&gt;



&lt;p&gt;Cost control in production workloads is important because production costs can spiral quickly, unmonitored systems can exceed budgets, and latency impacts user experience and retention.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Combine offline and online evaluation&lt;/h3&gt;



&lt;p&gt;Effective agent evaluation requires combining offline and online evaluation, where each addresses gaps the other leaves. Offline evaluation uses fixed test databases for reproducible benchmarking, which enables fast iteration on prompts and models in controlled environments without production risk. Online evaluation monitors real user interactions in production, which reveals edge cases in testing that were never expected, so it is useful for real-time feedback, user data, and observability tools. A combination of both results in an optimal strategy where offline evaluation validates changes before deployment, then online evaluation monitors production reality.&amp;nbsp;&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Use human-in-the-loop when necessary&lt;/h3&gt;



&lt;p&gt;LLM agents are appreciated for how they have played a positive role in the different ecosystems, but not every agent should run autonomously since they can misinterpret prompts, cross boundaries, or make dreadful errors that can’t be caught by automation alone. Hence, the need for human-in-the-loop failsafes. Human-in-the-loop is also essential during initial setup: Unless teams already have domain-specific evaluation datasets for monitoring the agent, these will need to be created manually by assessing the agent&amp;#8217;s performance. A hybrid approach is required when critical decisions require human validation, such as approving transactions, modifying sensitive data, or triggering irreversible workflows. In this approach, it is important that decisions are routed through a human checkpoint before proceeding. The intention is not to slow automation but rather to ensure that the right decisions involve the right oversight. A well-designed human-in-the-loop system delivers compound returns over time. Every human correction becomes feedback, which improves the agent&amp;#8217;s accuracy and gradually reduces the need for manual review. Human oversight isn’t treated as a failure but rather as a safety net that makes the system better with use.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Final thoughts&lt;/h2&gt;



&lt;p&gt;Fundamentally, AI agents are different from single-prompt LLMs. They navigate multi-step workflows, make autonomous decisions, and use external tools, which introduces complexities that demand continuous evaluation, not just static testing. Evaluation must evolve from pre-deployment checkpoints to ongoing monitoring. Production-ready agents aren&amp;#8217;t just well-tested; they&amp;#8217;re continuously observed and improved based on real behavior. LLM evaluation and AI observability enable faster, safer iteration by catching issues early and feeding production insights back into development.&lt;/p&gt;



&lt;p&gt;&lt;a href=&quot;https://www.jetbrains.com/pycharm/whatsnew/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PyCharm&lt;/a&gt; streamlines agent development with integrated debugging, profiling, and testing. Step through reasoning with breakpoints, find cost bottlenecks, and iterate on evaluation tests rapidly. These workflows transform hours of debugging into minutes of systematic investigation. Explore PyCharm for AI development to see how integrated tools can help you build, evaluate, and deploy reliable AI agents.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot; id=&quot;author&quot;&gt;About the author&lt;/h2&gt;


    &lt;div class=&quot;about-author &quot;&gt;
        &lt;div class=&quot;about-author__box&quot;&gt;
            &lt;div class=&quot;row&quot;&gt;
                                                            &lt;div class=&quot;about-author__box-img&quot;&gt;
                            &lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image-1.jpeg&quot; alt=&quot;&quot; /&gt;
                        &lt;/div&gt;
                                        &lt;div class=&quot;about-author__box-text&quot;&gt;
                                                    &lt;h4&gt;Naa Ashiorkor&lt;/h4&gt;
                                                &lt;p&gt;&lt;span&gt;Naa Ashiorkor is a data scientist and tech community builder. She is deeply involved in the Python community and serves as an organizer for various conferences, including EuroPython. She is currently building PyLadies Tampere.&lt;/span&gt;&lt;/p&gt;
                    &lt;/div&gt;
                            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;</description>
	<pubDate>Tue, 19 May 2026 09:46:54 +0000</pubDate>
</item>
<item>
	<title>Ari Lamstein: How Remote Work Has Grown — and Shrunk — Since Covid</title>
	<guid>https://arilamstein.com/blog/2026/05/18/how-remote-work-has-grown-and-shrunk-since-covid/</guid>
	<link>https://arilamstein.com/blog/2026/05/18/how-remote-work-has-grown-and-shrunk-since-covid/</link>
	<description>&lt;p&gt;Remote work surged during Covid — and while it has declined since, it’s still far above pre‑pandemic levels. I just updated my &lt;a href=&quot;https://census-explorer.streamlit.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Covid Demographics Explorer&lt;/a&gt; with the latest ACS data, and the national trend is striking:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arilamstein.com/wp-content/uploads/2026/05/wfh-national-2024.png&quot;&gt;&lt;img /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Remote work more than tripled between 2019 and 2021, rising to nearly 28 million people at the height of the pandemic. Since then it has edged down each year, but only modestly. Even today, at about 22 million, it remains roughly 2.5 times the pre‑Covid level.&lt;/p&gt;
&lt;p&gt;The app now lets you generate this same graph for every state, as well as for counties and cities with populations of at least 65,000. &lt;a href=&quot;https://census-explorer.streamlit.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;See how the trend looks where you live&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Exploring Local Trends&lt;/h2&gt;
&lt;p&gt;I also added a &amp;#8220;Compare Years&amp;#8221; tab that lets you see which locations saw the biggest change in remote work between any two years. The national trend tells one story, but the local data tells another: the rise and fall of remote work played out very unevenly across the country. Below I run this analysis twice: first for the national increase from 2019-2021, and then for the gradual decline between 2021 and 2024.&lt;/p&gt;
&lt;h3&gt;The Remote Work Spike: 2019-2021&lt;/h3&gt;
&lt;p&gt;Between 2019 and 2021, the location that increased the number of remote workers the most was Sunnyvale, California. The number of remote workers there increased almost 11x in two years, from an estimated 3,235 to 38,319. Sunnyvale is in the heart of Silicon Valley, and tech companies were among the fastest to adopt remote work, which helps explain this result:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arilamstein.com/wp-content/uploads/2026/05/wfh-scattter-2019-2021-sunnyvale.png&quot;&gt;&lt;img /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The scatterplot also shows the broader pattern: most locations cluster between a 150% and 300% increase in remote work during this period. That makes Sunnyvale’s nearly 1,100% jump stand out even more — it’s an order of magnitude beyond the national norm.&lt;/p&gt;
&lt;p&gt;Interestingly, only one location in the entire dataset saw a decrease in remote work during this period: Rice County, Minnesota (-7.5%). It’s the lone point below zero on the chart, and I don’t have a clear explanation for it.&lt;/p&gt;
&lt;h3&gt;The Remote Work Decline: 2021-2024&lt;/h3&gt;
&lt;p&gt;When we run this same analysis for 2021–2024, we see a very different result: Sunnyvale’s remote workforce shrank by 67.2%, the largest drop in the dataset. This means that Sunnyvale saw both the largest increase between 2019 and 2021 and the largest decrease between 2021 and 2024:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://arilamstein.com/wp-content/uploads/2026/05/wfh-scattter-2021-2024-sunnyvale.png&quot;&gt;&lt;img /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The scatterplot also shows how different the overall pattern is in this period. Instead of large increases, most locations cluster between a 10% and 30% decline in remote work — a sharp contrast with the 2019–2021 graph, where nearly every location saw a substantial increase.&lt;/p&gt;
&lt;p&gt;Against this backdrop, Sunnyvale’s 67% drop stands out as an outlier. The likely explanation is the wave of return‑to‑office mandates that swept through the tech industry during this period. The two other largest decreases also happened in Silicon Valley: the city of Fremont (–61%) and Santa Clara County (–56%).&lt;/p&gt;
&lt;p&gt;At the other end of the distribution, the few places that saw increases tend to be warm‑weather, high‑amenity destinations: Marion County, Florida (69%), Collier County, Florida (65%), and Maui County, Hawaii (57%) saw the largest gains. These increases may reflect people with remote‑work jobs relocating to places with natural beauty and a high quality of life — a very different dynamic from the employer‑driven declines we see in Silicon Valley.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Three years after the peak, roughly 22 million Americans still work from home — more than double the pre-pandemic baseline. But the story is more complex than a single national number: a dramatic surge, an uneven retreat, and striking differences across the country. How does your corner of the country fit in?&lt;/p&gt;
&lt;p&gt;The new version of the Covid Demographics Explorer makes it easy to explore these patterns yourself. In addition to remote‑work trends, you can examine changes in population, median household income, median rent, and public assistance. &lt;a href=&quot;https://census-explorer.streamlit.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Analyze your own location&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This app was built in Python with the Streamlit framework. I teach Streamlit for O&amp;#8217;Reilly — and if you&amp;#8217;d like to learn to build apps like this yourself, I offer a free 7-day email course. Sign up in the form below.&lt;/p&gt;</description>
	<pubDate>Mon, 18 May 2026 20:00:30 +0000</pubDate>
</item>
<item>
	<title>Real Python: Python Built-in Functions: A Complete Guide</title>
	<guid>https://realpython.com/python-built-in-functions/</guid>
	<link>https://realpython.com/python-built-in-functions/</link>
	<description>&lt;div&gt;&lt;p&gt;Python’s &lt;strong&gt;built-in functions&lt;/strong&gt; are predefined functions you can use anywhere in your code without any imports. They handle common tasks across math, data type creation, iterable processing, and input and output. Knowing which ones to reach for makes your code shorter and more &lt;strong&gt;Pythonic&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this tutorial, you’ll:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recognize Python’s &lt;strong&gt;built-in functions&lt;/strong&gt; and the &lt;strong&gt;built-in scope&lt;/strong&gt; they live in&lt;/li&gt;
&lt;li&gt;Use the right built-in for &lt;strong&gt;math&lt;/strong&gt;, &lt;strong&gt;data types&lt;/strong&gt;, &lt;strong&gt;iterables&lt;/strong&gt;, and &lt;strong&gt;I/O&lt;/strong&gt; tasks&lt;/li&gt;
&lt;li&gt;Tell apart true functions and &lt;strong&gt;classes&lt;/strong&gt; that look like functions&lt;/li&gt;
&lt;li&gt;Apply built-ins to solve &lt;strong&gt;practical problems&lt;/strong&gt; without reinventing the wheel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get the most out of this tutorial, you’ll need to be familiar with Python programming, including topics like working with built-in &lt;a href=&quot;https://realpython.com/python-data-types/&quot;&gt;data types&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/defining-your-own-python-function/&quot;&gt;functions&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/python-classes/&quot;&gt;classes&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/primer-on-python-decorators/&quot;&gt;decorators&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/python-scope-legb-rule/&quot;&gt;scopes&lt;/a&gt;, and the &lt;a href=&quot;https://realpython.com/python-import/&quot;&gt;import&lt;/a&gt; system.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot;&gt;
&lt;p&gt;&lt;strong&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/python-built-in-functions-code/&quot; class=&quot;alert-link&quot;&gt;Click here to download the free sample code&lt;/a&gt; that shows you how to use Python’s built-in functions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;alert alert-warning&quot;&gt;
&lt;p&gt;&lt;strong&gt;Get the PDF Guide:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/python-built-in-functions-cheatsheet/&quot; class=&quot;alert-link&quot;&gt;Click here to download&lt;/a&gt; a free PDF guide that gives you a complete overview of Python’s built-in functions and how to use them.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt; Test your knowledge with our interactive “Python Built-in Functions: A Complete Guide” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr /&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;https://realpython.com/quizzes/python-built-in-functions/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; alt=&quot;Python's Built-in Functions: A Complete Exploration&quot; src=&quot;https://files.realpython.com/media/Pythons-Built-in-Functions-A-Quick-Exploration_Watermarked.44a8e102943b.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; /&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot;&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;https://realpython.com/quizzes/python-built-in-functions/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;Python Built-in Functions: A Complete Guide&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your understanding of Python's built-in functions for math, data types, iterables, and I/O—and when to reach for each one.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;built-in-functions-in-python&quot;&gt;Built-in Functions in Python&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#built-in-functions-in-python&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Python has several &lt;a href=&quot;https://realpython.com/defining-your-own-python-function/&quot;&gt;functions&lt;/a&gt; available for you to use directly from anywhere in your code. These functions are known as &lt;a href=&quot;https://docs.python.org/3/library/functions.html&quot;&gt;built-in functions&lt;/a&gt; and they cover many common programming problems, from mathematical computations to Python-specific features.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; All these functions live in the &lt;a href=&quot;https://docs.python.org/3/library/builtins.html&quot;&gt;&lt;code&gt;builtins&lt;/code&gt;&lt;/a&gt; module, which Python loads at startup and exposes through the built-in scope, so you can use them anywhere without importing the module. Importing the module explicitly is useful if you know that you’ll shadow a built-in name with one of your own variables or functions. Doing so keeps the original within reach as &lt;code&gt;builtins.name&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Among these built-ins, you’ll also find classes with function-style names like &lt;a href=&quot;https://realpython.com/ref/builtin-types/str/&quot; class=&quot;ref-link&quot;&gt;&lt;code&gt;str&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/ref/builtin-types/tuple/&quot; class=&quot;ref-link&quot;&gt;&lt;code&gt;tuple&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/ref/builtin-types/list/&quot; class=&quot;ref-link&quot;&gt;&lt;code&gt;list&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://realpython.com/ref/builtin-types/dict/&quot; class=&quot;ref-link&quot;&gt;&lt;code&gt;dict&lt;/code&gt;&lt;/a&gt;, which define built-in data types. These classes are listed in the Python documentation as &lt;em&gt;built-in functions&lt;/em&gt;, so they’re covered in this tutorial too.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;In this tutorial, you’ll learn the basics of Python’s built-in functions. By the end, you’ll know what their use cases are and how they work. You’ll start with the built-in functions for math computations.&lt;/p&gt;
&lt;h2 id=&quot;using-math-related-built-in-functions&quot;&gt;Using Math-Related Built-in Functions&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#using-math-related-built-in-functions&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In Python, you’ll find a few built-in functions that take care of common math operations, like computing the absolute value of a &lt;a href=&quot;https://realpython.com/python-numbers/&quot;&gt;number&lt;/a&gt;, calculating powers, and more. Here’s a summary of the math-related built-in functions in Python:&lt;/p&gt;
&lt;div class=&quot;table-responsive&quot;&gt;
&lt;table class=&quot;table table-hover&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://realpython.com/python-absolute-value/&quot;&gt;&lt;code&gt;abs()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Calculates the absolute value of a number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#divmod&quot;&gt;&lt;code&gt;divmod()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Computes the quotient and remainder of integer division&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://realpython.com/python-min-and-max/&quot;&gt;&lt;code&gt;max()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Finds the largest of the given arguments or items in an iterable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://realpython.com/python-min-and-max/&quot;&gt;&lt;code&gt;min()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Finds the smallest of the given arguments or items in an iterable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.python.org/3/library/functions.html#pow&quot;&gt;&lt;code&gt;pow()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Raises a number to a power&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://realpython.com/python-rounding/#pythons-built-in-round-function&quot;&gt;&lt;code&gt;round()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rounds a floating-point value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://realpython.com/python-sum-function/&quot;&gt;&lt;code&gt;sum()&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sums the values in an iterable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;In the following sections, you’ll learn how these functions work and how to use them in your Python code.&lt;/p&gt;
&lt;h3 id=&quot;getting-the-absolute-value-of-a-number-abs&quot;&gt;Getting the Absolute Value of a Number: &lt;code&gt;abs()&lt;/code&gt;&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#getting-the-absolute-value-of-a-number-abs&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Absolute_value&quot;&gt;absolute value&lt;/a&gt; or &lt;strong&gt;modulus&lt;/strong&gt; of a &lt;a href=&quot;https://en.wikipedia.org/wiki/Real_number&quot;&gt;real number&lt;/a&gt; is its non-negative value. In other words, the absolute value is the number without its &lt;a href=&quot;https://en.wikipedia.org/wiki/Sign_(mathematics)&quot;&gt;sign&lt;/a&gt;. For example, the absolute value of &lt;em&gt;-5&lt;/em&gt; is &lt;em&gt;5&lt;/em&gt;, and the absolute value of &lt;em&gt;5&lt;/em&gt; is also &lt;em&gt;5&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To learn more about &lt;code&gt;abs()&lt;/code&gt;, check out the &lt;a href=&quot;https://realpython.com/python-absolute-value/&quot;&gt;How to Find an Absolute Value in Python&lt;/a&gt; tutorial.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Python’s built-in &lt;code&gt;abs()&lt;/code&gt; function allows you to quickly compute the absolute value of a &lt;a href=&quot;https://realpython.com/python-numbers/&quot;&gt;number&lt;/a&gt;. Here’s its signature:&lt;/p&gt;

  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python Syntax&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;p&gt;The &lt;code&gt;number&lt;/code&gt; argument can be any numeric value, including integers, floating-point numbers, complex numbers, fractions, and decimals. Take a look at a few examples:&lt;/p&gt;

  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot;&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;decimal&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;fractions&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Fraction&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;42&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;42&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;42.42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;42.42&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;42.42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;42.42&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;complex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-2+3j&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;3.605551275463989&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;complex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;2+3j&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;3.605551275463989&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Fraction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-1/2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Fraction(1, 2)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Fraction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;1/2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Fraction(1, 2)&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;-0.5&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Decimal('0.5')&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;0.5&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Decimal('0.5')&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;p&gt;In these examples, you compute the absolute value of different numeric types using the &lt;code&gt;abs()&lt;/code&gt; function. First, you use integer numbers, then floating-point and complex numbers, and finally, fractional and decimal numbers. In all cases, when you call the function with a negative value, the final result removes the sign.&lt;/p&gt;
&lt;p&gt;For a practical example, say that you need to compute the total profits and losses of your company from a month’s transactions:&lt;/p&gt;

  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot;&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transactions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;incomes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;income&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;transactions&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expenses&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;hll&quot;&gt;&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expense&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;expense&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;transactions&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;expense&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Total incomes: $&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;incomes&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Total incomes: $800&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Total expenses: $&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expenses&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Total expenses: $300&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Total profit: $&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;incomes&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expenses&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Total profit: $500&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot;&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;

&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/python-built-in-functions/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/python-built-in-functions/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 18 May 2026 14:00:00 +0000</pubDate>
</item>
<item>
	<title>Python Bytes: #480 Proud Parents</title>
	<guid>https://pythonbytes.fm/episodes/show/480/proud-parents</guid>
	<link>https://pythonbytes.fm/episodes/show/480/proud-parents</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;&amp;lt;a href=&quot;https://www.better-simple.com/django/2026/05/06/using-django-tasks-in-production/?featured_on=pythonbytes&quot;&amp;gt;Using Django Tasks in production&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;Co-authored with Claude?&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://rushter.com/blog/pypi-packages/?featured_on=pythonbytes&quot;&amp;gt;PyPI packages are increasing rapidly&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://tildeweb.nl/~michiel/httpx2.html?featured_on=pythonbytes&quot;&amp;gt;httpx2&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=-x1R3S72gCU' style='font-weight: bold;'data-umami-event=&quot;Livestream-Past&quot; data-umami-event-episode=&quot;480&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 Training&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://courses.pythontest.com/p/the-complete-pytest-course?featured_on=pythonbytes&quot;&amp;gt;&amp;lt;strong&amp;gt;The Complete pytest Course&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://www.patreon.com/pythonbytes&quot;&amp;gt;&amp;lt;strong&amp;gt;Patreon Supporters&amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;strong&amp;gt;Connect with the hosts&amp;lt;/strong&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Michael: &amp;lt;a href=&quot;https://fosstodon.org/@mkennedy&quot;&amp;gt;@mkennedy@fosstodon.org&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://bsky.app/profile/mkennedy.codes?featured_on=pythonbytes&quot;&amp;gt;@mkennedy.codes&amp;lt;/a&amp;gt; (bsky)&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Brian: &amp;lt;a href=&quot;https://fosstodon.org/@brianokken&quot;&amp;gt;@brianokken@fosstodon.org&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://bsky.app/profile/brianokken.bsky.social?featured_on=pythonbytes&quot;&amp;gt;@brianokken.bsky.social&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;@pythonbytes@fosstodon.org&amp;lt;/a&amp;gt; / &amp;lt;a href=&quot;https://bsky.app/profile/pythonbytes.fm&quot;&amp;gt;@pythonbytes.fm&amp;lt;/a&amp;gt; (bsky)
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;Monday&amp;lt;/strong&amp;gt; at 11am PT. Older video versions available there too.
Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to &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;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Brian #1: &amp;lt;a href=&quot;https://www.better-simple.com/django/2026/05/06/using-django-tasks-in-production/?featured_on=pythonbytes&quot;&amp;gt;Using Django Tasks in production&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;Tim Schilling shares how the Djangonaut Space website has been using Django’s new tasks framework and some of the info missing from the official Django docs.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Tasks require a third party package, &amp;lt;a href=&quot;https://github.com/RealOrangeOne/django-tasks-db?featured_on=pythonbytes&quot;&amp;gt;&amp;lt;code&amp;gt;django-tasks-db&amp;lt;/code&amp;gt;&amp;lt;/a&amp;gt; to actually run the tasks.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Article walks through all changes necessary to get an email process running to notify admins of new testimonials. Cool simple example.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;With the db backend, you can monitor progress of tasks in the admin, to see which tasks are scheduled, completed, or have errors.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Some wishes for the community to implement
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;new tutorial in the Django docs&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Django Debug toolbar panel for tasks&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;test/mock backend&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Great title for wish list: Thinks I’d like to see, but I’m too lazy to implement myself.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Michael #2: Co-authored with Claude?&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Via Nik T.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;We don’t put “executed on macOS”, “edited with PyCharm”, etc. in our commits. Why Claude?&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Seems like a growth hack to me, that I don’t really care to participate in.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Some projects that have formalized their thoughts on this: &amp;lt;a href=&quot;https://redmonk.com/kholterhoff/2026/02/26/generative-ai-policy-landscape-in-open-source/?featured_on=pythonbytes&quot;&amp;gt;The Generative AI Policy Landscape in Open Source&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Adjust to turn off in &amp;lt;code&amp;gt;~/.claude/settings.json&amp;lt;/code&amp;gt; see &amp;lt;a href=&quot;https://code.claude.com/docs/en/settings#attribution-settings&quot;&amp;gt;the docs&amp;lt;/a&amp;gt;.
&amp;lt;div class=&quot;codehilite&quot;&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;w&quot;&amp;gt;   &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;quot;attribution&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;w&quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;w&quot;&amp;gt;      &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;quot;commit&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;w&quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;,&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;w&quot;&amp;gt;       &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;quot;pr&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;:&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;w&quot;&amp;gt; &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;w&quot;&amp;gt;   &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Brian #3: &amp;lt;a href=&quot;https://rushter.com/blog/pypi-packages/?featured_on=pythonbytes&quot;&amp;gt;PyPI packages are increasing rapidly&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;Artem Golubin&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;There’s been an increase of published packages per week on PyPI&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;A pretty big increase in the last handful of months.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;30% increase since 2025, clearly due to AI&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Artem is building &amp;lt;a href=&quot;https://github.com/rushter/hexora?featured_on=pythonbytes&quot;&amp;gt;hexora&amp;lt;/a&amp;gt;, a malicious Python code detector.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Cool package too, it can:
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Audit project dependencies to catch potential supply-chain attacks&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Detect malicious scripts found on platforms like Pastebin, GitHub, or open directories&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Analyze IoC files from past security incidents&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Audit new packages uploaded to PyPi.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Artem is using hexora to analyze recently published pypi packages and many are obviously vibecoded and trigger false positives for abuses of &amp;lt;code&amp;gt;eval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;subprocess&amp;lt;/code&amp;gt;
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Side note: I don’t think that’s necessarily a false positive. Not malicious, but maybe a stupid-code-detector?&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Lots are LLM related, Lots have bots contributing code&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Publishing rate is crazy, dozens to hundreds of published versions in a day is a bug, not a feature&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Brian’s proposal, PyPI should limit releases per day for any package to something a sane human would do, even if they make a mistake on a release, to maybe like 2-3, definitely under 10, in a day. And if the repo has obvious agent contributors listed, maybe lower to the limit to 1-2 a day? Honestly, “move fast and break things” doesn’t apply to breaking the commons.&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://tildeweb.nl/~michiel/httpx2.html?featured_on=pythonbytes&quot;&amp;gt;httpx2&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;More on the httpx, httpxyz, etc changes: Pydantic people started their own fork, &amp;lt;a href=&quot;https://github.com/pydantic/httpx2?featured_on=pythonbytes&quot;&amp;gt;httpx2&amp;lt;/a&amp;gt;.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Michiel says “while we think httpxyz was definitely needed, we welcome httpx2 and think it should be the ‘blessed’ fork.”&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Kludex, who is among other things maintainer of Starlette, was considering a fork&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;As it stands, httpx2 is lacking the performance improvements they added to httpxyz. But it will not be long before they will add those, too.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Also they already made some smart decisions:
&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;they are switching from certifi to &amp;lt;a href=&quot;https://github.com/pydantic/httpx2/pull/209?featured_on=pythonbytes&quot;&amp;gt;truststore&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;they are switching to &amp;lt;a href=&quot;https://github.com/pydantic/httpx2/pull/933?featured_on=pythonbytes&quot;&amp;gt;compression.zstd&amp;lt;/a&amp;gt; on Python 3.14+, enabling zstd compression by default&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;they &amp;lt;a href=&quot;https://github.com/pydantic/httpx2/commit/160c7f59d7942efe0133516c161d39139780eb45?featured_on=pythonbytes&quot;&amp;gt;merged httpcore&amp;lt;/a&amp;gt; and vendored it in their repository&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://news.ycombinator.com/item?id=48127570&amp;amp;featured_on=pythonbytes&quot;&amp;gt;Discussion on Hacker News&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;Extras&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

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

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://anarc.at/blog/2026-05-16-four-horsemen/?featured_on=pythonbytes&quot;&amp;gt;The Four Horsemen of the LLM Apocalypse&amp;lt;/a&amp;gt; - Anarcat&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://www.djangoproject.com/weblog/2026/may/12/2026-django-developers-survey/?featured_on=pythonbytes&quot;&amp;gt;Django/JetBrains 2026 developer survey&amp;lt;/a&amp;gt; is open&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://pyrefly.org/blog/v1.0/?featured_on=pythonbytes&quot;&amp;gt;Pyrefly 1.0&amp;lt;/a&amp;gt; : “meaning we are confident that Pyrefly is ready for production use.”
Michael:&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Just about ready to release Python Web Security: OWASP Top 10 with Agentic AI course. Be sure to be on &amp;lt;a href=&quot;https://training.talkpython.fm/getnotified?featured_on=pythonbytes&quot;&amp;gt;the courses newsletter&amp;lt;/a&amp;gt; to get notified.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Joke:&amp;lt;/strong&amp;gt; &amp;lt;a href=&quot;https://x.com/PR0GRAMMERHUM0R/status/1973145866962665752?featured_on=pythonbytes&quot;&amp;gt;Proud Parents&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;</description>
	<pubDate>Mon, 18 May 2026 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Core Dispatch: Core Dispatch #4</title>
	<guid>https://coredispatch.xyz/editions/4</guid>
	<link>https://coredispatch.xyz/editions/4</link>
	<description>&lt;p&gt;Welcome back to Core Dispatch! This edition covers April 30 through May 18, 2026.
Python 3.15.0 beta 1 is officially here, which means CPython&amp;#x27;s &lt;code&gt;main&lt;/code&gt; branch is
now open for 3.16 work. The first 3.16 alpha is slated for mid-October.
More imminently, beta 2 is up next on June 2, with 3.13.14 and 3.14.6
following on June 9.&lt;/p&gt;
&lt;p&gt;This is also PyCon US week, so a lot of the core team is gathered in Long
Beach right now. Once recordings are available, we&amp;#x27;ll be sure to pull talks
from folks on the team into a future edition.&lt;/p&gt;
&lt;p&gt;PEP 788 has also moved from accepted to implemented, and free-threaded builds
picked up thread-safe iterator support. There are also a few smaller but concrete fixes:
&lt;code&gt;http.server&lt;/code&gt; can send custom headers from the command line, &lt;code&gt;AttributeError&lt;/code&gt;
can suggest Python equivalents for method names from other languages,
&lt;code&gt;webbrowser&lt;/code&gt; on macOS is moving away from &lt;code&gt;osascript&lt;/code&gt;, and &lt;code&gt;ftplib.ftpcp()&lt;/code&gt;
picked up the PASV CVE fix.&lt;/p&gt;
&lt;p&gt;If you maintain a package or just like living on the edge, give the latest
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 2&lt;/a&gt; — Jun 02&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0719/&quot;&gt;Python 3.13.14&lt;/a&gt; — Jun 09&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0745/&quot;&gt;Python 3.14.6&lt;/a&gt; — Jun 09&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Official News&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.python.org/2026/05/python-3145-is-out/&quot;&gt;Python 3.14.5 is out!&lt;/a&gt; — By Hugo van Kemenade&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.python.org/2026/05/python-3150-beta-1/&quot;&gt;Python 3.15.0 beta 1 is here!&lt;/a&gt; — By Hugo van Kemenade&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.python.org/2026/05/python-3145rc1/&quot;&gt;Python 3.14.5 release candidate&lt;/a&gt; — By Hugo van Kemenade&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/135057&quot;&gt;Add a &lt;code&gt;--header&lt;/code&gt; CLI argument to &lt;code&gt;http.server&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/148894&quot;&gt;Add free-threading support for iterators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/146439&quot;&gt;Replace &lt;code&gt;osascript&lt;/code&gt; with &lt;code&gt;open&lt;/code&gt; on macOS in &lt;code&gt;webbrowser&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/148676&quot;&gt;Add &lt;code&gt;Zd&lt;/code&gt;/&lt;code&gt;Zf&lt;/code&gt; formats to &lt;code&gt;array&lt;/code&gt;, &lt;code&gt;ctypes&lt;/code&gt;, &lt;code&gt;memoryview&lt;/code&gt;, &lt;code&gt;struct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/146407&quot;&gt;Add cross-language method suggestions for builtin AttributeError&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/149116&quot;&gt;Implement PEP 788&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/149648&quot;&gt;Apply CVE-2021-4189 PASV fix to &lt;code&gt;ftplib.ftpcp()&lt;/code&gt;&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-661-sentinel-values/9126&quot;&gt;PEP 661: Sentinel Values&lt;/a&gt; — 🔥 32 new replies · 34.7k 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; — 9 new replies · 4.2k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-802-display-syntax-for-the-empty-set/101676&quot;&gt;PEP 802: Display Syntax for the Empty Set&lt;/a&gt; — 6 new replies · 10.4k views&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/pep-828-supporting-yield-from-in-asynchronous-generators/106459&quot;&gt;PEP 828: Supporting &lt;code&gt;yield from&lt;/code&gt; in asynchronous generators&lt;/a&gt; — 5 new replies · 3.3k views&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://2026.pycon.it/en&quot;&gt;PyCon Italia 2026&lt;/a&gt; — May 27&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonleiden.nl/meeting-2026-05-28.html?py&quot;&gt;Python Leiden User Group&lt;/a&gt; — May 28&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://python-summit.ch/&quot;&gt;📋 Swiss Python Summit 2026 Deadline&lt;/a&gt; — May 31&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pycon.id/&quot;&gt;📋 PyCon Indonesia 2026 Deadline&lt;/a&gt; — May 31&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pycontg.pytogo.org/&quot;&gt;📋 PyCon Togo 2026 Deadline&lt;/a&gt; — Jun 01&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gh.pycon.org/2026/&quot;&gt;📋 PyCon Ghana 2026 Deadline&lt;/a&gt; — Jun 06&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://2026.geopython.net/&quot;&gt;GeoPython 2026&lt;/a&gt; — Jun 08&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.pycon.ke/&quot;&gt;📋 PyCon Kenya 2026 Deadline&lt;/a&gt; — Jun 09&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://2026.pycon.kr/&quot;&gt;📋 PyCon South Korea 2026 Deadline (extended)&lt;/a&gt; — Jun 14&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://2026.pythonho.com/&quot;&gt;📋 Python Ho 2026 Deadline&lt;/a&gt; — Jun 15&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;One More Thing&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&quot;It&amp;#x27;s oompa loompa shit&quot;&lt;/p&gt;— &lt;a href=&quot;https://github.com/pablogsal&quot;&gt;Pablo Galindo Salgado&lt;/a&gt;&lt;/blockquote&gt;
&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;li&gt;&lt;a href=&quot;https://github.com/emmatyping&quot;&gt;Emma Smith&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Artem Golubin: PyPI packages are increasing rapidly</title>
	<guid>https://rushter.com/blog/pypi-packages/</guid>
	<link>https://rushter.com/blog/pypi-packages/</link>
	<description>&lt;p&gt;PyPI is the main repository for Python packages.
One thing that I've noticed recently is the number of published packages per week.&lt;/p&gt;
&lt;p&gt;Let's look at published counts of new package versions per week:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://rushter.com/static/uploads/img/2026/pypi_stats_weekly.png&quot; class=&quot;ui centered image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are some dips in the data, but that's because of how the &lt;a href=&quot;https://clickpy.clickhouse.com/&quot; target=&quot;_blank&quot;&gt;data&lt;/a&gt; was collected.
We can see a clear increase in the number of published packages, especially in the last few months.&lt;/p&gt;
&lt;p&gt;Because of AI, the number of packages published per week has increased by 30% since 2025.&lt;/p&gt;
&lt;p&gt;I'm working on &lt;a href=&quot;https://github.com/rushter/hexora&quot; target=&quot;_blank&quot;&gt;hexora&lt;/a&gt;, a library that detects malicious Python code in packages.[......]&lt;/p&gt;</description>
	<pubDate>Sun, 17 May 2026 13:37:15 +0000</pubDate>
</item>
<item>
	<title>PyCon: Welcome Back, NVIDIA: Visionary Sponsor of PyCon US 2026</title>
	<guid>https://pycon.blogspot.com/2026/05/welcome-back-nvidia-visionary-sponsor.html</guid>
	<link>https://pycon.blogspot.com/2026/05/welcome-back-nvidia-visionary-sponsor.html</link>
	<description>&lt;p&gt;NVIDIA is excited to once again support PyCon US 2026 as a &lt;a href=&quot;https://us.pycon.org/2026/sponsorship/sponsors/&quot; target=&quot;_blank&quot;&gt;Visionary Sponsor&lt;/a&gt;, and to sponsor the &lt;a href=&quot;https://us.pycon.org/2026/tracks/ai/&quot; target=&quot;_blank&quot;&gt;Future of AI with Python Conference Track&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Python is a “first-class” language at NVIDIA CUDA, and NVIDIA is committed to bringing our technology to Python developers in close alignment with C++ upon new releases of our hardware. We’re also happy to announce the general availability of &lt;a href=&quot;https://github.com/nvidia/cuda-python&quot; target=&quot;_blank&quot;&gt;CUDA Python 1.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;NVIDIA’s commitment to Python goes well beyond just our own tech stack. NVIDIA’s Python engineers contribute across a broad swath of the Python ecosystem, from the core interpreter itself, to packaging and PyPI, to the Python community at large. NVIDIA is inspired by the energy of, and privileged to collaborate with, people across the open source Python community.&lt;br /&gt;&lt;br /&gt;Since PyCon last year, NVIDIA Pythonistas – in collaboration with many others in the Python community – have made great progress on the evolution of various packaging standards, including working with community partners on the implementation of &lt;a href=&quot;https://peps.python.org/pep-0825/&quot; target=&quot;_blank&quot;&gt;wheel variants&lt;/a&gt; and the &lt;a href=&quot;https://peps.python.org/pep-0772/&quot; target=&quot;_blank&quot;&gt;establishment of a Packaging Council&lt;/a&gt; to better govern the evolution of packaging standards and &lt;a href=&quot;https://pypi.org/&quot; target=&quot;_blank&quot;&gt;PyPI&lt;/a&gt;. NVIDIA Python engineers are also engaged in implementation, testing, and porting work for the &lt;a href=&quot;https://docs.python.org/3/howto/free-threading-python.html&quot; target=&quot;_blank&quot;&gt;free-threaded&lt;/a&gt; build of the interpreter. NVIDIA Python engineers are driving the early exploratory work for adopting Rust for CPython, work on Python performance benchmarking, and are actively involved in many enhancements for Python 3.14 and 3.15, including providing built-in &lt;a href=&quot;https://peps.python.org/pep-0784/&quot; target=&quot;_blank&quot;&gt;Zstandard support in Python 3.14&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At NVIDIA, we are excited to work with our partners and the open source Python community to help bring the best developer experience for users of high performance computing and AI. Come see NVIDIA at the &lt;a href=&quot;https://pycon-assets.s3.amazonaws.com/2026/media/documents/floor_plan.png&quot; target=&quot;_blank&quot;&gt;Anaconda and PyTorch booths&lt;/a&gt;, and at the AI Track.&lt;br /&gt;&lt;br /&gt;Barry Warsaw&lt;br /&gt;May 2026&lt;br /&gt;Principal System Software Engineer, NVIDIA&lt;br /&gt;Python Core Developer since 1994&lt;br /&gt;Python Steering Council member in 2026&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 16 May 2026 14:30:37 +0000</pubDate>
</item>
<item>
	<title>Anarcat: The Four Horsemen of the LLM Apocalypse</title>
	<guid>https://anarc.at/blog/2026-05-16-four-horsemen/</guid>
	<link>https://anarc.at/blog/2026-05-16-four-horsemen/</link>
	<description>&lt;p&gt;I have been battling Large Language Models (LLM&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;https://anarc.at/tag/python-planet/#fn:1&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;) for the past
couple of weeks and have struggled to think about what it means and
how to deal with its fallout.&lt;/p&gt;

&lt;p&gt;Because the fight has come from many fronts, I've come to articulate
this in terms of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Four_Horsemen_of_the_Apocalypse&quot;&gt;Four Horsemen of the Apocalypse&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Sound track: Metallica's &lt;a href=&quot;https://www.metallica.com/songs/the-four-horsemen.html&quot;&gt;The Four Horsemen&lt;/a&gt;, preferably
&lt;a href=&quot;https://en.wikipedia.org/wiki/Metallica_v._Napster,_Inc.&quot;&gt;downloaded from Napster around 2000&lt;/a&gt;, but now I guess you &lt;a href=&quot;https://www.youtube.com/watch?v=-zKOhVSERS8&quot;&gt;get
it on YouTube&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h1 id=&quot;war-bot-armies&quot;&gt;War: bot armies&lt;/h1&gt;

&lt;p&gt;Let's start with War. We've been battling bot armies for control of
our GitLab server &lt;a href=&quot;https://gitlab.torproject.org/tpo/tpa/team/-/work_items/42152&quot;&gt;for a while&lt;/a&gt;. Bots crawl virtually infinite
endpoints on our Git repositories (as opposed to downloading an
archive or shallow clone), including our fork of Firefox, Tor Browser,
a massive repository.&lt;/p&gt;

&lt;p&gt;At first, we've tried various methods: &lt;a href=&quot;https://www.robotstxt.org/&quot;&gt;robots.txt&lt;/a&gt;, blocking user
agents, and finally blocking entire networks. I &lt;a href=&quot;https://anarc.at/blog/2025-05-30-asncounter/&quot;&gt;wrote
asncounter&lt;/a&gt;. It worked for a while.&lt;/p&gt;

&lt;p&gt;But now, blocking entire networks doesn't work: they come back some
other way, typically through &lt;a href=&quot;https://acid.vegas/blog/the-shady-world-of-ip-leasing/&quot;&gt;shady proxy networks&lt;/a&gt;, which is kind
of ironic considering we're essentially running the largest proxy
network of the world.&lt;/p&gt;

&lt;p&gt;Out of desperation, we've forced users to &lt;a href=&quot;https://gitlab.torproject.org/tpo/tpa/team/-/wikis/policy/0108-gitlab-cookie-and-javascript-enforcement&quot;&gt;use cookies&lt;/a&gt; when
visiting our site. We haven't deployed &lt;a href=&quot;https://anubis.techaro.lol/&quot;&gt;Anubis&lt;/a&gt; yet, as we worry
that &lt;a href=&quot;https://social.anoxinon.de/@Codeberg/115033790447125787&quot;&gt;bots have broken Anubis anyways&lt;/a&gt; and that it &lt;a href=&quot;https://lock.cmpxchg8b.com/anubis.html&quot;&gt;does not really
defend against a well-funded attacker&lt;/a&gt;, something which &lt;a href=&quot;https://behind.pretix.eu/2025/05/23/captchas-are-over/&quot;&gt;Pretix
warned against in 2025 already&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;(We have a whole &lt;a href=&quot;https://gitlab.torproject.org/tpo/tpa/team/-/work_items/42229&quot;&gt;discussion regarding those tools here&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;But even that, predictably, has failed. I suspect what we consider
bots are now really agents. They run full web browsers, JavaScript
included, so a feeble cookie is no match for the massive bot armies.&lt;/p&gt;

&lt;h2 id=&quot;side-note-on-llm-order-of-battle&quot;&gt;Side note on LLM &quot;order of battle&quot;&lt;/h2&gt;

&lt;p&gt;We often underestimate the size of that army. The cloud was huge even
before LLMs, serving about two thirds of the web. Even larger swaths of
clients like government and corporate databases have all moved to the
cloud, in shared, but private infrastructure with massive spare
capacity that is readily available to anyone who pays.&lt;/p&gt;

&lt;p&gt;LLMs have made the problem worse by dramatically expanding the
capacity of the &quot;cloud&quot;. We now have data centers that defy
imagination with &lt;a href=&quot;https://epoch.ai/data/data-centers&quot;&gt;millions of cores&lt;/a&gt;, petabytes of memory, exabytes
of storage.&lt;/p&gt;

&lt;p&gt;I thought that &lt;a href=&quot;https://sschueller.github.io/posts/the-free-market-lie/&quot;&gt;25 gigabit residential internet in Switzerland&lt;/a&gt;
could bring balance, but this is nothing compared to the scale of
those data centers.&lt;/p&gt;

&lt;p&gt;Those companies can launch thousands, if not millions of fully
functional web browsers at our servers. Computing power or bandwidth
are not a limitation for them, our primitive infrastructure is. No one
but hyperscalers can deal with this kind of load, and I suspect that
they are also struggling, as even &lt;a href=&quot;https://www.androidauthority.com/google-recaptcha-play-services-requirement-3664806/&quot;&gt;Google is deploying extreme
mechanisms in reCAPTCHA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the largest attack on the internet since the &lt;a href=&quot;https://en.wikipedia.org/wiki/Morris_worm&quot;&gt;Morris
worm&lt;/a&gt; but while &lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Tappan_Morris&quot;&gt;Robert Tappan Morris&lt;/a&gt; went to jail on a felony,
LLM companies are celebrated as innovators and will soon be too big to
fail.&lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;https://anarc.at/tag/python-planet/#fn:2&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Which brings us to the second horsemen, famine.&lt;/p&gt;

&lt;h1 id=&quot;famine-shortages&quot;&gt;Famine: shortages&lt;/h1&gt;

&lt;p&gt;All that computing power doesn't come out of thin air: it needs
massive amounts of hardware, power, and cooling.&lt;/p&gt;

&lt;p&gt;Earlier this year, I've heard from a colleague that their Dell
supplier refused to even provide a &lt;em&gt;quote&lt;/em&gt; before August. Dell!&lt;/p&gt;

&lt;p&gt;In February, &lt;a href=&quot;https://www.techspot.com/news/111346-western-digital-hdd-production-capacity-2026-already-sold.html&quot;&gt;Western Digital's hard drive production for 2026 was
already sold out&lt;/a&gt;. Hard drives essentially &lt;a href=&quot;https://gitlab.torproject.org/tpo/tpa/team/-/work_items/42465&quot;&gt;doubled in price within
a year&lt;/a&gt;, and some have now tripled. A server quote we had in
November has now &lt;em&gt;quadrupled&lt;/em&gt;, going from 10 thousand to &lt;em&gt;FORTY&lt;/em&gt;
thousand dollars for a single server.&lt;/p&gt;

&lt;p&gt;But regular folks are facing real-life shortages as well, as
&lt;a href=&quot;https://www.theguardian.com/us-news/2026/may/13/utah-approves-datacenter-backlash&quot;&gt;city-size data centers&lt;/a&gt; are being built at neck-breaking speed,
stealing fresh water and energy from human beings to feed the war
machine.&lt;/p&gt;

&lt;p&gt;We've been scared of losing our jobs, but it seems that Apocalypse has
yet to fully materialize. Regardless for engineers, the market feels
tighter than it was a couple years ago, and everyone feels on edge
that they will just have to learn to operate LLMs to keep their jobs.&lt;/p&gt;

&lt;p&gt;Which brings us, of course, to Death.&lt;/p&gt;

&lt;h1 id=&quot;death-security-and-copyright&quot;&gt;Death: security and copyright&lt;/h1&gt;

&lt;p&gt;Our third horseman is one I did &lt;em&gt;not&lt;/em&gt; expect a couple of months
ago. Back at FOSDEM, &lt;code&gt;curl&lt;/code&gt;'s maintainer Daniel Stenberg famously
&lt;a href=&quot;https://lwn.net/Articles/1058266/&quot;&gt;complained about the poor quality of LLM-generated reports&lt;/a&gt; but
then, a few months later, everyone is &lt;a href=&quot;https://lwn.net/Articles/1066581/&quot;&gt;scrambling to deal with floods
of good reports&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the past two weeks, this culminated in a significant number of
critical security issues across multiple projects. Chained
together, remote code execution vulnerabilities in &lt;a href=&quot;https://depthfirst.com/nginx-rift&quot;&gt;Nginx&lt;/a&gt; and
&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23918&quot;&gt;Apache&lt;/a&gt; and &lt;em&gt;two&lt;/em&gt; local privilege escalations in the Linux kernel
(&lt;a href=&quot;https://github.com/V4bel/dirtyfrag/&quot;&gt;dirtyfrag&lt;/a&gt; and &lt;a href=&quot;https://github.com/v12-security/pocs/tree/main/fragnesia#fragnesia&quot;&gt;fragnesia&lt;/a&gt;) essentially gave anyone root access to any unpatched server to the web.&lt;/p&gt;

&lt;p&gt;As I write this, &lt;a href=&quot;https://github.com/0xdeadbeefnetwork/ssh-keysign-pwn&quot;&gt;another vulnerability dropped&lt;/a&gt;, which gives read
access to any file to a local user, compromising TLS and SSH private
keys.&lt;/p&gt;

&lt;p&gt;All those vulnerabilities were released without any significant
coordination while people scrambled to mitigate.&lt;/p&gt;

&lt;p&gt;Many people &lt;a href=&quot;https://lwn.net/Articles/1072007/#Comments&quot;&gt;including Linus Torvalds&lt;/a&gt; are now considering issues
discovered through LLMs to be essentially public. This puts &lt;a href=&quot;https://lwn.net/Articles/1071499/&quot;&gt;some
debates about disclosure processes&lt;/a&gt; in perspective, to say the
least.&lt;/p&gt;

&lt;p&gt;But this is not merely the death of the traditional coordinated disclosure
process, the C programming language, or the Linux kernel: remember
that those bots are trained on a large corpus of copyrighted
material. Facebook has &lt;a href=&quot;https://www.theguardian.com/technology/2025/jan/10/mark-zuckerberg-meta-books-ai-models-sarah-silverman&quot;&gt;trained their models on pirated books&lt;/a&gt; and
&lt;a href=&quot;https://torrentfreak.com/nvidia-contacted-annas-archive-to-secure-access-to-millions-of-pirated-books/&quot;&gt;Nvidia has done deals with Anna's Archive&lt;/a&gt; to secure access to
large swaths of copyrighted material. The &lt;a href=&quot;https://www.congress.gov/crs-product/LSB10922&quot;&gt;US Congress seems to think
LLM outputs are not copyrightable&lt;/a&gt;, like any other machine outputs.&lt;/p&gt;

&lt;p&gt;With many people now vibe coding their way out of learning or
remembering how computers work, is this the Death of Copyright?&lt;/p&gt;

&lt;p&gt;And that, of course, brings us to the final horseman: Pestilence.&lt;/p&gt;

&lt;h1 id=&quot;pestilence-slop&quot;&gt;Pestilence: slop&lt;/h1&gt;

&lt;p&gt;There is a growing meme that programming is essentially over as we
know it. That you can simply vibe-code applications from scratch and
it's pretty good.&lt;/p&gt;

&lt;p&gt;Maybe that's true.&lt;/p&gt;

&lt;p&gt;So far, most of my attempts at resolving any complex problem with a
LLM have often failed with bizarre failures. &lt;a href=&quot;https://gitlab.com/anarcat/scripts/-/blob/main/transmodify.py?ref_type=heads&quot;&gt;Some worked surprisingly
well.&lt;/a&gt; Maybe, of course, I am holding it wrong.&lt;/p&gt;

&lt;p&gt;I personally don't believe LLMs will ever be good enough to produce
and maintain software at scale. They're surprisingly good at finding
security flaws right now. But what I see is also a lot of
&lt;a href=&quot;https://en.wikipedia.org/wiki/Bullshit&quot;&gt;Bullshit&lt;/a&gt;, with a capital B. It's not lying: it does not &quot;know&quot;
anything, so it &lt;em&gt;can't&lt;/em&gt; lie. It's misleadingly cohesive and
deliberate, but it lacks meaning, intent, will.&lt;/p&gt;

&lt;p&gt;I have not been confronted with much slop, apart from the lobster
Jesus or the yellow man atrocities, and particularly not in my
work. But I see what it is doing to my profession: beyond
&lt;a href=&quot;https://en.wikipedia.org/wiki/Vibe_coding&quot;&gt;vibe-coding&lt;/a&gt;, people are now &lt;a href=&quot;https://www.forbes.com/sites/timkeary/2026/04/13/is-the-cult-of-tokenmaxxingjust-another-fad-or-the-new-normal/&quot;&gt;token-maxxing&lt;/a&gt;, and
&lt;a href=&quot;https://leehanchung.github.io/blogs/2026/04/05/the-ai-great-leap-forward/#let-a-hundred-skills-bloom&quot;&gt;land-grabbing their colleagues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I don't like what LLMs do to our communities, or the fabric of
software we live with.&lt;/p&gt;

&lt;p&gt;Software does not evolve in a void. It is a team effort, be it free
software or a corporate product. Generations of humans have carefully
built the scaffolding of technology required for modern networks and
software to operate, in a convoluted contraption that no single human
fully understands anymore.&lt;/p&gt;

&lt;p&gt;The idea of simply giving up on that understanding entirely and
delegating it to an unproven model is not only chilling, it feels just
plain stupid. Not stupid as in &lt;a href=&quot;https://en.wikipedia.org/wiki/Skynet_(Terminator)&quot;&gt;Skynet&lt;/a&gt;, stupid as in &quot;I can't get
inside the data center because the authentication system is
down&quot;. Except we're in a &quot;the power plant doesn't reboot&quot; or &quot;their
LLM found an 0day in our slop&quot; kind of stupid.&lt;/p&gt;

&lt;h1 id=&quot;the-fifth-horsemen&quot;&gt;The fifth horsemen&lt;/h1&gt;

&lt;p&gt;Researching for this article, I looked up the four horsemen and found
out they original seems to have been:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Famine&lt;/li&gt;
&lt;li&gt;War&lt;/li&gt;
&lt;li&gt;Death&lt;/li&gt;
&lt;li&gt;Conquest (??)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I was surprised. I grew up thinking about the horsemen being Famine,
War, Pestilence, and Death. So I went back to &lt;a href=&quot;https://www.metallica.com/songs/the-four-horsemen.html&quot;&gt;my original source&lt;/a&gt;
which actually claims the horsemen are:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Time has taken its toll on you, the lines that crack your face.
Famine, your body, it has torn through, withered in every place.
Pestilence for what you've had to endure, and what you have put others through
Death, deliverance for you, for sure, now there's nothing you can do
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So I guess that makes no sense either, which, fair enough, I shouldn't
rely on Metallica for theological references. Especially since that
song was originally called &lt;a href=&quot;https://en.wikipedia.org/wiki/Mechanix&quot;&gt;Mechanix&lt;/a&gt; and was &quot;about having sex at
a gas station&quot;.&lt;/p&gt;

&lt;p&gt;Anyways.&lt;/p&gt;

&lt;p&gt;The point is, there are actually five horsemen, and the fifth one is,
in my opinion, Conquest.&lt;/p&gt;

&lt;p&gt;Those companies (and &lt;em&gt;not&lt;/em&gt; &quot;AI&quot;, mind you) are taking over the
world. I sense a strong connection with the &quot;post-truth&quot; world imposed
on us by fascists like Trump and Putin. It's not an accident, it's a
power grab part of the &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Californian_Ideology&quot;&gt;Californian Ideology&lt;/a&gt;&lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;https://anarc.at/tag/python-planet/#fn:3&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;. Just like Airbnb
broke housing, Uber destroyed the transportation and Amazon is taking
over retail and server hosting, LLM companies are essentially trying
to take over if not everything, at least &lt;a href=&quot;https://en.wikipedia.org/wiki/Cognition&quot;&gt;Cognition&lt;/a&gt; as a whole.&lt;/p&gt;

&lt;p&gt;But the capitalization of those companies (OpenAI and Nvidia in particular)
are so far beyond reason that their inevitable collapse will likely
lead to a global financial collapse of biblical proportions.&lt;/p&gt;

&lt;p&gt;Because they will inevitably fail like previous bubbles they are built
on. And when they fail, I hope it zips all the way back through the
blockchain scam, the ad surveillance system, and the dot com then git
me back my internet.&lt;/p&gt;

&lt;h1 id=&quot;the-tower-of-babel&quot;&gt;The Tower of Babel&lt;/h1&gt;

&lt;p&gt;While I'm off in the woods hallucinating (ha!) on biblical allegories,
I feel there's another sign that the apocalypse is coming.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Tower_of_Babel&quot;&gt;Tower of Babel&lt;/a&gt; myth says that humans tried to create a big
tower up to heaven and become god. God confounds their speech and
scatters the human race. End of utopia.&lt;/p&gt;

&lt;p&gt;This is what is happening to our human translators now. LLMs being,
after all, Language Models, they are excellent at translation work. So
much that the only translators not replaced by LLMs right now are
&lt;a href=&quot;https://en.wikipedia.org/wiki/Language_interpretation&quot;&gt;interpreters&lt;/a&gt;, who translate vocally in real time. But
interpreters are worried about their jobs as well.&lt;/p&gt;

&lt;p&gt;This concretely means we will lose the human capacity, as a
civilization, to translate between each other. It is still an &lt;a href=&quot;https://revues.imist.ma/index.php/JALCS/article/view/59018&quot;&gt;open
question&lt;/a&gt; whether the remaining revision work will be enough for
translators to avoid deskilling, but other research has shown that LLM
use &lt;a href=&quot;https://publichealthpolicyjournal.com/mit-study-finds-artificial-intelligence-use-reprograms-the-brain-leading-to-cognitive-decline/&quot;&gt;leads to cognitive decline&lt;/a&gt;, &lt;a href=&quot;https://dl.acm.org/doi/full/10.1145/3706598.3713778&quot;&gt;impacts critical thinking&lt;/a&gt;,
and generally, that &lt;a href=&quot;https://publicera.kb.se/ir/article/view/47143&quot;&gt;deskilling is a common outcome&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ultimately, I think this is where LLMs bring us. Towards collapse.&lt;/p&gt;

&lt;p&gt;So this is a call to arms. Fight back!&lt;/p&gt;

&lt;p&gt;Poison bots. Build local real-world communities.&lt;/p&gt;

&lt;p&gt;Go low tech. &lt;a href=&quot;https://en.wikipedia.org/wiki/Moore%27s_law&quot;&gt;Moore's law&lt;/a&gt; is dead, &lt;a href=&quot;https://spectrum.ieee.org/the-death-of-moores-law-will-spur-innovation&quot;&gt;make use of it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Patch your shit. &lt;a href=&quot;https://anginedepoitrine.com/&quot;&gt;Go weird&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Refuse slop. Train your brain.&lt;/p&gt;

&lt;p&gt;The horsemen will collapse, but let's not go down with them.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dune.fandom.com/wiki/Butlerian_Jihad&quot;&gt;Butlerian Jihad&lt;/a&gt;!&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This article was written without the use of a large language model
and should not be used to train one.&lt;/p&gt;&lt;/blockquote&gt;



&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn:1&quot;&gt;
I prefer &quot;LLM&quot; to Artificial Intelligence, as I don't consider
models to have &quot;Intelligence&quot; which goes far beyond the analytical
traits we train models for. Intelligence &lt;em&gt;requires&lt;/em&gt; embodiment
and social interaction; machines lack the innate human skills of
empathy, feeling and care, which explains a lot of the evils
behind the current trends.&lt;a href=&quot;https://anarc.at/tag/python-planet/#fnref:1&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn:2&quot;&gt;
It should be noted that Morris also happened to be one of the
founder of &lt;a href=&quot;https://en.wikipedia.org/wiki/Y_Combinator&quot;&gt;Y Combinator&lt;/a&gt; where he is in good company with
other techno-fascists like Peter Thiel, Sam Altman, and so
on. Crime, after all, pays.&lt;a href=&quot;https://anarc.at/tag/python-planet/#fnref:2&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;fn:3&quot;&gt;
Probably a good time to watch &lt;a href=&quot;https://en.wikipedia.org/wiki/All_Watched_Over_by_Machines_of_Loving_Grace_(TV_series)&quot;&gt;All Watched Over by Machines of Loving Grace&lt;/a&gt;.&lt;a href=&quot;https://anarc.at/tag/python-planet/#fnref:3&quot; rev=&quot;footnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
	<pubDate>Fri, 15 May 2026 21:25:27 +0000</pubDate>
</item>
<item>
	<title>PyCharm: Pyrefly LSP Integration with Type Engine in PyCharm 2026.1.2</title>
	<guid>https://blog.jetbrains.com/pycharm/2026/05/pyrefly-lsp-integration-in-pycharm-2026-1-2/</guid>
	<link>https://blog.jetbrains.com/pycharm/2026/05/pyrefly-lsp-integration-in-pycharm-2026-1-2/</link>
	<description>&lt;p&gt;In PyCharm 2026.1.2, you can enable &lt;a href=&quot;https://pyrefly.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pyrefly&lt;/a&gt; as an external type provider, dramatically increasing the speed of the IDE’s code insight features.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;What is the Pyrefly LSP?&lt;/h2&gt;



&lt;p&gt;“LSP” stands for the &lt;strong&gt;Language Server Protocol&lt;/strong&gt; – a standardized protocol that allows code editors and IDEs to communicate with &lt;strong&gt;language servers&lt;/strong&gt;. The LSP enables language servers to provide code intelligence features, such as:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Code completion&lt;/li&gt;



&lt;li&gt;Information on hover (for example, quick documentation)&lt;/li&gt;



&lt;li&gt;&lt;em&gt;Go to definition &lt;/em&gt;and other actions&lt;/li&gt;



&lt;li&gt;Error checking and type-related diagnostics&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;/p&gt;



&lt;p&gt;The key benefit of the LSP is that it allows a single language server to be used across multiple tools. This means that language-specific intelligence does not have to be implemented separately in every editor, IDE, or CI pipeline.&lt;/p&gt;



&lt;p&gt;Pyrefly is Meta’s next-generation Python type checker, engineered from the ground up in Rust to replace its predecessor, Pyre (written in OCaml). With the move to Rust, Pyrefly achieves significantly faster performance and improved cross-platform portability. More than just a rewrite, it is designed to be more capable and robust, offering an efficient toolset for maintaining large-scale Python codebases with high precision and minimal overhead.&lt;/p&gt;



&lt;p&gt;Pyrefly provides the following benefits:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Higher performance and efficiency&lt;/strong&gt; – Thanks to its Rust-based architecture, Pyrefly achieves significantly faster speeds and improves cross-platform portability.&amp;nbsp;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Enhanced code intelligence&lt;/strong&gt; – As an external type provider, Pyrefly powers essential code insight features in the IDE, including type inference, type-related diagnostics, quick documentation, and inlay hints.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt; – Pyrefly is designed to handle &lt;strong&gt;large-scale Python codebases&lt;/strong&gt; with high precision and minimal overhead.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Pyrefly is highly beneficial for projects and developers dealing with &lt;strong&gt;large, complex Python codebases&lt;/strong&gt; that prioritize performance and robust typing. Integrating Pyrefly via the LSP is part of our ongoing work to enhance code insight performance in PyCharm.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Using Pyrefly in PyCharm&lt;/h2&gt;



&lt;p&gt;Once enabled, Pyrefly powers all code insight functionality in PyCharm, including type inference and type-related diagnostics, quick documentation, and inlay hints. Delegating analysis to this faster engine delivers significantly improved performance.&lt;/p&gt;



&lt;p&gt;To start using Pyrefly in your PyCharm project, go to the &lt;em&gt;Type&lt;/em&gt; widget at the bottom of the window. By default, the IDE uses the built-in type engine. Click on the widget and select the option to use Pyrefly. If you do not have Pyrefly installed yet, PyCharm will install it automatically.&amp;nbsp;&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/install-pyrefly.gif&quot; alt=&quot;&quot; class=&quot;wp-image-706921&quot; /&gt;



&lt;p&gt;Once you’ve switched to the Pyrefly type engine, you will see a Pyrefly icon at the bottom, which you can hover over to check the version being used.&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image-15.png&quot; alt=&quot;&quot; class=&quot;wp-image-706874&quot; /&gt;



&lt;p&gt;Please note that the integration currently works for local interpreter configurations. Support for Docker, Docker Compose, WSL, SSH, and multi-module projects is planned for future releases.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Pyrefly vs. the built-in type engine&lt;/h2&gt;



&lt;p&gt;Now let’s look at how Pyrefly and the built-in type engine behave in a complex Python project. In this FastAPI example, multiple files are typed, but in this file, the variable &lt;em&gt;ref &lt;/em&gt;is incorrectly typed, causing four errors. When using the built-in type engine, the IDE identifies that something is wrong, but it suggests running further analysis to fix the problem, which requires an extra step.&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/image.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-706886&quot; /&gt;



&lt;p&gt;Using Pyrefly as the type engine, the IDE reports errors immediately and highlights where they originate. However, it is worth noting that, in our example, there are four errors, but Pyrefly picks up only three of them. It misses the one in &lt;code&gt;self._storage[ref]&lt;/code&gt;.&lt;/p&gt;



&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/05/pyrefly-checking.gif&quot; alt=&quot;&quot; class=&quot;wp-image-706934&quot; /&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Download the latest version of PyCharm and try it out&lt;/h2&gt;



&lt;p&gt;Ready to experience a dramatic leap in Python development performance? The Pyrefly type engine in PyCharm 2026.1.2 delivers the next generation of type checking. Engineered in Rust for unparalleled speed, it resolves files in as little as 0.5–1 seconds, significantly faster than the built-in engine. If you maintain large, complex Python codebases and prioritize robust typing, this feature is essential, as it allows you to delegate analysis to a faster engine and receive immediate type-related diagnostics. Download the latest version of PyCharm (2026.1.2) to unlock superior efficiency, scalability, and code insight.&lt;/p&gt;</description>
	<pubDate>Fri, 15 May 2026 15:31:27 +0000</pubDate>
</item>
<item>
	<title>Real Python: The Real Python Podcast – Episode #295: Agentic Architecture: Why Files Aren't Always Enough</title>
	<guid>https://realpython.com/podcasts/rpp/295/</guid>
	<link>https://realpython.com/podcasts/rpp/295/</link>
	<description>&lt;p&gt;What are the limitations of using a file-based agent workflow? Why do massive context windows tend to collapse? This week on the show, Mikiko Bazeley from MongoDB joins us to discuss agentic architecture and context engineering.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;utm_medium=rss&amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 15 May 2026 12:00:00 +0000</pubDate>
</item>

</channel>
</rss>
