<?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: The Real Python Podcast – Episode #299: EuroPython 2026: Celebrating 25 Years</title>
	<guid>https://realpython.com/podcasts/rpp/299/</guid>
	<link>https://realpython.com/podcasts/rpp/299/</link>
	<description>&lt;p&gt;What's happening at EuroPython 2026? The conference celebrates its 25th anniversary this year in Kraków, Poland. This week on the show, organizers Mia Bajić and Daria Linhart Grudzien join me to discuss this year's conference.&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, 12 Jun 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>EuroPython: June Newsletter: Talks Schedule Released</title>
	<guid>https://blog.europython.eu/june-newsletter-one-month-to-go/</guid>
	<link>https://blog.europython.eu/june-newsletter-one-month-to-go/</link>
	<description>&lt;p&gt;Hi all Pythonistas! &amp;#x1F44B;&amp;#xA0;&lt;/p&gt;&lt;p&gt;We have just one month left until we all meet up in Krak&amp;#xF3;w, and we&amp;#x2019;ve got a lot of new stuff to tell you: the schedule is available, new keynote announcements, our 25 years of EuroPython celebrations (win a free ticket!), the release of our Speaker&amp;#x2019;s Orientation Workshop video on YouTube (in case you missed it!), remote ticket availability, a reminder about ticket prices (going up on June 26th!), plus plenty more &amp;#x1F49A;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%8E%89-talk-schedule-available&quot;&gt;&lt;strong&gt;&amp;#x1F389; Talk Schedule Available&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Let&amp;#x2019;s start with the big one: the programme team have been working tirelessly to get the talk schedule finalised, and you can now read it, in full, over on our website. The talks this year were selected from a record breaking number of submissions, and we are really excited about the number of topics covered from such a wide range of speakers.&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Start noting down your &amp;#x2018;must see&amp;#x2019; favourites now, and plan out your &amp;amp;aposjourney&amp;amp;apos through the conference: &lt;a href=&quot;https://ep2026.europython.eu/schedule/?ref=blog.europython.eu&quot;&gt;https://ep2026.europython.eu/schedule/&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%8E%A4-keynote-announcements&quot;&gt;&lt;strong&gt;&amp;#x1F3A4; Keynote Announcements&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Guido van Rossum&lt;/strong&gt;, &lt;strong&gt;&amp;#x141;ukasz Langa, Pablo Galindo Salgado, &lt;/strong&gt;and &lt;strong&gt;Leah Wasser &lt;/strong&gt;were already on the schedule as keynote speakers, but we&amp;#x2019;ve now confirmed three more! We are very excited to have the following speakers joining us in Krak&amp;#xF3;w:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;William Woodruff&lt;/strong&gt; is a Member of Technical Staff at &lt;strong&gt;Astral&lt;/strong&gt;, where he works on building high-performance, secure tooling that is modernising the Python developer experience. Prior to Astral, he was an Engineering Director at Trail of Bits, leading high-impact security initiatives across open-source ecosystems.&lt;/p&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/data-src-image-11ed3ba2-5754-4c68-a4b7-c8129c9e9b1b.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;1080&quot; height=&quot;1350&quot; /&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;Marlene Mhangami&lt;/strong&gt; is a Senior Developer Advocate at Microsoft and GitHub, where she focuses on the cutting edge of Python and AI. As a computer scientist, keynote speaker, and explorer, she is a massive driving force behind community growth across the globe.&lt;/p&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/data-src-image-b3f89841-291f-432c-8550-5f8368095096.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;1080&quot; height=&quot;1350&quot; /&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;Imogen Wright&lt;/strong&gt; is a Senior Engineer at Amazon EC2, where they focus on making incredibly complex systems behave. Their career spans over two decades of solving high-stakes challenges across theoretical physics, HIV drug resistance, COVID genomics, cloud technologies, and even ad tech!&lt;/p&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/data-src-image-1deff8a4-5cde-45bd-a6d1-f913da8b78c8.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;1080&quot; height=&quot;1350&quot; /&gt;&lt;hr /&gt;&lt;p&gt;All of our keynote speakers are some of the most respected leaders in the industry and in their specific fields, and we are privileged to have them join us at EuroPython 2026. We are so pleased to be able to put together such an incredible line up! &amp;#x1F40D;&amp;#x1F49A;&lt;/p&gt;&lt;h2 id=&quot;%E2%8C%9B-get-your-ticket-before-prices-increase&quot;&gt;&lt;strong&gt;&amp;#x231B; Get Your Ticket Before Prices Increase&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We know that many of you have already purchased tickets (thank you!) but a quick reminder to those who have yet to do so: ticket prices will increase on &lt;strong&gt;June 26th&lt;/strong&gt; and our &lt;strong&gt;Late Bird&lt;/strong&gt; prices will apply, so if you&amp;#x2019;re thinking of coming, it definitely makes sense to secure your ticket before then!&amp;#xA0;&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Purchase your tickets today on the EuroPython 2026 website: &lt;a href=&quot;https://ep2026.europython.eu/tickets/?ref=blog.europython.eu&quot;&gt;https://ep2026.europython.eu/tickets/&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%92%BB-remote-ticket-sales&quot;&gt;&lt;strong&gt;&amp;#x1F4BB; Remote Ticket Sales&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;If you are joining us remotely this year, just a heads up that remote sales will start next &lt;strong&gt;Monday, 15th June&lt;/strong&gt;. The tickets will be available to purchase on our website as soon as Monday rolls around!&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%8E%82-25-years-of-europython&quot;&gt;&lt;strong&gt;&amp;#x1F382; 25 Years of EuroPython&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We are celebrating 25 years of EuroPython this year (I know, we can&amp;#x2019;t believe it either!), and we have a few fun things planned to make it special, including a chance to win a free ticket - which you can transfer to someone else, if you&amp;#x2019;ve already got yours!&lt;/p&gt;&lt;h3 id=&quot;%F0%9F%93%9C-the-oldest-badge-contest&quot;&gt;&amp;#x1F4DC;&lt;strong&gt; The Oldest Badge Contest&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Are you one of those people who keeps your badges from previous conferences? It might be about to pay off: we will be having a contest to find the &lt;strong&gt;Oldest EuroPython Badge&lt;/strong&gt; amongst all attendees this year! Dig around in your drawers, boxes, attic or other archive and find the oldest EuroPython badge (with your name on it&amp;#x2026;) that you can. Whoever has the oldest will win the contest!&lt;/p&gt;&lt;h3 id=&quot;%F0%9F%8E%AB-free-ticket-competition-your-europython-experiences&quot;&gt;&amp;#x1F3AB;&lt;strong&gt; Free Ticket Competition: Your EuroPython Experiences&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;We&amp;#x2019;re running a competition - open to anyone who has attended EuroPython in the past - who can record a short video telling us about their &lt;strong&gt;most impactful EuroPython experience&lt;/strong&gt;! The competition is open to anyone who has attended EuroPython before, and is really easy to enter. No need for anything very fancy: just record yourself talking and tell us why your particular experience at EuroPython made such an impact on you.&lt;/p&gt;&lt;p&gt;The competition will be closing on &lt;strong&gt;June 21st&lt;/strong&gt; (extended!), so you&amp;#x2019;ve still got plenty of time to enter.&lt;/p&gt;&lt;p&gt;&amp;#x1F449;  For the details, see the entry form: &lt;a href=&quot;https://forms.gle/WNPErwWtpE1oPVhD9?ref=blog.europython.eu&quot;&gt;https://forms.gle/WNPErwWtpE1oPVhD9&lt;/a&gt;&amp;#xA0;&lt;/p&gt;&lt;h3 id=&quot;%F0%9F%92%AD-taking-a-trip-down-memory-lane&quot;&gt;&amp;#x1F4AD;&lt;strong&gt; Taking a Trip Down Memory Lane&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Finally, we thought you might appreciate a little video we&amp;#x2019;ve posted on YouTube recently: Jonathan Hartley spoke to us at PyCon US about one of his favourite EuroPython experiences of the past:&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%A6%84-django-girls-workshop-sign-up&quot;&gt;&lt;strong&gt;&amp;#x1F984; Django Girls Workshop Sign Up&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We are sure many of you are already aware of &lt;strong&gt;Django Girls&lt;/strong&gt; and the great work that they do in making Python and Django more accessible to people around the world (often but not only girls!), and we are super pleased to announce that they will be running a workshop at EuroPython 2026 in Krak&amp;#xF3;w!&lt;/p&gt;&lt;p&gt;&amp;#x1F449;  The workshop is a full day, on &lt;strong&gt;18 July &lt;/strong&gt;(a sprint day), and you can register on the Django Girls website: &lt;a href=&quot;https://djangogirls.org/en/krakow2/?ref=blog.europython.eu&quot;&gt;https://djangogirls.org/en/krakow2/&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%8F%83%E2%80%8D%E2%99%80%EF%B8%8F-women-in-python-5k-run&quot;&gt;&amp;#x1F3C3;&amp;#x200D;&amp;#x2640;&amp;#xFE0F; &lt;strong&gt;Women in Python 5K Run&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;On &lt;strong&gt;Thursday 16th July&lt;/strong&gt; there will be a group run with the aim of enabling some friendly networking and friendship building between women in the Python community.&lt;/p&gt;&lt;p&gt;It is open to runners of all experience levels, and will be a nice route around Krak&amp;#xF3;w - along the river and at walking distance from the conference venue. If you are interested, please fill out the form below to help us prepare better (no commitment required - yet!), and we will send details of how to confirm your place closer to the time.&lt;/p&gt;&lt;p&gt;We&amp;#x2019;d like to thank our sponsor &lt;a href=&quot;https://www.arm.com/?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;Arm&lt;/a&gt; for supporting this run.&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Register your interest here: &lt;a href=&quot;https://forms.gle/bcsBTtNX1crEQhbw8?ref=blog.europython.eu&quot;&gt;https://forms.gle/bcsBTtNX1crEQhbw8&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%E2%AD%90-on-site-volunteering&quot;&gt;&lt;strong&gt;&amp;#x2B50; On-Site Volunteering&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;A big thank you to all who responded to our call for on-site volunteers, and we are now considering the applications. We had over &lt;strong&gt;110 applications&lt;/strong&gt; (far more than last year), and we loved to see applications from countries all over the world! &amp;#x1F49A;&lt;/p&gt;&lt;p&gt;We are now selecting volunteers, and you will receive notification of the status of your application in the following week (13-19th June). We will contact everyone who applied, even if you were not selected.&lt;/p&gt;&lt;p&gt;Thanks again to all of you - volunteers are the heart of EuroPython and we could not run the conference without you. &amp;#x2728;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%91%A9%E2%80%8D%F0%9F%8F%AB-speaker-orientation-workshop&quot;&gt;&lt;strong&gt;&amp;#x1F469;&amp;#x200D;&amp;#x1F3EB; Speaker Orientation Workshop&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;The EuroPython Speaker Orientation ran on the 3rd June 2026, and contained valuable tips from some of the most experienced speakers in our community. The panel spent an hour and a half giving practical advice on preparing talks, creating effective slides, managing nerves, engaging audiences, and handling Q&amp;amp;A sessions.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cheuk Ting Ho&lt;/strong&gt;, &lt;strong&gt;Rodrigo Gir&amp;#xE3;o Serr&amp;#xE3;o&lt;/strong&gt;, and &lt;strong&gt;Sebastian Witowski&lt;/strong&gt; answered questions from new and returning speakers, sharing insights and lessons from their own conference speaking journeys.&lt;/p&gt;&lt;p&gt;Thank you to our amazing panel and everyone who joined us - we can&amp;#x2019;t wait to see you in Krak&amp;#xF3;w!&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%92%9A-financial-aid-round-up&quot;&gt;&lt;strong&gt;&amp;#x1F49A; Financial Aid Round Up&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;This year, we received a record-high 217 financial aid applications across two rounds. We know how much care, hope, and effort goes into every application, and our financial aid team have worked hard to review them all with the attention they deserve.&lt;/p&gt;&lt;p&gt;We&amp;#x2019;re happy to share that all financial aid decisions have been sent out. With the &amp;#x20AC;35,000 budget provided by the EuroPython Society, we have issued 84 grant offers. We are grateful to be able to support so many members of our community, and sincerely hope that all grantees will be able to join us in Krak&amp;#xF3;w this summer to learn, connect, and celebrate the 25th anniversary of EuroPython.&lt;/p&gt;&lt;p&gt;To everyone who applied but was not offered a grant: we are very sorry for the disappointing news. If we miss you in Krak&amp;#xF3;w, we still very much hope you&amp;#x2019;ll be part of the conference and connect with us remotely.&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%93%BA-europython-youtube-channel&quot;&gt;&lt;strong&gt;&amp;#x1F4FA; EuroPython YouTube Channel&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We&amp;amp;aposve been posting a lot of new content over on the &lt;a href=&quot;http://youtube.com/EuroPythonConference?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;EuroPython YouTube Channel&lt;/a&gt;, including some fun short interviews from PyCon US:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/shorts/FDqYfl9cvlA?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;Carol Willing talks about her favourite EuroPython moment&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/shorts/_-YqLVMmi50?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;Can you believe that some people have attended this many EuroPython conferences?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/shorts/-f_IbYRKD84?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;What fun things were planned at PyCon Italia this year?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;#x1F449; Subscribe and keep up with our latest videos: &lt;a href=&quot;https://www.youtube.com/@EuroPythonConference?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;https://www.youtube.com/@EuroPythonConference&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%92%AC-last-call-for-sponsor-booths&quot;&gt;&lt;strong&gt;&amp;#x1F4AC; Last Call for Sponsor Booths&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We&amp;amp;aposre down to our last few sponsorship slots with booths! Want to meet the Python community face-to-face at EuroPython 2026? This is your final chance to connect with our thousands of attendees.&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Email &lt;a href=&quot;mailto:sponsoring@europython.eu&quot;&gt;sponsoring@europython.eu&lt;/a&gt; before the slots are gone!&lt;/p&gt;&lt;h2 id=&quot;%E2%9A%99%EF%B8%8F-reminder-rust-summit&quot;&gt;&lt;strong&gt;&amp;#x2699;&amp;#xFE0F; Reminder: Rust Summit&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Registration is still open for the full-day Rust summit, exploring the intersection of Rust and the Python ecosystem - it is a &amp;#x2018;must-see&amp;#x2019; for anyone interested in how Rust is turbocharging Python tooling and Python computational libraries in 2026.&lt;/p&gt;&lt;p&gt;This summit is designed for developers who already possess some practical experience in these topics and are looking to deepen their expertise, share lessons learned, and contribute to the community&amp;amp;aposs collective knowledge.&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Register for the Rust Summit: &lt;a href=&quot;https://ep2026.europython.eu/session/rust-summit-at-europython?ref=blog.europython.eu&quot;&gt;https://ep2026.europython.eu/session/rust-summit-at-europython&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%A4%9D-community-partners&quot;&gt;&lt;strong&gt;&amp;#x1F91D; Community Partners&lt;/strong&gt;&lt;/h2&gt;&lt;h3 id=&quot;%F0%9F%A6%AC-pystok&quot;&gt;&amp;#x1F9AC; PyStok&lt;/h3&gt;&lt;p&gt;PyStok #83 lands on June 17th at 18:00 at Zmiana Klimatu in Bia&amp;#x142;ystok &amp;#x2013; and free registration is officially live! &lt;/p&gt;&lt;p&gt;Between the &amp;quot;speed dating&amp;quot; networking, JetBrains giveaways, and the legendary &amp;quot;Podlaskie afterparty&amp;quot;, it&amp;#x2019;s the perfect spot to soak up those unique North-East Polish vibes and talk Python and AI with the local crowd.&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Grab your spot at &lt;a href=&quot;https://pystok.org/najblizsze-wydarzenie?ref=blog.europython.eu&quot; rel=&quot;noreferrer&quot;&gt;https://pystok.org/najblizsze-wydarzenie&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%93%A3-community-outreach&quot;&gt;&lt;strong&gt;&amp;#x1F4E3; Community Outreach&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;The EuroPython Society has continued our world tour of Python events, and as always, thank you to everyone that came to speak to us!&lt;/p&gt;&lt;h3 id=&quot;%F0%9F%87%BA%F0%9F%87%B8-pycon-us&quot;&gt;&lt;strong&gt;&amp;#x1F1FA;&amp;#x1F1F8; PyCon US&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Several members of the EuroPython Society were at PyCon US in Long Beach, and we were very happy to have a stand at the conference and meet friends old and new. We know many of you will be joining us in Krak&amp;#xF3;w as well, and we look forward to seeing you again!&lt;/p&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/data-src-image-38dd9925-d124-4ff0-9f19-b8d96c479f1c.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;1280&quot; height=&quot;959&quot; /&gt;&lt;p&gt;&amp;#x1F449; For more information about what we got up to PyCon US, check out our post on the EuroPython Society blog: &lt;a href=&quot;https://europython-society.org/europython-society-at-pycon-us-2026/?ref=blog.europython.eu&quot;&gt;https://europython-society.org/europython-society-at-pycon-us-2026/&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;%F0%9F%87%AE%F0%9F%87%B9-pycon-italia&quot;&gt;&lt;strong&gt;&amp;#x1F1EE;&amp;#x1F1F9; PyCon Italia&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The EuroPython Society also had a stand at PyCon Italia, which we shared with the Django Software Foundation, and we were pleased to see such interest in our stickers, which we managed to &amp;#x2018;sell out&amp;#x2019; of on the 2nd day of talks! If you want more stickers, you know where to go!&lt;/p&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/data-src-image-c07cbc77-bfe9-4352-a5a4-87654cd82494.jpeg&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;1024&quot; height=&quot;768&quot; /&gt;&lt;h2 id=&quot;%F0%9F%8E%81-sponsor-spotlight&quot;&gt;&lt;strong&gt;&amp;#x1F381; Sponsor Spotlight&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;We&amp;amp;aposd like to thank our three Platinum sponsors for supporting EuroPython:&lt;/p&gt;&lt;a href=&quot;https://careers.manychat.com/?ref=blog.europython.eu&quot;&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/05/manychat_clearspace_white_bg.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;2000&quot; height=&quot;547&quot; /&gt;&lt;/a&gt;&lt;span&gt;View job openings at Manychat&lt;/span&gt;&lt;p&gt;&lt;strong&gt;Manychat builds AI-powered chat automation for 1M+ creators and brands at real production scale.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;a href=&quot;https://www.microsoft.com/?ref=blog.europython.eu&quot;&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/microsoft-whitebg-clearspace.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;2000&quot; height=&quot;547&quot; /&gt;&lt;/a&gt;&lt;p&gt;&lt;strong&gt;Open Source enables Microsoft products and services to bring choice, technology and community to our customers.&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;a href=&quot;https://vercel.com/?ref=blog.europython.eu&quot;&gt;&lt;img src=&quot;https://blog.europython.eu/content/images/2026/06/vercel-whitebg-clearspace.png&quot; class=&quot;kg-image&quot; alt=&quot;alt&quot; width=&quot;2000&quot; height=&quot;547&quot; /&gt;&lt;/a&gt;&lt;p&gt;&lt;strong&gt;Vercel provies Agentic Infrastructure for every app and agent. They are the creators of AI SDK, Next.js, Turborepo, and v0.&lt;/strong&gt;&lt;/p&gt;&lt;h2 id=&quot;%F0%9F%91%8B-stay-connected&quot;&gt;&lt;strong&gt;&amp;#x1F44B;  Stay Connected&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;Follow us on social media and subscribe to our newsletter for all the updates:&lt;/p&gt;&lt;p&gt;&amp;#x1F449; Sign up for the newsletter: &lt;a href=&quot;https://blog.europython.eu/#/portal/signup&quot;&gt;https://blog.europython.eu/portal/signup&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;: &lt;a href=&quot;https://www.linkedin.com/company/europython/?ref=blog.europython.eu&quot;&gt;https://www.linkedin.com/company/europython/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;X/Twitter&lt;/strong&gt;: &lt;a href=&quot;https://x.com/europython?ref=blog.europython.eu&quot;&gt;https://x.com/europython&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Mastodon&lt;/strong&gt;: &lt;a href=&quot;https://fosstodon.org/@europython?ref=blog.europython.eu&quot;&gt;https://fosstodon.org/@europython&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Bluesky&lt;/strong&gt;: &lt;a href=&quot;https://bsky.app/profile/europython.eu?ref=blog.europython.eu&quot;&gt;https://bsky.app/profile/europython.eu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Instagram&lt;/strong&gt;: &lt;a href=&quot;https://www.instagram.com/europython/?ref=blog.europython.eu&quot;&gt;https://www.instagram.com/europython/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;YouTube&lt;/strong&gt;: &lt;a href=&quot;https://www.youtube.com/@EuroPythonConference?ref=blog.europython.eu&quot;&gt;https://www.youtube.com/@EuroPythonConference&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Okay, what a packed edition this one has been! It&amp;#x2019;s all go here at EuroPython and as you can see, we have so much in store for you. Don&amp;#x2019;t forget: get your tickets before the prices increase, and we can&amp;#x2019;t wait to see you really, really soon! &amp;#x1F40D;&amp;#x1F49A;&lt;/p&gt;&lt;p&gt;Cheers,&lt;/p&gt;&lt;p&gt;The EuroPython Team &lt;/p&gt;&lt;div class=&quot;kg-card kg-signup-card kg-width-wide &quot;&gt;
            
            &lt;div class=&quot;kg-signup-card-content&quot;&gt;
                
                &lt;div class=&quot;kg-signup-card-text &quot;&gt;
                    &lt;h2 class=&quot;kg-signup-card-heading&quot;&gt;&lt;span&gt;Sign up for EuroPython Blog&lt;/span&gt;&lt;/h2&gt;
                    &lt;p class=&quot;kg-signup-card-subheading&quot;&gt;&lt;span&gt;The official blog of everything &amp;amp; anything EuroPython! EuroPython 2026 13-19 July, Krak&amp;#xF3;w&lt;/span&gt;&lt;/p&gt;
                    
        &lt;form class=&quot;kg-signup-card-form&quot;&gt;
            
            &lt;div class=&quot;kg-signup-card-fields&quot;&gt;
                &lt;input class=&quot;kg-signup-card-input&quot; id=&quot;email&quot; type=&quot;email&quot; /&gt;
                &lt;button class=&quot;kg-signup-card-button kg-style-accent&quot; type=&quot;submit&quot;&gt;
                    &lt;span class=&quot;kg-signup-card-button-default&quot;&gt;Subscribe&lt;/span&gt;
                    &lt;span class=&quot;kg-signup-card-button-loading&quot;&gt;
        
            
                
                
                
            
            
                .nc-loop-dots-4-24-icon-o{--animation-duration:0.8s}
                .nc-loop-dots-4-24-icon-o *{opacity:.4;transform:scale(.75);animation:nc-loop-dots-4-anim var(--animation-duration) infinite}
                .nc-loop-dots-4-24-icon-o :nth-child(1){transform-origin:4px 12px;animation-delay:-.3s;animation-delay:calc(var(--animation-duration)/-2.666)}
                .nc-loop-dots-4-24-icon-o :nth-child(2){transform-origin:12px 12px;animation-delay:-.15s;animation-delay:calc(var(--animation-duration)/-5.333)}
                .nc-loop-dots-4-24-icon-o :nth-child(3){transform-origin:20px 12px}
                @keyframes nc-loop-dots-4-anim{0%,100%{opacity:.4;transform:scale(.75)}50%{opacity:1;transform:scale(1)}}
            
        
    &lt;/span&gt;
                &lt;/button&gt;
            &lt;/div&gt;
            &lt;div class=&quot;kg-signup-card-success&quot;&gt;
                Email sent! Check your inbox to complete your signup.
            &lt;/div&gt;
            &lt;div class=&quot;kg-signup-card-error&quot;&gt;&lt;/div&gt;
        &lt;/form&gt;
        
                    &lt;p class=&quot;kg-signup-card-disclaimer&quot;&gt;&lt;span&gt;No spam. Unsubscribe anytime.&lt;/span&gt;&lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;</description>
	<pubDate>Fri, 12 Jun 2026 09:41:36 +0000</pubDate>
</item>
<item>
	<title>Hugo van Kemenade: I'm delighted to rejoin the Sovereign Tech Fellowship</title>
	<guid>https://hugovk.dev/blog/2026/sovereign-tech-fellowship/</guid>
	<link>https://hugovk.dev/blog/2026/sovereign-tech-fellowship/</link>
	<description>&lt;p&gt;I&amp;rsquo;m happy to rejoin the
&lt;a href=&quot;https://www.sovereign.tech/programs/fellowship&quot;&gt;Sovereign Tech Fellowship&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I was one of six participants in the
&lt;a href=&quot;https://hugovk.dev/2025/im-excited-to-join-the-sovereign-tech-fellowship/&quot;&gt;2025 pilot&lt;/a&gt; to pay
maintainers of critical open source technologies in the public interest. By all accounts
this first cohort was a resounding success, and I&amp;rsquo;m glad to see the programme continue.&lt;/p&gt;
&lt;p&gt;It was wonderful to be part of the inaugural Sovereign Tech Fellowship, and incredibly
beneficial to my projects: it gave me the time to focus on releasing Python 3.14 and
3.15 smoothly, to mentor and onboard others, and to support the wider community.&lt;/p&gt;
&lt;h2 id=&quot;2025-impact&quot; class=&quot;relative group&quot;&gt;2025 impact &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#2025-impact&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;The
&lt;a href=&quot;https://www.sovereign.tech/publications/evaluation-sovereign-tech-fellowship-2025&quot;&gt;2025 evaluation report&lt;/a&gt;
covers all six of us and the benefits of the programme at a higher level. Here&amp;rsquo;s some of
the specific things I achieved.&lt;/p&gt;
&lt;p&gt;I was happy with how the
&lt;a href=&quot;https://discuss.python.org/t/python-3-14-0-final-is-here/104210&quot;&gt;big Python 3.14.0&lt;/a&gt;
&lt;a href=&quot;https://hugovk.dev/2025/releasing-python-3-14-0/&quot;&gt;release went&lt;/a&gt;. This is in part from having a good
team to work with, and building on the past, but no doubt also due to being able to
focus and invest time thanks to the Fellowship.&lt;/p&gt;
&lt;p&gt;On many occasions, having time to dedicate to the role meant I could prioritise things
as they occurred. For example, when needing to make expedited releases, I could dedicate
time to go through all the necessary prep, and make the release without any stress of
fitting it in around a regular job. Similarly, when last-minute problems came up on
release day, such as newly-committed code not passing tests, I didn&amp;rsquo;t need to rush, and
could contact the contributor to arrange a fix. Some other release managers had reverted
similar changes to let the contributor try again for a later release, but there was less
pressure for me and I could wait longer.&lt;/p&gt;
&lt;p&gt;I was able to mentor other project members, such as helping onboard the next release
manager, and also answer questions for other triagers. I promoted two new triagers in
different projects. Other community members sometimes asked me about how to contribute.
I attended many community &amp;ldquo;office hours&amp;rdquo; meetings and Monthly Conference Organisers'
calls to share what&amp;rsquo;s going on and answer questions, and likewise
&lt;a href=&quot;https://hugovk.dev/blog/&quot;&gt;blogged&lt;/a&gt; and shared on social media such as
&lt;a href=&quot;https://mastodon.social/@hugovk&quot;&gt;Mastodon&lt;/a&gt;,
&lt;a href=&quot;https://bsky.app/profile/hugovk.dev&quot;&gt;Bluesky&lt;/a&gt; and
&lt;a href=&quot;https://www.linkedin.com/in/hugovk/&quot;&gt;LinkedIn&lt;/a&gt;. I was able to attend many conferences
and give talks about the upcoming release, and discuss with other attendees what happens
with Python releases and the project in general. This all helps improve transparency. I
also chaired many monthly
&lt;a href=&quot;https://docs-community.readthedocs.io/community/monthly-meeting.html&quot;&gt;Docs Working Group meetings&lt;/a&gt;,
and attended many other meetings from different projects.&lt;/p&gt;
&lt;p&gt;I was able to make many improvements in the release process, through additional
automation and testing to remove tedious manual steps. I&amp;rsquo;ve improved the accessibility
of websites visited by tens of millions per month.&lt;/p&gt;
&lt;p&gt;I created a triage dashboard that helped us close hundreds of issues, and also complete
forgotten backports including security fixes.&lt;/p&gt;
&lt;p&gt;I was also able to invest time on non-technical, social, organisational and governance
improvements. I&amp;rsquo;m proud
&lt;a href=&quot;https://discuss.python.org/t/alternate-the-language-summit-between-pycon-us-and-europython/102156&quot;&gt;my proposal was accepted&lt;/a&gt;
to alternate the Language Summit between PyCon US and EuroPython, rather than always
being in the US, to improve the diversity of voices of who will shape the future of
Python. The
&lt;a href=&quot;https://ep2026.europython.eu/language-summit/&quot;&gt;2026 summit will be held at EuroPython&lt;/a&gt;
and I&amp;rsquo;m helping organise.&lt;/p&gt;
&lt;p&gt;Since 2009, the summit has been a one-day event that takes place at PyCon US before the
main conference days. It has also been held at EuroPython twice, in 2010 and 2011. The
PSF mission is &lt;em&gt;&amp;ldquo;to support and facilitate the growth of a diverse and international
community of Python programmers&amp;rdquo;&lt;/em&gt;, and not all potential attendees can travel to the US
each year. This proposal took a lot of work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In November 2024, the core team discussed on Discord the possibility of alternating
the summit between PyCon US and EuroPython. People were in favour, but said it would
need to be discussed at the summit at PyCon US in May 2025.&lt;/li&gt;
&lt;li&gt;In March 2025, I asked for the topic to be added to the agenda, as I wasn&amp;rsquo;t attending.&lt;/li&gt;
&lt;li&gt;In May, the discussion took place. The minutes simply said: &amp;ldquo;Watch out for a Discourse
thread to discuss this.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;In July, during EuroPython, I asked summit attendees what the impression was, and they
said people were in favour. I also spoke with the chair of EuroPython Society about
the summit requirements, and they said they&amp;rsquo;d be happy to host us.&lt;/li&gt;
&lt;li&gt;In August, because no Discourse thread had appeared, I opened a proposal to alternate.&lt;/li&gt;
&lt;li&gt;In September, during the Steering Council Q&amp;amp;A at the Core Team Sprint, I asked about
next steps. The consensus was for the SC to open a formal poll amongst the core team.&lt;/li&gt;
&lt;li&gt;In October, the SC opened a poll for core team members.&lt;/li&gt;
&lt;li&gt;In November, the poll concluded overwhelmingly in favour of alternating.&lt;/li&gt;
&lt;li&gt;In December, the SC approved my request. I volunteered to help organise the summit and
opened discussions with the EuroPython Society to make it happen in 2026.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had more free time to spend on non-open source things, but also more free time to help
the local Python community such as by co-organising two
&lt;a href=&quot;https://helsinki-python.github.io/&quot;&gt;local&lt;/a&gt;
&lt;a href=&quot;https://pydata-helsinki.github.io/&quot;&gt;meetups&lt;/a&gt;. One person I nominated became a Fellow of
the Python Software Foundation and another of the EuroPython Society, which recognises
the importance of community work.&lt;/p&gt;
&lt;p&gt;Finally, I enjoyed our monthly Fellowship meetings where the six of us all gave a
summary of our last month&amp;rsquo;s work. Similarly, it was great to meet most of them in person
along with people from the Agency at the
&lt;a href=&quot;https://www.sovereign.tech/news/who-will-maintain-our-digital-future&quot;&gt;event to mark the inaugural Sovereign Tech Fellowship cohort&lt;/a&gt;
and hear the results of the evaluation report.&lt;/p&gt;
&lt;h2 id=&quot;arbitrary-statistics&quot; class=&quot;relative group&quot;&gt;Arbitrary statistics &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#arbitrary-statistics&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;On GitHub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Total contributions: 6,642&lt;/li&gt;
&lt;li&gt;Issues created: 90&lt;/li&gt;
&lt;li&gt;PRs created: 901&lt;/li&gt;
&lt;li&gt;Issues closed: 446&lt;/li&gt;
&lt;li&gt;PRs merged: 1,401&lt;/li&gt;
&lt;li&gt;PRs closed: 142&lt;/li&gt;
&lt;li&gt;Total issues involved with: 1,409&lt;/li&gt;
&lt;li&gt;Total PRs involved with: 4,095&lt;/li&gt;
&lt;li&gt;Repositories affected: 409&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Made 55 releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;13 of Python 3.14&lt;/li&gt;
&lt;li&gt;3 of Python 3.15&lt;/li&gt;
&lt;li&gt;39 of PyPI projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Started maintaining:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://planetpython.org/&quot;&gt;Python Planet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pythonwheels.com/&quot;&gt;Python Wheels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Archived:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python-twitter-tools/twitter/issues/476&quot;&gt;Python Twitter Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://discuss.python.org/t/archive-python-ideas-mailing-list-in-favour-of-discourse/88398&quot;&gt;python-ideas mailing list&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attended eight conferences in Berlin (&lt;a href=&quot;https://25.foss-backstage.de/&quot;&gt;FOSS Backstage&lt;/a&gt;
and &lt;a href=&quot;https://25.foss-backstage.design/&quot;&gt;Design&lt;/a&gt;), Bologna
(&lt;a href=&quot;https://2025.pycon.it/en&quot;&gt;PyCon Italia&lt;/a&gt;), Prague
(&lt;a href=&quot;https://ep2025.europython.eu/&quot;&gt;EuroPython&lt;/a&gt;), Athens
(&lt;a href=&quot;https://2025.pycon.gr/en/&quot;&gt;PyCon Greece&lt;/a&gt;), Manchester
(&lt;a href=&quot;https://2025.pyconuk.org/&quot;&gt;PyCon UK&lt;/a&gt;), Tallinn
(&lt;a href=&quot;https://2025.pycon.ee/&quot;&gt;PyCon Estonia&lt;/a&gt;), Jyväskylä
(&lt;a href=&quot;https://fi.pycon.org/&quot;&gt;PyCon Finland&lt;/a&gt;) and Stockholm
(&lt;a href=&quot;https://pycon.se/&quot;&gt;PyCon Sweden&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On a discussion panel at one&lt;/li&gt;
&lt;li&gt;Gave a lightning talk at five&lt;/li&gt;
&lt;li&gt;Announced PyCon Finland at four&lt;/li&gt;
&lt;li&gt;Helped new contributors at sprints at three&lt;/li&gt;
&lt;li&gt;Hosted a barcamp session at one&lt;/li&gt;
&lt;li&gt;Helped organise one by reviewing talks and through promotion&lt;/li&gt;
&lt;li&gt;Volunteered at one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attended three online conferences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;March: SustainOSS Virtual Forum&lt;/li&gt;
&lt;li&gt;May: Maintainer Summit&lt;/li&gt;
&lt;li&gt;December: PyLadiesCon&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other events:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;September: &lt;a href=&quot;https://hugovk.dev/2025/python-core-sprint/&quot;&gt;Core Team Sprint&lt;/a&gt; in Cambridge
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://open.spotify.com/episode/3zMQYlP7hF7fKi8wdlAxyn&quot;&gt;Podcast interview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;December:
&lt;a href=&quot;https://www.sovereign.tech/news/who-will-maintain-our-digital-future&quot;&gt;Sovereign Tech Agency event&lt;/a&gt;
in Berlin to mark the inaugural Fellowship cohort&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Meetups:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Co-organised 16 meetups for &lt;a href=&quot;https://helsinki-python.github.io/&quot;&gt;two&lt;/a&gt; groups,
&lt;a href=&quot;https://pydata-helsinki.github.io/&quot;&gt;one&lt;/a&gt; which we restarted in 2025&lt;/li&gt;
&lt;li&gt;Attended 27 meetups of 11 groups in four cities and three countries&lt;/li&gt;
&lt;li&gt;Gave one long talk and four lightning talks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://docs-community.readthedocs.io/community/index.html&quot;&gt;Docs Working Group&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organised 12
&lt;a href=&quot;https://docs-community.readthedocs.io/monthly-meeting/index.html&quot;&gt;monthly meetings&lt;/a&gt;,
chaired 9, attended 10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/psf/user-success-wg/blob/main/WG-charter.md&quot;&gt;User Success Workgroup&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attended two meetings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Published 17 blog posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;February: &lt;a href=&quot;https://hugovk.dev/2025/how-to-delay-a-python-release/&quot;&gt;How to delay a Python release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;February:
&lt;a href=&quot;https://hugovk.dev/2025/im-excited-to-join-the-sovereign-tech-fellowship/&quot;&gt;I&amp;rsquo;m excited to join the Sovereign Tech Fellowship&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;February: &lt;a href=&quot;https://hugovk.dev/2025/improving-licence-metadata/&quot;&gt;Improving licence metadata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;March:
&lt;a href=&quot;https://hugovk.dev/2025/free-threaded-python-on-github-actions/&quot;&gt;Free-threaded Python on GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;April:
&lt;a href=&quot;https://hugovk.dev/2025/my-most-used-command-line-commands/&quot;&gt;My most used command-line commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;May: &lt;a href=&quot;https://hugovk.dev/2025/peps-and-co/&quot;&gt;PEPs &amp;amp; Co.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;June: &lt;a href=&quot;https://hugovk.dev/2025/run-coverage-on-tests/&quot;&gt;Run coverage on tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;August:
&lt;a href=&quot;https://hugovk.dev/2025/europython-2025-a-roundup-of-writeups/&quot;&gt;EuroPython 2025: A roundup of writeups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;September: &lt;a href=&quot;https://hugovk.dev/2025/ready-prek-go/&quot;&gt;Ready prek go!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;October: &lt;a href=&quot;https://hugovk.dev/2025/releasing-python-3-14-0/&quot;&gt;Releasing Python 3.14.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;October: &lt;a href=&quot;https://hugovk.dev/2025/lazy-imports/&quot;&gt;Three times faster with lazy imports&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;November: &lt;a href=&quot;https://hugovk.dev/2025/python-core-sprint/&quot;&gt;Python Core Sprint 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;November: &lt;a href=&quot;https://hugovk.dev/2025/secrets-in-env-vars/&quot;&gt;Setting secrets in env vars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;December: &lt;a href=&quot;https://hugovk.dev/2025/steering-council-election/&quot;&gt;Steering Council election&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;December: &lt;a href=&quot;https://hugovk.dev/2025/steering-council-results/&quot;&gt;Steering Council results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;December: &lt;a href=&quot;https://hugovk.dev/2025/and-now/&quot;&gt;And now for something completely different&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;December: &lt;a href=&quot;https://hugovk.dev/2025/minus-six/&quot;&gt;Replacing python-dateutil to remove six&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reported 67 accounts to GitHub for spam/abuse/inauthentic activity.&lt;/p&gt;
&lt;h2 id=&quot;2026-and-beyond&quot; class=&quot;relative group&quot;&gt;2026 and beyond &lt;span class=&quot;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&quot;&gt;&lt;a class=&quot;group-hover:text-primary-300 dark:group-hover:text-neutral-700&quot; href=&quot;https://hugovk.dev/tags/python/index.xml#2026-and-beyond&quot;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;This time we&amp;rsquo;re 14 Fellows, and not only maintainers but also community managers and
technical writers. It&amp;rsquo;s great that Python core dev
&lt;a href=&quot;https://stan.ulbrych.org/&quot;&gt;Stan Ulbrych&lt;/a&gt; and PSF director
&lt;a href=&quot;https://georgiker.com/&quot;&gt;Georgi Ker&lt;/a&gt; are also joining, and I&amp;rsquo;m looking forward to
meeting the other
&lt;a href=&quot;https://www.sovereign.tech/news/meet-the-2026-sovereign-tech-fellows&quot;&gt;Sovereign Tech Fellows&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m really pleased to again be working with the Sovereign Tech Agency. They&amp;rsquo;re showing
the world some of the ways we can improve open source and critical digital
infrastructure, through a range of different
&lt;a href=&quot;https://www.sovereign.tech/programs&quot;&gt;programmes&lt;/a&gt;. Their success has informed the
proposal for an &lt;a href=&quot;https://eu-stf.openforumeurope.org/&quot;&gt;EU Sovereign Tech Fund (EU-STF)&lt;/a&gt;,
and they have also helped shape the
&lt;a href=&quot;https://digital-commons-edic.eu/&quot;&gt;European Digital Infrastructure Consortium for digital commons (DC-EDIC)&lt;/a&gt;,
with an &lt;a href=&quot;https://digital-commons-edic.eu/projects/#eu-stf&quot;&gt;EU-STF pilot&lt;/a&gt; kicking off
later this month which builds on their experience. And it&amp;rsquo;s good to see the focus on
maintenance and long-term sustainability in the brand new
&lt;a href=&quot;https://digital-strategy.ec.europa.eu/en/policies/open-source-strategy&quot;&gt;EU Open Source Strategy&lt;/a&gt;,
announced just last week.&lt;/p&gt;
&lt;p&gt;And by the way, the Sovereign Tech Agency are currently hiring, check out their
&lt;a href=&quot;https://www.sovereign.tech/jobs&quot;&gt;open positions&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;small&gt;Header photo by &lt;a href=&quot;https://www.janmichalko.com/&quot;&gt;Jan Michalko&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 12 Jun 2026 07:35:12 +0000</pubDate>
</item>
<item>
	<title>scikit-learn: scikit-learn release 1.9: better numerics, new core functionality</title>
	<guid>https://blog.scikit-learn.org/updates/release-1-9/</guid>
	<link>https://blog.scikit-learn.org/updates/release-1-9/</link>
	<description>&lt;div&gt;
  &lt;img src=&quot;https://blog.scikit-learn.org/assets/images/posts_images/1_9_release/scikit-learn_1_9.png&quot; alt=&quot;&quot; /&gt;
  

  
  
  
  

  

  

Author:  
      &lt;a href=&quot;https://gael-varoquaux.info/&quot; rel=&quot;me noopener noreferrer&quot;&gt;&lt;img src=&quot;https://blog.scikit-learn.org/assets/images/author_images/gael_varoquaux.png&quot; alt=&quot;Author Icon&quot; class=&quot;orcid-icon&quot; /&gt;Gael Varoquaux&lt;/a&gt;
     

&lt;br /&gt;&lt;br /&gt;

&lt;/div&gt;

&lt;p&gt;Scikit-learn 1.9 release is out, and it comes with solid improvements to
many existing estimators, making them faster, more stable, handling
missing values, adding GPU support… The release also enhances the
estimator displays in notebooks, and introduces a callback mechanism that
opens the door to progress bars or advanced monitoring of convergence.&lt;/p&gt;

&lt;h2 id=&quot;improvement-richer-html-views&quot;&gt;Improvement: Richer HTML views&lt;/h2&gt;

&lt;p&gt;The improvements that most will easily view are those on the estimator displays.&lt;br /&gt;
Since recent versions, the estimator views displayed in notebooks can show the parameters of the estimators (revealed by clicking on the estimator name). Latest release adds a view of the fitted attribute, as visible below:&lt;/p&gt;


 &lt;img src=&quot;https://blog.scikit-learn.org/assets/images/posts_images/1_9_release/fitted_attr.png&quot; alt=&quot;HTML displays showing the fitted attributes&quot; /&gt; 
 
  HTML display in a notebook, with the fitted attributes visible.
 

&lt;p&gt;In addition, the ColumnTransformer’s view has been enhanced to help the user understand how features are assembled:&lt;/p&gt;


 &lt;img src=&quot;https://blog.scikit-learn.org/assets/images/posts_images/1_9_release/feature_names.png&quot; alt=&quot;HTML displays showing the output feature names&quot; /&gt; 
 
  HTML display in a notebook, with the output feature names visible.
 


&lt;h2 id=&quot;a-new-promise-callbacks&quot;&gt;A new promise: Callbacks&lt;/h2&gt;

&lt;p&gt;Scikit-learn 1.9 comes with a callback mechanism, currently experimental. We spent a lot of time designing it so that it enables many different uses: nested tracking of progress (even in parallel computing) on a variety of measures, early stopping…&lt;br /&gt;
The release notes come with &lt;a href=&quot;https://scikit-learn.org/dev/auto_examples/release_highlights/plot_release_highlights_1_9_0.html#callbacks&quot;&gt;an example on how to use these callbacks to monitor scores and to display progress bars&lt;/a&gt; – &lt;a href=&quot;https://scikit-learn.org/stable/auto_examples/callbacks/plot_scoring_monitor.html&quot;&gt;a more advance monitoring example&lt;/a&gt;.&lt;/p&gt;

 &lt;a href=&quot;https://scikit-learn.org/dev/auto_examples/release_highlights/plot_release_highlights_1_9_0.html#callbacks&quot;&gt;
 &lt;img src=&quot;https://blog.scikit-learn.org/assets/images/posts_images/1_9_release/callbacks.png&quot; alt=&quot;The logging and progress-bar callbacks in a notebook&quot; /&gt;
 &lt;/a&gt;
 
  The logging and progress-bar callbacks in a notebook.
 


&lt;p&gt;As of today, the callbacks are implemented in logistic regression (with LBFGS solver), the various *SearchCV objects, Pipeline, StandardScaler. The next releases will progressively add callbacks in more and more estimators (this is a place where contributors can help).&lt;/p&gt;

&lt;h2 id=&quot;improved-statistics-and-numerics&quot;&gt;Improved statistics and numerics&lt;/h2&gt;

&lt;p&gt;As users, what we like about scikit-learn routines is that they tend to
be “fire-and-forget”, because they reliably run on a huge diversity of
inputs: sparse inputs, missing values, different data types. This
diversity of inputs is compounded by a diversity of modeling choices:
different losses, sample weights…&lt;/p&gt;

&lt;p&gt;Each release of scikit-learn extends the toolbox, sometimes by completing
the combinatorial of options and data types rather than adding new
estimators. Release 1.9 was a real consolidation in this respect:&lt;/p&gt;

&lt;h3 id=&quot;tree-based-models&quot;&gt;Tree-based models&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Native missing-value support in RandomForestRegressor when minimizing
the absolute error criterion&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Support of missing-values for tree-based models monotonic constraints&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Improved the statistical correctness of fitting with sample weights in &lt;a href=&quot;https://scikit-learn.org/stable/modules/ensemble.html#histogram-based-gradient-boosting&quot;&gt;HistGradientBoosting&lt;/a&gt;, &lt;a href=&quot;https://scikit-learn.org/stable/modules/ensemble.html#random-forests&quot;&gt;RandomForest&lt;/a&gt; and &lt;a href=&quot;https://scikit-learn.org/stable/modules/ensemble.html#extremely-randomized-trees&quot;&gt;ExtraTree&lt;/a&gt; (having exact support of sample weights in complex pipelines is challenging)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;linear-models&quot;&gt;Linear models&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Logistic regression can use natively float32, thus removing memory pressure&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Multi-Task linear models support fitting on sparse X and sample weights&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;More stable and faster &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeCV.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RidgeCV&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeClassifierCV.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RidgeClassifierCV&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Gap safe screening of features for very fast fitting of sparse
squared-loss regressors&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;other-models&quot;&gt;Other models&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Sample weight support in &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.cluster.MiniBatchKMeans.html&quot;&gt;minibatch kmeans&lt;/a&gt; (a very scalable clustering)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Numeric stability of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yeo-johnson&lt;/code&gt; in the &lt;a href=&quot;https://scikit-learn.org/dev/modules/generated/sklearn.preprocessing.PowerTransformer.html#sklearn.preprocessing.PowerTransformer&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;preprocessing.PowerTransformer&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Faster &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.manifold.SpectralEmbedding.html&quot;&gt;Spectral embedding&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;staying-up-to-date-with-the-ecosystem&quot;&gt;Staying up to date with the ecosystem&lt;/h3&gt;

&lt;p&gt;Scikit-learn can now return sparse arrays, rather than sparse matrices.
Indeed, scipy is slowly de-emphasizing sparse matrices, which often
surprise users with their behavior that depart from arrays.&lt;/p&gt;

&lt;h2 id=&quot;increasing-support-for-gpu&quot;&gt;Increasing support for GPU&lt;/h2&gt;

&lt;p&gt;Scikit-learn is increasingly gaining support for optimized compute backends, which enables it, for instance, to run on GPUs. The challenge (and the value) is the incredible diversity of estimators and usecases supported by scikit-learn, and the package is progressively adding backend support in more and more places.&lt;br /&gt;
In the 1.9 release, the major features to gain GPU support were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html&quot;&gt;Logistic regression&lt;/a&gt; and &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.PoissonRegressor.html&quot;&gt;Poisson regression&lt;/a&gt; with LBFGS solver&lt;/li&gt;
  &lt;li&gt;More metrics (eg average precision score, …)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.kernel_approximation.Nystroem.html&quot;&gt;Nystroem kernel approximation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See &lt;a href=&quot;https://scikit-learn.org/dev/modules/array_api.html#array-api-support-experimental&quot;&gt;the docs&lt;/a&gt; for all details on how to use the compute backends and which estimator support them.&lt;/p&gt;

&lt;p&gt;PS: the user experience is currently not as good as with the default compute backend (numpy). But adding and improving GPU support (with the “array API”) is a good place for talented volunteers to help move the project forward.&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Scikit-learn is the work of &lt;a href=&quot;https://scikit-learn.org/stable/about.html#the-people-behind-scikit-learn&quot;&gt;many contributors&lt;/a&gt;, with people volunteering
their time as well as financial sponsors –
see &lt;a href=&quot;https://scikit-learn.org/dev/institutional_support.html#funding&quot;&gt;the funding page&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 12 Jun 2026 00: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>Thu, 11 Jun 2026 22:00:00 +0000</pubDate>
</item>
<item>
	<title>Talk Python to Me: #551: Stroll Down Startup Lane - 2026</title>
	<guid>https://talkpython.fm/episodes/show/551/stroll-down-startup-lane-2026</guid>
	<link>https://talkpython.fm/episodes/show/551/stroll-down-startup-lane-2026</link>
	<description>If you've ever been to PyCon, you know one of the best parts of the expo hall is Startup Row, a stretch of booths where early-stage companies built on Python show off what they're creating. But only attendees get to walk that lane, so let's bring it to everyone. In this episode, we stroll down Startup Row together. We kick things off with the organizers, Jason and Shay, who share the program's origin story going back to Paul Graham and the PSF, plus some surprising stats, including two unicorns among the alumni. Then we meet five startups: Tetrix, bringing AI to institutional investing in private markets. Arcjet, security that lives inside your app as an SDK. Phemeral.dev, serverless hosting built for Python web apps. CapiscIO, an identity and authority layer for AI agents. And Pixeltable, a multimodal database from Marcel Kornacker, co-creator of Apache Parquet. See if you can spot the theme running through them all. Let's go for a walk.&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode sponsors&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;a href='https://talkpython.fm/agentfield-page'&amp;gt;AgentField AI&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;a href='https://talkpython.fm/training'&amp;gt;Talk Python Courses&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;h2 class=&quot;links-heading mb-4&quot;&amp;gt;Links from the show&amp;lt;/h2&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Guests&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Naunidh Bhalla&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/naunidhbhalla?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Grant Gittes&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/grantgittes/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Marcel Kornacker&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/marcelkornacker/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Beon de Nood&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/beondenood/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Chinmaya Joshi&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/cshjoshi/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;David Mytton&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/davidmytton/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Shea Tate-Di Donna&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/sheatatedidonna/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Jason Rowley&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/jasondrowley/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Azul Garza&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://github.com/AzulGarza?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;github.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Renée Rosillo&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.linkedin.com/in/reneerosillo/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;linkedin.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Tetrix&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.tetrix.co/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;tetrix.co&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Tetrix Jobs&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.tetrix.co/careers?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;tetrix.co&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Arcjet&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://arcjet.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;arcjet.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Pixeltable&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://www.pixeltable.com/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;pixeltable.com&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Phemeral.dev&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://phemeral.dev/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;phemeral.dev&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;CapiscIO&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://capisc.io/?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;capisc.io&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode #551 deep-dive&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/show/551/stroll-down-startup-lane-2026#takeaways-anchor&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/551&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Episode transcripts&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/episodes/transcript/551/stroll-down-startup-lane-2026&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Theme Song: Developer Rap&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;🥁 Served in a Flask 🎸&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/flasksong&quot; target=&quot;_blank&quot; &amp;gt;talkpython.fm/flasksong&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;---==  Don't be a stranger  ==---&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;YouTube&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://talkpython.fm/youtube&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-youtube&quot;&amp;gt;&amp;lt;/i&amp;gt; youtube.com/@talkpython&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Bluesky&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://bsky.app/profile/talkpython.fm&quot; target=&quot;_blank&quot; &amp;gt;@talkpython.fm&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Mastodon&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://fosstodon.org/web/@talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-mastodon&quot;&amp;gt;&amp;lt;/i&amp;gt; @talkpython@fosstodon.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;X.com&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://x.com/talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-twitter&quot;&amp;gt;&amp;lt;/i&amp;gt; @talkpython&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on Bluesky&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://bsky.app/profile/mkennedy.codes?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;@mkennedy.codes&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on Mastodon&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://fosstodon.org/web/@mkennedy&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-mastodon&quot;&amp;gt;&amp;lt;/i&amp;gt; @mkennedy@fosstodon.org&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;strong&amp;gt;Michael on X.com&amp;lt;/strong&amp;gt;: &amp;lt;a href=&quot;https://x.com/mkennedy?featured_on=talkpython&quot; target=&quot;_blank&quot; &amp;gt;&amp;lt;i class=&quot;fa-brands fa-twitter&quot;&amp;gt;&amp;lt;/i&amp;gt; @mkennedy&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;/div&amp;gt;</description>
	<pubDate>Thu, 11 Jun 2026 20:16:11 +0000</pubDate>
</item>
<item>
	<title>Real Python: Quiz: Serialize Your Data With Python</title>
	<guid>https://realpython.com/quizzes/python-serialize-data/</guid>
	<link>https://realpython.com/quizzes/python-serialize-data/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/python-serialize-data/&quot;&gt;Serialize Your Data With Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how to choose between textual and binary formats, when to use schemas, and how to apply tools like &lt;code&gt;pickle&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;, the &lt;code&gt;csv&lt;/code&gt; module, Parquet, and Protocol Buffers safely and effectively.&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, 11 Jun 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>PyCharm: Best Python AI Frameworks in 2026</title>
	<guid>https://blog.jetbrains.com/pycharm/2026/06/best-python-ai-frameworks-in-2026/</guid>
	<link>https://blog.jetbrains.com/pycharm/2026/06/best-python-ai-frameworks-in-2026/</link>
	<description>&lt;img src=&quot;https://blog.jetbrains.com/wp-content/uploads/2026/06/PC-social-BlogFeatured-1280x720-1-1.png&quot; alt=&quot;Best Python AI Frameworks in 2026&quot; class=&quot;wp-image-712585&quot; /&gt;



&lt;p&gt;Whether you’re building chatbots, training computer vision models, or analyzing business data, choosing the right AI framework can make or break your project. Python has become the dominant language for AI and machine learning development, and the ecosystem of frameworks supporting this work has matured significantly.&lt;/p&gt;



&lt;p&gt;The right framework choice depends on what you’re building. A production recommendation system has different requirements than a research prototype. A chatbot powered by large language models (LLMs) needs different tools than a fraud detection system analyzing tabular data.&lt;/p&gt;



&lt;p&gt;Let’s explore seven essential frameworks and where each excels so you can find the best AI framework for your specific project.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;What is an AI framework?&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;AI frameworks are pre-built libraries and tools that handle the complex mathematics, data structures, and computational operations underlying AI and machine learning models. Rather than implementing neural networks or gradient descent from scratch, AI frameworks provide abstractions that let you focus on model architecture, data preparation, and business logic.&lt;/p&gt;



&lt;p&gt;These frameworks generally fall into three categories:&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deep learning frameworks&lt;/strong&gt; like TensorFlow, PyTorch, and Keras specialize in neural networks and GPU acceleration for tasks involving images, text, and audio.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Classical and tabular machine learning frameworks&lt;/strong&gt; like scikit-learn and XGBoost focus on statistical and tree-based models for structured data, powering many real-world AI systems, including forecasting, risk-scoring, and decision-automation solutions.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;LLM and AI agent frameworks&lt;/strong&gt; like LangChain and Hugging Face provide tools for building applications powered by large language models.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Why do AI frameworks matter?&amp;nbsp;&lt;/h3&gt;



&lt;p&gt;AI frameworks dramatically accelerate your development by providing tested, optimized implementations of complex algorithms. They offer strong community support with extensive documentation, tutorials, and troubleshooting resources. They provide production-ready tooling for deployment, monitoring, and scaling. They&amp;#8217;re optimized for specific hardware like GPUs and TPUs, delivering performance that would be difficult to achieve with custom implementations.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Open-source vs. commercial AI frameworks&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;Open-source AI frameworks are the dominant model in AI development today. And they offer compelling advantages, from community-driven innovation for rapid feature development and bug fixes to transparency that enables auditing and algorithm customization. There’s also no vendor lock-in or licensing fees, making them cost-effective for both experimentation and production deployment.&lt;/p&gt;



&lt;p&gt;Commercial AI platforms also exist, with AWS SageMaker, Google Vertex AI, and Azure Machine Learning among the prominent examples. However, these platforms often use open-source frameworks underneath rather than competing with them directly. They provide managed infrastructure, automated workflows, and enterprise features on top of tools like TensorFlow and PyTorch.&lt;/p&gt;



&lt;p&gt;If you’re thinking open source means they’re unsupported, think again. All seven frameworks below have robust ecosystems, and many are backed by major tech companies. Google supports TensorFlow, Meta backs PyTorch, and organizations like Microsoft contribute significantly to various projects in the ecosystem.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Top Python AI frameworks&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;These seven frameworks represent the essential toolkit for Python AI development in 2026. Each performs strongly in specific domains, and many developers use multiple frameworks depending on project requirements.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;TensorFlow&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://www.tensorflow.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TensorFlow&lt;/a&gt; is an open-source deep learning framework developed by Google for building and deploying machine learning models at enterprise scale. With a&lt;a href=&quot;https://6sense.com/tech/data-science-machine-learning/tensorflow-market-share&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 37% market share&lt;/a&gt; in data science and machine learning and adoption by 25,000 companies globally, TensorFlow has proven itself in high-stakes production environments.&lt;/p&gt;



&lt;p&gt;The framework evolved significantly from TensorFlow 1.x to 2.x, with Keras integration making it far more accessible while maintaining its enterprise-grade capabilities. If you’re building large-scale image recognition systems or natural language processing pipelines, or you need to deploy across web, mobile, and edge devices through TensorFlow Lite and TensorFlow.js, TensorFlow can help.&lt;/p&gt;



&lt;p&gt;If you’re just getting started with TensorFlow, follow &lt;a href=&quot;https://blog.jetbrains.com/pycharm/2026/04/how-to-train-your-first-tensorflow-model/&quot;&gt;our step-by-step tutorial on how to train your first TensorFlow model&lt;/a&gt; using PyCharm.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of TensorFlow&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enterprise-grade scalability&lt;/strong&gt;: Built for production from day one, TensorFlow handles massive datasets and distributed training across multiple GPUs and TPUs seamlessly. You can scale from experimentation to serving millions of predictions without switching tools.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Comprehensive deployment ecosystem&lt;/strong&gt;: TensorFlow Serving handles model deployment, TensorFlow Lite optimizes for mobile and edge devices, and TensorFlow.js brings models to browsers. This complete deployment story reduces friction when moving from development to production.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;TPU optimization&lt;/strong&gt;: Native support for Google’s Tensor Processing Units delivers superior performance for large-scale training workloads, offering significantly better performance per watt than traditional hardware.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Strong industry adoption&lt;/strong&gt;: Companies like Airbnb, Twitter, and Intel rely on TensorFlow for critical applications, giving you confidence in its production readiness and long-term viability.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of TensorFlow&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steeper learning curve&lt;/strong&gt;: Despite Keras integration, TensorFlow’s complexity can overwhelm beginners, especially when you move beyond high-level APIs to custom implementations.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Verbose syntax for custom models&lt;/strong&gt;: Building custom training loops or novel architectures requires significantly more code compared with PyTorch’s more Pythonic approach.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Debugging challenges&lt;/strong&gt;: Static graph optimization, while beneficial for performance, can make runtime errors harder to trace than in frameworks with dynamic computation graphs.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;scikit-learn&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://scikit-learn.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;scikit-learn&lt;/a&gt; is an open-source Python library for classical machine learning, providing simple and efficient tools for classification, regression, clustering, and dimensionality reduction. With adoption by&lt;a href=&quot;https://6sense.com/tech/data-science-and-machine-learning/scikit-learn-market-share&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; over 16,000 companies&lt;/a&gt; worldwide, it’s your essential first stop for structured and tabular data before considering deep learning approaches.&lt;/p&gt;



&lt;p&gt;The framework supports a wide range of supervised and unsupervised learning on structured business data, along with feature engineering and data preprocessing pipelines. Companies like&lt;a href=&quot;https://scikit-learn.org/stable/testimonials/testimonials.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; J.P. Morgan use scikit-learn extensively&lt;/a&gt; for classification tasks and predictive analytics in financial decision-making.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of scikit-learn&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Beginner-friendly API&lt;/strong&gt;: Consistent, intuitive syntax across all algorithms makes learning and switching between models effortless. The fit/predict pattern works the same whether you&amp;#8217;re using linear regression or random forests.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Comprehensive algorithm library&lt;/strong&gt;: Its library covers virtually every classical ML algorithm – regression, classification, clustering, dimensionality reduction – with well-tested implementations ready for your projects.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Excellent for tabular data&lt;/strong&gt;: On structured data, traditional algorithms often outperform deep learning, and scikit-learn gives you the tools to maximize this advantage.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Fast prototyping&lt;/strong&gt;: Its simple syntax means you can build and test models in minutes, not hours, making it ideal for rapid experimentation.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Seamless integration&lt;/strong&gt;: scikit-learn works perfectly with NumPy, pandas, and Matplotlib, fitting naturally into your data science workflows.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of scikit-learn&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No deep learning support&lt;/strong&gt;: scikit-learn is not designed for neural networks – you’ll need to switch to TensorFlow or PyTorch for complex deep learning architectures.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Limited GPU acceleration&lt;/strong&gt;: The framework is CPU-bound and struggles with very large datasets where GPU-accelerated frameworks perform better.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Not suited for unstructured data&lt;/strong&gt;: Images, text, and audio require deep learning frameworks that can handle high-dimensional, unstructured inputs.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://pytorch.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PyTorch&lt;/a&gt; is an open-source deep learning framework developed by Meta that prioritizes flexibility and a natural Python coding experience. It’s used in&lt;a href=&quot;https://leapcell.io/blog/tensorflow-vs-pytorch-a-comparative-analysis-for-2025&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; approximately 85% of deep learning research papers&lt;/a&gt; and has a 55% adoption rate in the research community. From its academic roots, PyTorch has evolved into a production-ready powerhouse.&lt;/p&gt;



&lt;p&gt;The framework excels at cutting-edge research and experimentation with novel architectures. It supports natural language processing and generative AI models such as GPT, Llama, and Stable Diffusion, and enables computer vision research with custom model development. Its Pythonic philosophy makes it feel natural if you’re already comfortable with Python, reducing cognitive load and accelerating your development.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of PyTorch&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dynamic computation graphs&lt;/strong&gt;: The define-by-run approach allows runtime model modifications, making debugging and experimentation intuitive. You can use standard Python control flow and debugging tools you already know.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Pythonic and readable&lt;/strong&gt;: PyTorch code feels like native Python, not a separate language. This flattens your learning curve and makes code more maintainable.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Research-first innovation&lt;/strong&gt;: Latest techniques and models appear in PyTorch first, driven by its dominance in academic research.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Strong ecosystem&lt;/strong&gt;: Hugging Face Transformers, PyTorch Lightning, and extensive community packages provide specialized tools for virtually any task you’ll encounter.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of PyTorch&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Deployment complexity&lt;/strong&gt;: While TorchServe has improved the situation, PyTorch historically has had weaker production tooling compared to TensorFlow’s mature deployment ecosystem.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Manual training loops&lt;/strong&gt;: Greater control means more boilerplate code for standard training patterns, though libraries like PyTorch Lightning address this.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Keras&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://keras.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Keras&lt;/a&gt; is a high-level deep learning API designed for fast experimentation with neural networks. With&lt;a href=&quot;https://github.com/keras-team/keras&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; over 60,000 GitHub stars&lt;/a&gt; and integration as TensorFlow’s default interface, Keras has become synonymous with rapid prototyping and ease of use. The release of Keras 3.0 changed the game by adding multi-backend support for TensorFlow, JAX, and PyTorch.&lt;/p&gt;



&lt;p&gt;The framework is ideal for rapidly prototyping neural network architectures, working on educational projects to learn deep learning fundamentals, or tackling deep learning tasks that don’t require low-level customization.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of Keras&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simplest API in deep learning&lt;/strong&gt;: You can build sophisticated models in just a few lines of code with the Sequential or Functional API, offering the lowest barrier to entry in deep learning.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Multi-backend flexibility&lt;/strong&gt;: Keras 3.0 runs on TensorFlow, JAX, or PyTorch – write once, run anywhere. This future-proofs your code and lets you switch backends as your needs change.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Built-in best practices&lt;/strong&gt;: The API guides you toward sound model architecture decisions and incorporates best practices by default.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Fast experimentation&lt;/strong&gt;: You can iterate quickly without wrestling with framework complexity, focusing on model design rather than implementation details.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of Keras&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Limited low-level control&lt;/strong&gt;: The abstraction layer sacrifices fine-grained control needed for cutting-edge research or novel architectures.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Performance overhead&lt;/strong&gt;: The additional abstraction can introduce latency compared to native framework calls, though this is often negligible for most applications.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Less suitable for custom architectures&lt;/strong&gt;: Highly novel model designs may require you to drop down to the underlying framework.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;LangChain&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://www.langchain.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LangChain&lt;/a&gt; is an open-source framework that helps you build applications powered by large language models, providing core components for prompt management, chains, memory, and agent orchestration. It acts as an abstraction layer to easily connect LLMs to external data sources and computational tools. With over &lt;a href=&quot;https://github.com/langchain-ai/langchain&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;120,000 GitHub stars&lt;/a&gt;, the framework has become essential infrastructure for the AI agent revolution.&lt;/p&gt;



&lt;p&gt;LangChain is most commonly used for building conversational AI and chatbots with memory and context, retrieval-augmented generation (RAG) systems for enterprise knowledge bases, and multi-agent systems with autonomous workflows.&lt;/p&gt;



&lt;p&gt;If you want to go beyond the basics, read our &lt;a href=&quot;https://blog.jetbrains.com/pycharm/2026/02/langchain-tutorial-2026/&quot;&gt;&lt;em&gt;LangChain Python Tutorial: A Complete Guide for 2026&lt;/em&gt;&lt;/a&gt;. It takes a deeper look at what LangChain offers and walks through real-world use cases for building AI agents in Python.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of LangChain&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comprehensive LLM orchestration&lt;/strong&gt;: Handles everything from prompt management to chains, memory, and tool use, giving you a complete infrastructure for LLM applications in one package.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Provider-agnostic&lt;/strong&gt;: Works seamlessly with OpenAI, Anthropic, Hugging Face, and local models, letting you avoid vendor lock-in and switch providers as your needs change.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Rich agent capabilities&lt;/strong&gt;: LangGraph enables complex, stateful workflows with human-in-the-loop patterns, supporting sophisticated agentic behaviors.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Production-ready tooling&lt;/strong&gt;: LangSmith provides monitoring, debugging, and tracing specifically designed for LLM applications, addressing the unique challenges you’ll face in production.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of LangChain&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learning curve for abstractions&lt;/strong&gt;: LangChain Expression Language (LCEL) and framework-specific concepts take time to master, especially if you’re new to LLM orchestration.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Abstraction overhead&lt;/strong&gt;: Additional layers between you and LLM APIs can sometimes obscure what’s happening, making debugging more challenging.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Fast-moving target&lt;/strong&gt;: Frequent updates mean your code can become outdated quickly, requiring ongoing maintenance to stay current.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Hugging Face&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://huggingface.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hugging Face&lt;/a&gt; is an open-source platform and library ecosystem for natural language processing and machine learning, with over one million models and 250,000 datasets to power your next project. It’s become a central hub for the AI community, with its &lt;a href=&quot;https://github.com/huggingface/transformers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Transformers library earning 150,000+ GitHub stars&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;The platform is particularly effective at accessing and fine-tuning pre-trained transformer models like BERT, GPT, and Llama, building NLP applications without training models from scratch, and sharing and deploying custom models to the community.&lt;/p&gt;



&lt;p&gt;For a practical example, read &lt;a href=&quot;https://blog.jetbrains.com/pycharm/2025/08/fine-tuning-and-deploying-gpt-models-using-hugging-face-transformers/&quot;&gt;&lt;em&gt;A Practical Guide to Fine-Tuning and Deploying GPT Models Using Hugging Face Transformers&lt;/em&gt;&lt;/a&gt;. It walks through using a pre-trained GPT model, fine-tuning it on custom data, and deploying the result with FastAPI.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of Hugging Face&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Massive model repository&lt;/strong&gt;: With hundreds of thousands of pre-trained models available, you rarely need to train from scratch. Models for virtually every task and language are ready for you to use.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Transformers library dominance&lt;/strong&gt;: This is the de facto standard for NLP, computer vision, and multimodal models, with support for the latest architectures as soon as they’re published.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Framework interoperability&lt;/strong&gt;: Models work with PyTorch, TensorFlow, and JAX, giving you maximum flexibility in your development workflow.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Inference infrastructure&lt;/strong&gt;: Hosted inference APIs and Spaces make deployment straightforward without managing your own infrastructure.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of Hugging Face&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dependency complexity&lt;/strong&gt;: The large dependency tree can lead to version conflicts and package management challenges, especially in complex environments.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Model quality variance&lt;/strong&gt;: Community-contributed models vary in quality and may not be production-ready without thorough vetting and testing on your part.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Platform dependency&lt;/strong&gt;: Heavy reliance on Hugging Face Hub creates some platform lock-in, though you can download models and host them independently.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/h3&gt;



&lt;p&gt;&lt;a href=&quot;https://xgboost.readthedocs.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;XGBoost&lt;/a&gt; is an optimized gradient boosting library designed for speed and performance on structured data. The algorithm continues to dominate machine learning competitions alongside other gradient-boosted decision tree libraries, earning its reputation through battle-tested performance on real-world problems.&lt;/p&gt;



&lt;p&gt;You can use the framework for predictive modeling on structured business data, including sales forecasting, risk assessment, and feature importance analysis for model interpretability. Its gradient-boosting approach achieves outstanding precision on structured data, powering reliable insights for business applications.&lt;/p&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Advantages of XGBoost&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Superior accuracy on tabular data&lt;/strong&gt;: XGBoost consistently outperforms deep learning on structured datasets, making it your default choice for business analytics and forecasting.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Built-in regularization&lt;/strong&gt;: L1 and L2 regularization prevents overfitting better than basic gradient boosting, producing more robust models for your production systems.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Efficient computation&lt;/strong&gt;: Handles large datasets efficiently with parallel processing and intelligent tree pruning, making it practical for production use.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Missing value handling&lt;/strong&gt;: Automatically learns optimal strategies for missing data, reducing your preprocessing burden.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Feature importance scores&lt;/strong&gt;: Built-in interpretability helps you understand model decisions, crucial for business applications and regulatory compliance.&lt;/li&gt;
&lt;/ul&gt;



&lt;h4 class=&quot;wp-block-heading&quot;&gt;Disadvantages of XGBoost&lt;/h4&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not suitable for unstructured data&lt;/strong&gt;: Images, text, and audio require deep learning approaches. XGBoost is designed specifically for tabular data.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Hyperparameter complexity&lt;/strong&gt;: There are many parameters to tune for optimal performance, though tools like Optuna can automate this process for you.&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Limited interpretability compared with simple models&lt;/strong&gt;: While more explainable than deep neural networks, XGBoost’s ensemble structure is harder to interpret than linear or rule-based models, even with feature importance and SHAP analysis.&lt;/li&gt;
&lt;/ul&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;How to choose an AI framework&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;Selecting the best AI framework depends on your specific project characteristics, but in practice, the choice is rarely binary. Many successful teams use multiple frameworks together. A common and effective pattern is to use scikit-learn for preprocessing and feature engineering, PyTorch for research and model development, TensorFlow for production deployment, and LangChain for LLM-powered features.&lt;/p&gt;



&lt;p&gt;Your decision will likely come down to data type, team expertise, and where your model needs to run. Use this table as a starting point:&lt;/p&gt;



&lt;table class=&quot;has-black-color has-text-color&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Decision factor&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Suitable Frameworks&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;By modeling approach and prediction type&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Single-value or label prediction (regression or classification using classical ML)&lt;/td&gt;&lt;td&gt;scikit-learn, XGBoost&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Image and video modeling with neural networks&lt;/td&gt;&lt;td&gt;TensorFlow, PyTorch, Keras&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Text and NLP with transformer models&lt;/td&gt;&lt;td&gt;Hugging Face, PyTorch, TensorFlow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LLM-powered and agent-based applications&lt;/td&gt;&lt;td&gt;LangChain, Hugging Face&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;By level of abstraction and control required&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;High-level APIs and rapid iteration&lt;/td&gt;&lt;td&gt;Keras, scikit-learn&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fine-grained control over training and architectures&lt;/td&gt;&lt;td&gt;PyTorch, TensorFlow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Research-driven experimentation and custom workflows&lt;/td&gt;&lt;td&gt;PyTorch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Managed LLM orchestration and tooling&lt;/td&gt;&lt;td&gt;LangChain&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;By deployment target&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Production at scale&lt;/td&gt;&lt;td&gt;TensorFlow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Research/Experimentation&lt;/td&gt;&lt;td&gt;PyTorch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mobile/Edge&lt;/td&gt;&lt;td&gt;TensorFlow Lite&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web applications&lt;/td&gt;&lt;td&gt;TensorFlow.js&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LLM applications&lt;/td&gt;&lt;td&gt;LangChain&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;By task and project objective&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Classical prediction and forecasting systems&lt;/td&gt;&lt;td&gt;scikit-learn, XGBoost&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Neural network–based modelling&lt;/td&gt;&lt;td&gt;TensorFlow, PyTorch, Keras&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Building and training novel architectures&lt;/td&gt;&lt;td&gt;PyTorch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Scalable production deployment&lt;/td&gt;&lt;td&gt;TensorFlow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LLM-powered features and workflows&lt;/td&gt;&lt;td&gt;LangChain, Hugging Face&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;



&lt;p&gt;If your choice comes down to PyTorch or TensorFlow, read our dedicated &lt;a href=&quot;https://blog.jetbrains.com/pycharm/2026/05/pytorch-vs-tensorflow-choosing-framework-2026/&quot;&gt;&lt;em&gt;PyTorch vs. TensorFlow: Choosing the Right Framework in 2026&lt;/em&gt;&lt;/a&gt; guide, where we compare learning curves, deployment options, and use cases to help you choose the right deep learning framework.&lt;/p&gt;</description>
	<pubDate>Thu, 11 Jun 2026 11:28:08 +0000</pubDate>
</item>
<item>
	<title>Seth Michael Larson: Linting is important for code review: screen included</title>
	<guid>https://sethmlarson.dev/linting-screen-during-code-review?utm_campaign=rss</guid>
	<link>https://sethmlarson.dev/linting-screen-during-code-review?utm_campaign=rss</link>
	<description>&lt;p&gt;Today I was reviewing a pull request for some Python code
when I saw a semicolon in the diff.
&lt;!-- more --&gt;
Screenshot
provided below, which as we all know is the best way to share
text on the internet:&lt;/p&gt;

&lt;p&gt;
&lt;center&gt;
&lt;img alt=&quot;Picture of code with a semicolon (;)&quot; src=&quot;https://storage.googleapis.com/sethmlarson-dev-static-assets/IMG_5329_small.jpeg&quot; /&gt;
&lt;br /&gt;&lt;small&gt;&lt;em&gt;&lt;/em&gt;&lt;/small&gt;
&lt;/center&gt;
&lt;/p&gt;

&lt;p&gt;I was just about to leave a comment, but then I scrolled the page a bit and... &lt;/p&gt;

&lt;p&gt;
&lt;center&gt;
&lt;img alt=&quot;Same picture of code, but the dot on top of the semicolon has shifted away revealing it is only a piece of dirt on the screen above a comma (,)&quot; src=&quot;https://storage.googleapis.com/sethmlarson-dev-static-assets/IMG_5332_small.jpeg&quot; /&gt;
&lt;br /&gt;&lt;small&gt;&lt;em&gt;&lt;/em&gt;&lt;/small&gt;
&lt;/center&gt;
&lt;/p&gt;

&lt;p&gt;Ah. Time to clean my laptop screen then... 🧼🫧&lt;/p&gt;
&lt;br /&gt;&lt;hr /&gt;&lt;p&gt;Thanks for reading ♥ I would love to hear your thoughts! Contact me via &lt;a href=&quot;https://mastodon.social/@sethmlarson&quot;&gt;Mastodon&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/sethmlarson.dev&quot;&gt;Bluesky&lt;/a&gt;, or &lt;a href=&quot;mailto:sethmichaellarson@gmail.com&quot;&gt;email&lt;/a&gt;. Browse the &lt;a href=&quot;https://sethmlarson.dev/&quot;&gt;blog archive&lt;/a&gt;. Check out my &lt;a href=&quot;https://sethmlarson.dev/blogroll&quot;&gt;blogroll&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;</description>
	<pubDate>Thu, 11 Jun 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Django Weblog: DSF 2026 Fundraising Goals</title>
	<guid>https://www.djangoproject.com/weblog/2026/jun/10/dsf-2026-fundraising-goals/</guid>
	<link>https://www.djangoproject.com/weblog/2026/jun/10/dsf-2026-fundraising-goals/</link>
	<description>&lt;p&gt;Django has grown far beyond a web framework. It powers businesses, nonprofits, startups, educational institutions, and critical infrastructure around the world. The Django Software Foundation exists to support that ecosystem, and none of that work is possible without funding. This year, the board set an ambitious new fundraising goal, and I want to be transparent about what we are aiming for and why it matters.&lt;/p&gt;
&lt;p&gt;Before talking about where we want to go, it's important to recognize that everything the DSF does today is possible because of the organizations and individuals who already support Django. Their contributions fund the work that keeps Django healthy, secure, and sustainable, and we are deeply grateful for that support. &lt;/p&gt;
&lt;h2 id=&quot;s-our-2026-goal-500000&quot;&gt;&lt;strong&gt;Our 2026 Goal: $500,000&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;This year, we are raising our annual fundraising goal from $300,000 to $500,000.&lt;/p&gt;
&lt;p&gt;That is a meaningful increase, and it reflects where the foundation needs to be. Our current monthly recurring donations are around $9,000 per month. To reach $500,000 annually, we need to grow that to approximately $15,000 per month.&lt;/p&gt;
&lt;p&gt;Reaching this goal will require both new supporters and increased support from existing donors. Doing so will help us maintain the programs the community relies on while creating room for future growth.&lt;/p&gt;
&lt;h2 id=&quot;s-what-the-money-funds&quot;&gt;&lt;strong&gt;What the Money Funds&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Before asking for support, it is only fair to explain where the money goes.&lt;/p&gt;
&lt;p&gt;The largest line item in our budget is the &lt;a href=&quot;https://www.djangoproject.com/fundraising/#fellowship-program&quot;&gt;Django Fellows program&lt;/a&gt;. Our three Fellows dedicate their time to triaging tickets, reviewing pull requests, managing releases, handling security issues, and doing the essential work that keeps Django moving forward. Without sustained funding, we cannot maintain this program.&lt;/p&gt;
&lt;p&gt;Beyond the Fellows, the DSF:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manages the Django trademark and legal protections  &lt;/li&gt;
&lt;li&gt;Funds the infrastructure that keeps djangoproject.com and related services running  &lt;/li&gt;
&lt;li&gt;Provides grants to DjangoCon events around the world, including DjangoCon US, DjangoCon Europe, and DjangoCon Africa  &lt;/li&gt;
&lt;li&gt;Funds regional Django Days, sprints, and community events  &lt;/li&gt;
&lt;li&gt;Supports Django Girls events through grants  &lt;/li&gt;
&lt;li&gt;Invests in community programs like Djangonaut Space&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Taken together, $500,000 in annual funding would allow us to sustain our three Fellows, maintain operational support for the DSF, create a clear path to hiring an Executive Director, and expand our ability to support the Django ecosystem at scale.&lt;/p&gt;
&lt;h2 id=&quot;s-hiring-an-executive-director&quot;&gt;Hiring an Executive Director&lt;/h2&gt;
&lt;p&gt;For most of its history, the DSF has been powered almost entirely by volunteers, with board members handling fundraising, grants, trademarks, and operations on top of their day jobs. That commitment has carried the foundation a long way, but it also limits how much we can take on.&lt;/p&gt;
&lt;p&gt;That is why we are working toward hiring an Executive Director this year. An Executive Director would give the foundation dedicated, day-to-day leadership: someone who can build lasting relationships with sponsors, grow our fundraising programs, strengthen support for our volunteers and working groups, and turn the board's long-term plans into steady progress.&lt;/p&gt;
&lt;p&gt;We are optimistic about what this role would unlock. With dedicated operational support, the DSF could pursue larger partnerships, launch new programs, and respond more quickly to the community's needs. Reaching our fundraising goal is a key part of making that a reality.&lt;/p&gt;
&lt;h2 id=&quot;s-ways-to-support-django&quot;&gt;&lt;strong&gt;Ways to Support Django&lt;/strong&gt;&lt;/h2&gt;
&lt;h3 id=&quot;s-sponsored-fellow-the-highest-impact-way-to-support-django&quot;&gt;&lt;strong&gt;Sponsored Fellow: The Highest-Impact Way to Support Django&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;This year, the DSF is introducing a Sponsored Fellow corporate membership tier, a new way for organizations to make a direct, visible investment in Django's future.&lt;/p&gt;
&lt;p&gt;As a Sponsored Fellow sponsor, your company directly funds one of the Django Fellows who keep the framework running every day. In return, you receive the highest level of recognition the DSF offers. Depending on the partnership, that can include your company's logo and information featured in Django release announcements, recognition through the Fellows' work at conferences and community events, advertising opportunities across DSF communications, and visibility across DSF publications and promotional materials throughout the year.&lt;/p&gt;
&lt;p&gt;Django releases reach tens of thousands of developers. The Fellows represent Django at DjangoCon events around the world. If you want your company's name and logo in front of the global Django community, this is the most direct path to get there.&lt;/p&gt;
&lt;p&gt;This tier is designed for organizations that depend on Django at scale and want to do more than write a check. It is a partnership, and we will work with you to make sure your sponsorship is visible and meaningful.&lt;/p&gt;
&lt;p&gt;To learn more or start a conversation about the Sponsored Fellow tier, reach out through our &lt;a href=&quot;https://www.djangoproject.com/sponsor/&quot;&gt;Contact the DSF&lt;/a&gt; page.&lt;/p&gt;
&lt;h3 id=&quot;s-corporate-membership&quot;&gt;&lt;strong&gt;Corporate Membership&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Corporate membership is a proven way for organizations to support the DSF. Tiers range from Bronze at $2,000 per year up to Platinum at $150,000 per year. Member organizations receive recognition on djangoproject.com, benefits in our community channels, and the knowledge that they are directly funding the framework their teams depend on.&lt;/p&gt;
&lt;p&gt;To learn more or get started, visit &lt;a href=&quot;https://www.djangoproject.com/foundation/corporate-membership/&quot;&gt;djangoproject.com/foundation/corporate-membership/&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;s-individual-donations&quot;&gt;&lt;strong&gt;Individual Donations&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Individual donations add up. Whether it is a one-time gift or a small monthly contribution, every bit helps us reach our monthly target and plan ahead with more confidence.&lt;/p&gt;
&lt;p&gt;You can donate via our &lt;a href=&quot;https://www.djangoproject.com/fundraising/&quot;&gt;donate page&lt;/a&gt; or through &lt;a href=&quot;https://opencollective.com/django&quot;&gt;Open Collective&lt;/a&gt;, which we added last year to make recurring donations easier.&lt;/p&gt;
&lt;h3 id=&quot;s-employer-donation-matching&quot;&gt;&lt;strong&gt;Employer Donation Matching&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Many companies offer donation matching programs that can double or even triple the impact of an individual contribution. If your employer has a matching program, the DSF is typically eligible. Check with your HR or finance team and put that benefit to work.&lt;/p&gt;
&lt;h3 id=&quot;s-github-sponsors&quot;&gt;&lt;strong&gt;GitHub Sponsors&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;We have also raised our &lt;a href=&quot;https://github.com/sponsors/django&quot;&gt;GitHub Sponsors&lt;/a&gt; goal to $15,000 per month to better reflect the level of ongoing support Django needs. We are currently over $9,000 per month, so we are well on our way, but there is still ground to cover. If you already sponsor Django through GitHub, thank you. If you have been thinking about it, now is a great time to start.&lt;/p&gt;
&lt;p&gt;Thanks to all our existing sponsors and donors, Django has been able to sustain community initiatives over the past several years.&lt;/p&gt;
&lt;h3 id=&quot;s-spread-the-word&quot;&gt;&lt;strong&gt;Spread the Word&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;If you cannot contribute financially right now, you can still help by spreading the word. Share this post. Mention Django's funding needs the next time someone asks how to give back to open source. Tell your employer about corporate membership.&lt;/p&gt;
&lt;h2 id=&quot;s-a-note-on-transparency&quot;&gt;&lt;strong&gt;A Note on Transparency&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We publish monthly balance snapshots in our &lt;a href=&quot;https://github.com/django/dsf-minutes&quot;&gt;board minutes&lt;/a&gt;. The foundation started 2026 with around $222,000 in operating reserves. We take stewardship of those funds seriously, and you should always be able to see where we stand. Those reserves help ensure continuity of operations and provide financial stability for the foundation's ongoing commitments.&lt;/p&gt;
&lt;h2 id=&quot;s-looking-ahead&quot;&gt;&lt;strong&gt;Looking Ahead&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;A significant portion of our funding comes directly from the community through individual donations, memberships, sponsorships, and fundraising campaigns. That ongoing support is one of the clearest signals that Django still matters to the people who build with it every day, and we are deeply grateful for it.&lt;/p&gt;
&lt;p&gt;Every Django release, security advisory, ticket review, and mentoring interaction represents countless hours of work from people who care deeply about the framework and community. The DSF exists to make sure that work remains sustainable and that contributors have the support they need to keep Django healthy for everyone who depends on it.&lt;/p&gt;
&lt;p&gt;Raising our goal is not about growth for growth's sake. It is about stability, sustainability, and making sure the project, the Fellows, and the broader community have what they need for the years ahead.&lt;/p&gt;
&lt;p&gt;We believe $500,000 is achievable. If you have ever benefited from Django, professionally or personally, now is a great time to give back.&lt;/p&gt;
&lt;p&gt;Thank you for being part of this community.&lt;/p&gt;</description>
	<pubDate>Wed, 10 Jun 2026 20:00:00 +0000</pubDate>
</item>
<item>
	<title>Mike Driscoll: How to Get TIFF MetaData with Python</title>
	<guid>https://blog.pythonlibrary.org/2026/06/10/how-to-get-tiff-metadata-with-python/</guid>
	<link>https://blog.pythonlibrary.org/2026/06/10/how-to-get-tiff-metadata-with-python/</link>
	<description>&lt;p&gt;In previous &lt;a href=&quot;https://blog.pythonlibrary.org/2010/03/28/getting-photo-metadata-exif-using-python/&quot;&gt;articles&lt;/a&gt; on this website, you learned how to extract EXIF data from JPG image files. This week, you will learn how to get similar data from the TIFF image format.&lt;/p&gt;
&lt;p&gt;The TIFF format also has its metadata. Pillow provides a similar dictionary for TIFF images in its &lt;code&gt;TiffTags&lt;/code&gt; module. If you need a TIFF image, you can use this one, which is a cover from one of the author&amp;#8217;s other books on &lt;strong&gt;ReportLab&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-12796&quot; src=&quot;https://blog.pythonlibrary.org/wp-content/uploads/2026/06/reportlab.png&quot; alt=&quot;ReportLab cover&quot; width=&quot;546&quot; height=&quot;762&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can create your own TIFF metadata extractor utility by making a new file named &lt;code&gt;tiff_metadata.py&lt;/code&gt; and adding this code to it:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;# tiff_metadata.py

from PIL import Image
from PIL.TiffTags import TAGS


def get_metadata(image_file_path):
    image = Image.open(image_file_path)
    metadata = {}
    for tag in image.tag.items():
        metadata[TAGS.get(tag[0])] = tag[1]
    return metadata


if __name__ == &quot;__main__&quot;:
    metadata = get_metadata(&quot;reportlab_cover.tiff&quot;)
    print(metadata)&lt;/pre&gt;
&lt;p dir=&quot;auto&quot;&gt;Here you import the &lt;code&gt;TAGS&lt;/code&gt; dictionary from the &lt;code&gt;PIL.TiffTags&lt;/code&gt; submodule. Then in &lt;code&gt;get_metadata()&lt;/code&gt;, you access the tag elements in the image by iterating over the contents of &lt;code&gt;tag.items()&lt;/code&gt;. To make that information more readable, you use the &lt;code&gt;TAGS&lt;/code&gt; dictionary that you imported.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Here is a sample of the output you will get when you run this code:&lt;/p&gt;
&lt;pre class=&quot;EnlighterJSRAW&quot;&gt;{'ImageWidth': (400,),
 'ImageLength': (562,),
 'BitsPerSample': (8, 8, 8),
 'Compression': (1,),
 'PhotometricInterpretation': (2,),
 'FillOrder': (1,),
 'StripOffsets': (82, 130882, 261682, 392482, 523282, 654082),
 'Orientation': (1,),
 'SampleFormat': (1, 1, 1),
 'SamplesPerPixel': (3,),
 'RowsPerStrip': (109,),
 'StripByteCounts': (130800, 130800, 130800, 130800, 130800, 20400),
 'XResolution': ((300, 1),),
 'YResolution': ((300, 1),),
 'PlanarConfiguration': (1,),
 'ResolutionUnit': (2,),
 'ExifIFD': (8,),
 'Software': ('Pixelmator 3.9',),
 'DateTime': ('2020:10:27 12:10:37',),
}&lt;/pre&gt;
&lt;p&gt;You can see that the value entries above are all tuples. This is because of how the data is returned from the tag data. If you would like a challenge, you can attempt to clean up this data a bit in your version of the metadata extraction utility.&lt;/p&gt;
&lt;h2 class=&quot;header-anchor-post&quot;&gt;Wrapping Up&lt;/h2&gt;
&lt;div class=&quot;pencraft pc-display-flex pc-alignItems-center pc-position-absolute pc-reset header-anchor-parent&quot;&gt;
&lt;div class=&quot;pencraft pc-display-contents pc-reset pubTheme-yiXxQA&quot;&gt;
&lt;div id=&quot;§wrapping-up&quot; class=&quot;pencraft pc-reset header-anchor offset-top&quot;&gt;&lt;span&gt;EXIF and TIFF metadata are really useful for encoding lots of information in your images. However, most people don’t even know that data is there! Knowing how to access your photo’s metadata allows you to do all kinds of programmatic tasks, such as resizing, sorting files by various parameters, and much more.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can use Pillow and Python to do all kinds of other image processing, so this is just scratching the surface. Download Pillow today and start learning!&lt;/p&gt;
&lt;h2 class=&quot;header-anchor-post&quot;&gt;&lt;strong&gt;Want to Learn More?&lt;/strong&gt;&lt;/h2&gt;
&lt;div class=&quot;pencraft pc-display-flex pc-alignItems-center pc-position-absolute pc-reset header-anchor-parent&quot;&gt;
&lt;div class=&quot;pencraft pc-display-contents pc-reset pubTheme-yiXxQA&quot;&gt;&lt;span&gt;You can learn more about what you can do with Python and Pillow in Mike’s book, &lt;/span&gt;&lt;strong&gt;Pillow: Image Processing with Python&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Purchase at &lt;a href=&quot;https://driscollis.gumroad.com/l/pypillow&quot;&gt;Gumroad&lt;/a&gt;, &lt;a href=&quot;https://leanpub.com/pillow&quot;&gt;Leanpub&lt;/a&gt;, or &lt;a href=&quot;https://amzn.to/3ZvLfav&quot;&gt;Amazon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a href=&quot;https://blog.pythonlibrary.org/2026/06/10/how-to-get-tiff-metadata-with-python/&quot;&gt;How to Get TIFF MetaData with Python&lt;/a&gt; appeared first on &lt;a href=&quot;https://blog.pythonlibrary.org&quot;&gt;Mouse Vs Python&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Wed, 10 Jun 2026 19:15:42 +0000</pubDate>
</item>
<item>
	<title>Python Morsels: Stacks and queues in Python</title>
	<guid>https://www.pythonmorsels.com/stacks-and-queues/</guid>
	<link>https://www.pythonmorsels.com/stacks-and-queues/</link>
	<description>&lt;p&gt;Use a Python list for stack operations (last-in, first-out) and a &lt;code&gt;deque&lt;/code&gt; from the &lt;code&gt;collections&lt;/code&gt; module for queue operations (first-in, first-out).&lt;/p&gt;


&lt;div&gt;
  
    &lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/&quot;&gt;&lt;img width=&quot;480&quot; height=&quot;270&quot; src=&quot;https://i.vimeocdn.com/filter/overlay?src0=https%3A%2F%2Ffd.xuwubk.eu.org%3A443%2Fhttps%2Fi.vimeocdn.com%2Fvideo%2F2167158606-f99d799f0637fd953d7cc87b7a735dbf8ae232db8f1099f1dd4a9ac594aa576c-d_1920x1080%3F%26region%3Dus&amp;src1=https%3A%2F%2Ffd.xuwubk.eu.org%3A443%2Fhttp%2Ff.vimeocdn.com%2Fp%2Fimages%2Fcrawler_play.png&quot; /&gt;&lt;/a&gt;
  
  &lt;p&gt;
  &lt;strong&gt;Table of contents&lt;/strong&gt;
  &lt;ol&gt;
  
  &lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/#stacks-versus-queues&quot; target=&quot;_blank&quot;&gt;Stacks versus Queues&lt;/a&gt;&lt;/li&gt;
  
  &lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/#stacks-in-python&quot; target=&quot;_blank&quot;&gt;Stacks in Python&lt;/a&gt;&lt;/li&gt;
  
  &lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/#queues-in-python&quot; target=&quot;_blank&quot;&gt;Queues in Python&lt;/a&gt;&lt;/li&gt;
  
  &lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/#a-deque-is-a-double-ended-queue&quot; target=&quot;_blank&quot;&gt;A &lt;code&gt;deque&lt;/code&gt; is a &quot;double-ended queue&quot;&lt;/a&gt;&lt;/li&gt;
  
  &lt;li&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/#stack-like-and-queue-like-operations&quot; target=&quot;_blank&quot;&gt;Stack-like and queue-like operations&lt;/a&gt;&lt;/li&gt;
  
  &lt;/ol&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  
    &lt;h2&gt;Stacks versus Queues&lt;/h2&gt;
    
      
        &lt;p&gt;In Computer Science, stacks and queues are data structures that are optimized to make it inexpensive to remove either the &lt;em&gt;most&lt;/em&gt; recently added item &lt;em&gt;or&lt;/em&gt; the &lt;em&gt;least&lt;/em&gt; recently added item.&lt;/p&gt;

      
        &lt;p&gt;A queue is often called a &lt;strong&gt;FIFO&lt;/strong&gt; data structure: &lt;strong&gt;first in, first out&lt;/strong&gt;.&lt;/p&gt;

      
        &lt;p&gt;You can think of a queue as... well, a queue.
Or a &quot;line&quot;, for Americans like me.
The first person to enter a queue will be the first person to reach the front of the queue.&lt;/p&gt;

      
        &lt;p&gt;And in programming queues, &lt;strong&gt;the first item added will be the first item removed&lt;/strong&gt;.&lt;/p&gt;

      
        &lt;p&gt;A stack is often called a &lt;strong&gt;LIFO&lt;/strong&gt; data structure: &lt;strong&gt;last in, first out&lt;/strong&gt;.&lt;/p&gt;

      
        &lt;p&gt;You can think of a stack as a stack of plates... specifically one of those spring-loaded ones from a self-service lunch counter.
The last plate that's added to the top of the stack will be the first plate removed from the top of the stack.&lt;/p&gt;

      
        &lt;p&gt;And in programming stacks, &lt;strong&gt;the last item added will be the first item that's removed&lt;/strong&gt;.&lt;/p&gt;

      
        &lt;p&gt;But how do these terms apply to Python?&lt;/p&gt;

      
    
  
    &lt;h2&gt;Stacks in Python&lt;/h2&gt;
    
      &lt;p&gt;You can think of &lt;a href=&quot;https://www.pythonmorsels.com/what-are-lists/&quot; target=&quot;_blank&quot;&gt;Python …&lt;/a&gt;&lt;/p&gt;
    
  
&lt;/div&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.pythonmorsels.com/stacks-and-queues/&quot; target=&quot;_blank&quot;&gt;Read the full article: https://www.pythonmorsels.com/stacks-and-queues/&lt;/a&gt;&lt;/h3&gt;</description>
	<pubDate>Wed, 10 Jun 2026 16:30:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Cursor vs Windsurf: Which AI Code Editor Is Best for Python?</title>
	<guid>https://realpython.com/cursor-vs-windsurf-python/</guid>
	<link>https://realpython.com/cursor-vs-windsurf-python/</link>
	<description>&lt;div&gt;&lt;p&gt;AI-powered code editors have moved beyond novelty to become everyday tools for many Python developers. Instead of having to switch between your editor and a separate AI chat, you can use tools like Cursor and Windsurf that bring AI directly into your workflow. As a result, the Cursor vs Windsurf question is a common one for developers deciding which to adopt.&lt;/p&gt;
&lt;p&gt;Both Cursor and Windsurf are &lt;a href=&quot;https://realpython.com/ref/code-editors-ides/visual-studio-code/&quot; class=&quot;ref-link&quot;&gt;VS Code&lt;/a&gt; forks that import your keybindings, themes, and Python extensions, and both run the same frontier models. They look similar at first but diverge in how they handle changes as you build.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://realpython.com/ref/ai-coding-tools/cursor/&quot; class=&quot;ref-link&quot;&gt;Cursor&lt;/a&gt; focuses on control, surfacing AI-generated edits as reviewable diffs and relying on explicit rules to guide agent behavior. &lt;a href=&quot;https://realpython.com/ref/ai-coding-tools/windsurf/&quot; class=&quot;ref-link&quot;&gt;Windsurf&lt;/a&gt; focuses on flow, applying edits directly in the editor while using broader workspace context, including terminal output, recent edits, and conversation history, to shape its behavior.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this tutorial, you’ll compare both editors across:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI code completion:&lt;/strong&gt; How each editor’s completion system behaves and what context it draws on&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic multi-file editing:&lt;/strong&gt; How each editor handles tasks involving multiple files, directories, and the terminal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debugging and error correction:&lt;/strong&gt; How each editor reviews generated code and integrates with your linter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the end, you’ll have a clear picture of which editor fits your Python workflow. If you’re coming from VS Code, the &lt;a href=&quot;https://realpython.com/python-development-visual-studio-code/&quot;&gt;Python Development in Visual Studio Code&lt;/a&gt; tutorial covers the baseline configuration that carries over to both forks.&lt;/p&gt;
&lt;p&gt;The table below helps you choose the right editor at a glance:&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 class=&quot;text-left&quot;&gt;Use case&lt;/th&gt;
&lt;th class=&quot;text-left&quot;&gt;Cursor&lt;/th&gt;
&lt;th class=&quot;text-left&quot;&gt;Windsurf&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;text-left&quot;&gt;You want AI-generated changes shown as reviewable diffs before they’re written to your files, guided by explicit rules&lt;/td&gt;
&lt;td class=&quot;text-left&quot;&gt;✅&lt;/td&gt;
&lt;td class=&quot;text-left&quot;&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;text-left&quot;&gt;You want edits applied directly as the agent works, using a broader workspace context (terminal output, recent edits, conversation history, and memory)&lt;/td&gt;
&lt;td class=&quot;text-left&quot;&gt;—&lt;/td&gt;
&lt;td class=&quot;text-left&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Cursor is the better fit if you want to review changes before they’re applied. Windsurf is the better fit if you prefer the agent to apply edits directly in your files as it works, drawing on the broader workspace context. To see how this plays out in completion, context management, and debugging, read on.&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/cursor-vs-windsurf-python-code/&quot; class=&quot;alert-link&quot;&gt;Click here to download the free sample code&lt;/a&gt; for the resilient HTTP client you’ll build with Cursor and Windsurf in this tutorial.&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 “Cursor vs Windsurf: Which AI Code Editor Is Best for 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/cursor-vs-windsurf-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 operating a factory machine with conveyor belts and panels labeled Manual Control Center and Automatic Flow Center, with a Python logo on a chip.&quot; src=&quot;https://files.realpython.com/media/Windsurf-vs-Cursor-Which-AI-Powered-Code-Editor-Is-Best-for-Python_Watermarked.5c2bcb8d1965.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/cursor-vs-windsurf-python/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;Cursor vs Windsurf: Which AI Code Editor Is Best for Python?&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your understanding of how Cursor and Windsurf compare for Python across AI completion, agentic edits, and debugging workflows.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;metrics-comparison-cursor-vs-windsurf&quot;&gt;Metrics Comparison: Cursor vs Windsurf&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#metrics-comparison-cursor-vs-windsurf&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As you work through the hands-on sections and eventually bring either editor into your own Python projects, the table below gives you a quick reference for some key differences you might expect from each tool:&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;Metric&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Windsurf&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IDE support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standalone VS Code fork plus a &lt;a href=&quot;https://plugins.jetbrains.com/plugin/30583-cursorj&quot;&gt;JetBrains plugin&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Standalone VS Code fork plus &lt;a href=&quot;https://docs.windsurf.com/plugins/compatibility#supported-ides-and-versions&quot;&gt;plugins&lt;/a&gt; for JetBrains IDEs, Vim, Neovim, Xcode, Visual Studio, and more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI code completion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast, line-by-line prediction; strong on single-file typed structures&lt;/td&gt;
&lt;td&gt;Slower but more structurally aware across interconnected files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Faster. Uses lightweight text search that requires no upfront project indexing.&lt;/td&gt;
&lt;td&gt;Slower initial response. Builds a semantic map of your project structure before it begins.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identifies and fixes the root cause in one pass&lt;/td&gt;
&lt;td&gt;Reaches passing tests by working around the root cause over multiple iterations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource impact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Light. Low background CPU and RAM usage.&lt;/td&gt;
&lt;td&gt;Heavy. Background indexing can spike local CPU during initial project load.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Billing model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monthly credit pool with unlimited &lt;em&gt;Tab&lt;/em&gt; and &lt;em&gt;Auto&lt;/em&gt; mode on Pro&lt;/td&gt;
&lt;td&gt;Daily and weekly usage quotas that refresh automatically on a schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pro plan pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ideal project size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Small to medium codebases where you already know the structure and can target files manually&lt;/td&gt;
&lt;td&gt;Large, highly interconnected codebases that benefit from its RAG-based context engine and automatic semantic indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;In the next sections, you’ll build a resilient HTTP client in Python from scratch and then send the same prompts to both editors to compare their responses.&lt;/p&gt;
&lt;h2 id=&quot;getting-started-installation&quot;&gt;Getting Started: Installation&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#getting-started-installation&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Both editors ship as standalone desktop applications that closely match the VS Code experience. On first launch, they offer to import your local VS Code configuration, copying your keybindings, extensions, themes, and settings so your environment carries over with minimal setup.&lt;/p&gt;
&lt;p&gt;To follow the hands-on project later in this tutorial, you’ll also want Python 3.12 or later installed on your system. Beyond that, if you need a full VS Code baseline before starting, the &lt;a href=&quot;https://realpython.com/courses/python-development-visual-studio-code-setup-guide/&quot;&gt;Python Development in Visual Studio Code (Setup Guide)&lt;/a&gt; course covers the editor setup from scratch.&lt;/p&gt;
&lt;p&gt;Both Cursor and Windsurf offer free plans with enough model access to work through this comparison, though keep in mind that free-tier usage is limited and may run out under heavy use.&lt;/p&gt;
&lt;h3 id=&quot;installing-cursor&quot;&gt;Installing Cursor&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#installing-cursor&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Head to the &lt;a href=&quot;https://cursor.com/download&quot;&gt;Cursor download page&lt;/a&gt; and download the correct version for your system. During setup, Cursor offers to import your VS Code configuration, including extensions, keybindings, and themes, so your environment carries over with minimal setup.&lt;/p&gt;
&lt;p&gt;Once the editor opens, you’re ready to go. You don’t need to configure anything else yet.&lt;/p&gt;
&lt;p&gt;If Cursor is new to you, Real Python’s video course on &lt;a href=&quot;https://realpython.com/courses/tips-using-ai-coding-editor-cursor/&quot;&gt;Tips for Using the AI Coding Editor Cursor&lt;/a&gt; covers setup, &lt;em&gt;Agent&lt;/em&gt; mode, &lt;em&gt;Plan&lt;/em&gt; mode, and model selection in a practical context, making the comparisons later in this tutorial easier to follow.&lt;/p&gt;
&lt;h3 id=&quot;installing-windsurf&quot;&gt;Installing Windsurf&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#installing-windsurf&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Download Windsurf from the &lt;a href=&quot;https://windsurf.com/download&quot;&gt;Windsurf download page&lt;/a&gt; and run the installer. The VS Code profile import works identically to Cursor’s.&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/cursor-vs-windsurf-python/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/cursor-vs-windsurf-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, 10 Jun 2026 14:00:00 +0000</pubDate>
</item>
<item>
	<title>Python GUIs: How to Set Row Background Colors in a QTableView — Use Qt's BackgroundRole to color entire rows based on your data</title>
	<guid>https://www.pythonguis.com/faq/backgroundcolor-for-row-in-qtableview/</guid>
	<link>https://www.pythonguis.com/faq/backgroundcolor-for-row-in-qtableview/</link>
	<description>&lt;blockquote&gt;
&lt;p&gt;I have a QTableView table showing some data about connected devices. How can I highlight rows to give a visual indicator of the current status of the device?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you're working with a &lt;code&gt;QTableView&lt;/code&gt; and a custom model, it's common to want to highlight entire rows based on some condition in your data. For example, you might want to color a row blue when a device has a &lt;em&gt;connected&lt;/em&gt; status, or red when something has gone wrong.&lt;/p&gt;
&lt;h2 id=&quot;understanding-how-data-works&quot;&gt;Understanding How &lt;code&gt;data()&lt;/code&gt; Works&lt;/h2&gt;
&lt;p&gt;In Qt's &lt;a href=&quot;https://www.pythonguis.com/tutorials/modelview-architecture/&quot;&gt;Model/View architecture&lt;/a&gt;, the view calls your model's &lt;code&gt;data()&lt;/code&gt; method for &lt;em&gt;every cell&lt;/em&gt; in the table &amp;mdash; and for each cell, it asks about multiple &lt;strong&gt;roles&lt;/strong&gt;. One of those roles is &lt;code&gt;Qt.BackgroundRole&lt;/code&gt;, which tells the view what background color to use for that cell.&lt;/p&gt;
&lt;p&gt;The view asks for &lt;code&gt;Qt.BackgroundRole&lt;/code&gt; on every single cell, not just one column. So if your &lt;code&gt;data()&lt;/code&gt; method returns a color for &lt;code&gt;Qt.BackgroundRole&lt;/code&gt; based on the &lt;em&gt;row&lt;/em&gt; data (ignoring the column), the color will be applied to every cell in that row.&lt;/p&gt;
&lt;p&gt;Let's build a working example.&lt;/p&gt;
&lt;h2 id=&quot;a-complete-working-example&quot;&gt;A Complete Working Example&lt;/h2&gt;
&lt;p&gt;Here's a full example you can run directly. It creates a &lt;code&gt;QTableView&lt;/code&gt; with colored rows based on the &lt;code&gt;PRESENT_STATUS&lt;/code&gt; field in each row of data:&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 typing import Union

from PyQt6.QtCore import QAbstractTableModel, QModelIndex, Qt
from PyQt6.QtGui import QColor
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView


class TableModel(QAbstractTableModel):

    def __init__(self, data: Union[list, None] = None):
        super().__init__()
        self._data = data or []
        self._hdr = self._gen_hdr_data() if data else []
        self._base_color = {
            &quot;NewConnection&quot;: QColor(&quot;blue&quot;),
            &quot;Registered&quot;: QColor(&quot;green&quot;),
        }

    def _gen_hdr_data(self):
        &quot;&quot;&quot;Build a sorted list of all unique keys across all row dicts.&quot;&quot;&quot;
        all_keys = set()
        for d in self._data:
            all_keys.update(d.keys())
        return sorted(all_keys)

    def rowCount(self, parent=QModelIndex()):
        return len(self._data)

    def columnCount(self, parent=QModelIndex()):
        return len(self._hdr)

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole and orientation == Qt.Horizontal:
            return self._hdr[section]

    def data(self, index: QModelIndex, role: int):
        if not index.isValid():
            return None

        row_dict = self._data[index.row()]
        state = row_dict.get(&quot;PRESENT_STATUS&quot;, &quot;&quot;)

        if role == Qt.DisplayRole:
            col_key = self._hdr[index.column()]
            value = row_dict.get(col_key, &quot;&quot;)
            return str(value) if value else &quot;&quot;

        if role == Qt.BackgroundRole:
            color = self._base_color.get(state)
            if color:
                return color

        return None


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

        data = [
            {&quot;IP&quot;: &quot;192.168.1.10&quot;, &quot;PRESENT_STATUS&quot;: &quot;NewConnection&quot;},
            {&quot;IP&quot;: &quot;192.168.1.108&quot;, &quot;FORMER_STATUS&quot;: &quot;NewConnection&quot;,
             &quot;PRESENT_STATUS&quot;: &quot;Registered&quot;},
            {&quot;IP&quot;: &quot;192.168.1.50&quot;, &quot;PRESENT_STATUS&quot;: &quot;Unknown&quot;},
        ]

        self.table = QTableView()
        model = TableModel(data)
        self.table.setModel(model)
        self.setCentralWidget(self.table)


app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p class=&quot;admonition admonition-note&quot;&gt;&lt;span class=&quot;admonition-kind&quot;&gt;&lt;i class=&quot;fas fa-sticky-note&quot;&gt;&lt;/i&gt;&lt;/span&gt;  The method that Qt calls on the model is called &lt;code&gt;data&lt;/code&gt;, so in the example above, the list is stored as &lt;code&gt;self._data&lt;/code&gt; (with a leading underscore) to avoid this.&lt;/p&gt;
&lt;p&gt;Run this and you'll see three rows. The first row (&quot;NewConnection&quot;) has a blue background, the second row (&quot;Registered&quot;) has a green background, and the third row (&quot;Unknown&quot;) has no special coloring because it isn't in the &lt;code&gt;_base_color&lt;/code&gt; dictionary.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;QTableView with colored rows based on status values&quot; src=&quot;https://www.pythonguis.com/feeds/images/qtableview-row-background-colors.png&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-colors-are-set-on-rows&quot;&gt;How Colors are Set on Rows&lt;/h2&gt;
&lt;p&gt;To understand how the color is being set to the entire row, take a look at the  &lt;code&gt;Qt.BackgroundRole&lt;/code&gt; section of &lt;code&gt;data()&lt;/code&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;if role == Qt.BackgroundRole:
    color = self._base_color.get(state)
    if color:
        return color
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice that &lt;code&gt;index.column()&lt;/code&gt; isn't used here at all. The color decision is based entirely on the row's &lt;code&gt;PRESENT_STATUS&lt;/code&gt; value. Since the view calls &lt;code&gt;data()&lt;/code&gt; for &lt;em&gt;every cell&lt;/em&gt; in the row &amp;mdash; column 0, column 1, column 2, etc. &amp;mdash; and each call gets the same color back, the entire row ends up painted.&lt;/p&gt;
&lt;p&gt;If you &lt;em&gt;only&lt;/em&gt; wanted to color a specific column (say, just the status column), you would add a column check:&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;if role == Qt.BackgroundRole:
    # Only color the PRESENT_STATUS column
    if self._hdr[index.column()] == &quot;PRESENT_STATUS&quot;:
        color = self._base_color.get(state)
        if color:
            return color
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id=&quot;making-the-text-readable&quot;&gt;Making the Text Readable&lt;/h2&gt;
&lt;p&gt;One thing you'll notice with a dark background color like blue is that the default black text becomes hard to read. You can fix this by also handling &lt;code&gt;Qt.ForegroundRole&lt;/code&gt; and returning a light text color when the background is dark:&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;def data(self, index: QModelIndex, role: int):
    if not index.isValid():
        return None

    row_dict = self._data[index.row()]
    state = row_dict.get(&quot;PRESENT_STATUS&quot;, &quot;&quot;)

    if role == Qt.DisplayRole:
        col_key = self._hdr[index.column()]
        value = row_dict.get(col_key, &quot;&quot;)
        return str(value) if value else &quot;&quot;

    if role == Qt.BackgroundRole:
        color = self._base_color.get(state)
        if color:
            return color

    if role == Qt.ForegroundRole:
        # If this row has a background color, use white text.
        if state in self._base_color:
            return QColor(&quot;white&quot;)

    return None
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now blue and green rows will have white text, making everything easy to read.&lt;/p&gt;
&lt;h2 id=&quot;updating-colors-dynamically&quot;&gt;Updating Colors Dynamically&lt;/h2&gt;
&lt;p&gt;If your data changes at runtime &amp;mdash; for example, a device's status changes from &lt;code&gt;&quot;NewConnection&quot;&lt;/code&gt; to &lt;code&gt;&quot;Registered&quot;&lt;/code&gt; &amp;mdash; you need to tell the view that something has changed so it repaints. You do this by emitting the &lt;code&gt;dataChanged&lt;/code&gt; signal:&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;def update_status(self, row, new_status):
    self._data[row][&quot;PRESENT_STATUS&quot;] = new_status
    # Emit dataChanged for the entire row.
    top_left = self.index(row, 0)
    bottom_right = self.index(row, self.columnCount() - 1)
    self.dataChanged.emit(top_left, bottom_right)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This tells the view to re-query &lt;code&gt;data()&lt;/code&gt; for every cell in that row, which picks up both the new display text and the new background color. For a deeper look at how signals work to keep your model and view in sync, see &lt;a href=&quot;https://www.pythonguis.com/tutorials/pyqt-signals-slots-events/&quot;&gt;Signals, Slots &amp;amp; Events&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;
&lt;p&gt;Once you understand how the model's &lt;code&gt;data()&lt;/code&gt; method works, coloring entire rows in a &lt;code&gt;QTableView&lt;/code&gt; is relatively straightforward. The view asks for each role on every cell, so returning a color from &lt;code&gt;Qt.BackgroundRole&lt;/code&gt; based on row-level data &amp;mdash; without filtering by column &amp;mdash; naturally paints the whole row. Pair that with &lt;code&gt;Qt.ForegroundRole&lt;/code&gt; for readable text, and you've got a clean, data-driven way to highlight rows in your table.&lt;/p&gt;
&lt;p&gt;To learn more about using &lt;code&gt;QTableView&lt;/code&gt; with custom models and data from numpy or pandas, see the &lt;a href=&quot;https://www.pythonguis.com/tutorials/qtableview-modelviews-numpy-pandas/&quot;&gt;QTableView with numpy and pandas tutorial&lt;/a&gt;. If you want to add sorting and filtering to your table, take a look at &lt;a href=&quot;https://www.pythonguis.com/tutorials/pyqt6-modelview-sort-filter-tables/&quot;&gt;Sorting and Filtering Tables&lt;/a&gt;.&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, 10 Jun 2026 06:00:00 +0000</pubDate>
</item>
<item>
	<title>Python Insider: Python 3.14.6 and 3.13.14 are now available!</title>
	<guid>https://blog.python.org/2026/06/python-3146-31314/</guid>
	<link>https://blog.python.org/2026/06/python-3146-31314/</link>
	<description>A pair of bug fix releases await your upgrade.</description>
	<pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Seth Michael Larson: Are insecure code completions a vulnerability?</title>
	<guid>https://sethmlarson.dev/are-insecure-code-completions-a-vulnerability?utm_campaign=rss</guid>
	<link>https://sethmlarson.dev/are-insecure-code-completions-a-vulnerability?utm_campaign=rss</link>
	<description>&lt;p&gt;Three months ago I saw that PyCharm shipped with a
“&lt;a href=&quot;https://www.jetbrains.com/help/pycharm/full-line-code-completion.html&quot;&gt;Full Line Completion&lt;/a&gt;” plugin that “uses a local deep
learning model to suggest entire lines of code”. These
suggestions manifest as whole-line suggestions after
you start typing and can be accepted with &lt;code&gt;Tab&lt;/code&gt;. Essentially
auto-complete for entire lines.&lt;/p&gt;

&lt;p&gt;I decide to test this functionality. I started by
writing &lt;code&gt;import urllib3&lt;/code&gt;, created a new line,
and then typed &lt;code&gt;u&lt;/code&gt; and received a suggested completion for the line
marked below with a 
&lt;span&gt;dashed border&lt;/span&gt;.
I was not impressed by the result:&lt;/p&gt;

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

&lt;div class=&quot;codehilite&quot;&gt;
&lt;pre&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;urllib3&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span&gt;&lt;span class=&quot;n&quot;&gt;rllib3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;disable_warnings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;urllib3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exceptions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InsecureRequestWarning&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Accepting this line would mean that any insecure
requests made with &lt;code&gt;urllib3&lt;/code&gt; would not result in a user-visible warning.
I didn't accept this suggestion and then began to instantiate a
&lt;code&gt;urllib3.PoolManager&lt;/code&gt; and what I feared would come next was confirmed:&lt;/p&gt;

&lt;div class=&quot;codehilite&quot;&gt;
&lt;pre&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;urllib3&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;urllib3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PoolManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
&lt;span&gt;    &lt;span class=&quot;n&quot;&gt;cert_reqs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'CERT_NONE'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The suggestion offered to disable certificate verification (&lt;a href=&quot;https://docs.python.org/3/library/ssl.html#ssl.CERT_NONE&quot;&gt;&lt;code&gt;CERT_NONE&lt;/code&gt;&lt;/a&gt;) which
would make every request made by the &lt;code&gt;PoolManager&lt;/code&gt; susceptible to
monster-in-the-middle (MITM) attacks. Accepting this code as-is would
mean the program I am writing has a severe vulnerability. If I
had accepted the prior suggestion too, then &lt;code&gt;urllib3&lt;/code&gt; would
have no chance to warn the user about this mistake prior
to productionizing this code.&lt;/p&gt;

&lt;p&gt;Clearly &lt;em&gt;something&lt;/em&gt; insecure is going on here, but for a CVE
to be assigned we have to decide which software component is
vulnerable. Does this behavior warrant a CVE at all? I am not sure
which is unfortunate, without a security-angle to a bug
report companies are less likely to prioritize reports.&lt;/p&gt;

&lt;p&gt;I reported this behavior to JetBrains for “Full Line Code Completion” v253.29346.142
and clearly their support staff weren't certain whether this defect
was a security vulnerability or not either. When I asked to
publish a blog post about this behavior after they confirmed
this report wasn’t a “direct security vulnerability” (which
I agree with) but then was asked not to publicize my report and referred to
PyCharm’s &lt;a href=&quot;https://www.jetbrains.com/legal/docs/terms/coordinated-disclosure/&quot;&gt;Coordinated Disclosure Policy&lt;/a&gt;
so... which is it? Security vulnerability or not?&lt;/p&gt;

&lt;p&gt;I ended up waiting the 90 days anyway and I didn't hear
back with any substantive update from the development team. I double-checked again
today using “Full Line Code Completion” v261.24374.152
and the behavior is identical, suggesting the same
insecure code for both contexts. &lt;/p&gt;

&lt;p&gt;This isn’t meant to be a specific dig at PyCharm or JetBrains,
I have no-doubt that examples like this exist in every code generation
model available. I don’t think using CVEs for this purpose is
appropriate or helpful for users, either. But not prioritizing and addressing this
behavior at the source means more work to mitigate
the potential for insecure code to be accepted by users who are trusting
what is offered to them by their IDE.&lt;/p&gt;

&lt;p&gt;What do you think? I am interested in knowing your thoughts
about this specific class of issue with code generation models.&lt;/p&gt;
&lt;br /&gt;&lt;hr /&gt;&lt;p&gt;Thanks for reading ♥ I would love to hear your thoughts! Contact me via &lt;a href=&quot;https://mastodon.social/@sethmlarson&quot;&gt;Mastodon&lt;/a&gt;, &lt;a href=&quot;https://bsky.app/profile/sethmlarson.dev&quot;&gt;Bluesky&lt;/a&gt;, or &lt;a href=&quot;mailto:sethmichaellarson@gmail.com&quot;&gt;email&lt;/a&gt;. Browse the &lt;a href=&quot;https://sethmlarson.dev/&quot;&gt;blog archive&lt;/a&gt;. Check out my &lt;a href=&quot;https://sethmlarson.dev/blogroll&quot;&gt;blogroll&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;</description>
	<pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Armin Ronacher: Gaslighting Openness</title>
	<guid>https://lucumr.pocoo.org/2026/6/10/gaslighting/</guid>
	<link>https://lucumr.pocoo.org/2026/6/10/gaslighting/</link>
	<description>&lt;p&gt;I have been a staunch supporter of Open Source for a long time, including
&lt;a href=&quot;https://lucumr.pocoo.org/2023/11/19/cathedral-and-bazaaar-licensing/&quot;&gt;experiments&lt;/a&gt;
&lt;a href=&quot;https://lucumr.pocoo.org/2024/9/23/fsl-agpl-open-source-businesses/&quot;&gt;in&lt;/a&gt;
&lt;a href=&quot;https://lucumr.pocoo.org/2024/9/19/open-source-tax/&quot;&gt;funding&lt;/a&gt; &lt;a href=&quot;https://lucumr.pocoo.org/2024/10/14/mixing-oss-and-money/&quot;&gt;it&lt;/a&gt;.
I&amp;#8217;m a true believer in the idea that Open Source always wins in the long run,
but not automatically and not quickly.  Right now it is being stressed by AI
slop, shifting contributor dynamics, the falling cost of producing code, and
large companies learning to close doors behind them.&lt;/p&gt;
&lt;p&gt;A lot of that battle today is manipulation of the narrative.  Opinion makers on
social media and in business circles increasingly frame access as
irresponsibility.  That is why the EU&amp;#8217;s DMA matters, even if many people
(including myself) reflexively hate EU regulation.  Apple&amp;#8217;s fight over &lt;a href=&quot;https://www.apple.com/newsroom/2026/06/due-to-dma-siri-ai-delayed-in-eu-for-ios-27-and-ipados-27/&quot;&gt;delayed
AI features in
Europe&lt;/a&gt;
is not about Brussels being annoying: it is about whether users can access their
own devices and data.  The phone is yours, the data is yours, yet Apple decides
who may reach it and takes the agency away from you and then tries to make that
sound like it is in your interest (supposedly it&amp;#8217;s for your safety and security).&lt;/p&gt;
&lt;p&gt;The closer you get to the core of AI, the more this shows up.  Anthropic has
every financial incentive to restrict what people can do with &lt;a href=&quot;https://www.anthropic.com/news/claude-fable-5-mythos-5&quot;&gt;Mythos and
Fable&lt;/a&gt;, and they wrap
those restrictions in safety and (national) security language.  Some
restrictions may be defensible, but not all of them are.  They trained their
models on public works, then block Open Source attempts to learn from and
distill these systems.&lt;/p&gt;
&lt;p&gt;Disliking the EU, China, or any other large government should not make us forget
that true democratized access to technology including AI is in all our interest.
Some temporary product pain, including delayed Apple AI features, will be worth
paying if it keeps gates open.  We should not let companies own the narrative
that preventing access is in our interest, particularly not as Europeans where
the odds are already stacked against us by our underdeveloped capital markets,
brain drain and internal fighting.&lt;/p&gt;</description>
	<pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>PyCoder’s Weekly: Issue #738: sleep(), Polars Workflows, Iterators, and More (2026-06-09)</title>
	<guid>https://pycoders.com/issues/738</guid>
	<link>https://pycoders.com/issues/738</link>
	<description>&lt;p&gt; &lt;span&gt;#738 – JUNE 9, 2026&lt;/span&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/issues/738/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/16589/feed&quot; target=&quot;_blank&quot;&gt;Python &lt;code&gt;sleep()&lt;/code&gt;: How to Add Time Delays to Your Code&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Learn how to use Python&amp;rsquo;s sleep() function to add time delays and pause your code with time.sleep(), decorators, threads, and asyncio.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16589/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/16590/feed&quot; target=&quot;_blank&quot;&gt;Libraries for Your Python Polars Workflows&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Four excellent libraries for your data science workflow with support for Polars DataFrames&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16590/feed&quot; target=&quot;_blank&quot;&gt;ISABELLA VELÁSQUEZ&lt;/a&gt; • Shared by &lt;a href=&quot;https://pycoders.com/link/16584/feed&quot; target=&quot;_blank&quot;&gt;Isabella Velásquez&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/16591/feed&quot; target=&quot;_blank&quot;&gt;B2B AI Agent Auth Support&lt;/a&gt;&lt;/h3&gt; &lt;a href=&quot;https://pycoders.com/link/16591/feed&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://cdn.pycoders.com/012e0a1cbc39d888c748f46d3b3a4e1a&quot; alt=&quot;alt&quot; /&gt;&lt;/a&gt; &lt;p&gt; Your users are asking if they can connect their AI agent to your product, but you want to make sure they can do it safely and securely. &lt;a href=&quot;https://pycoders.com/link/16591/feed&quot; target=&quot;_blank&quot;&gt;PropelAuth makes that possible →&lt;/a&gt;&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16591/feed&quot; target=&quot;_blank&quot;&gt;PROPELAUTH&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/16569/feed&quot; target=&quot;_blank&quot;&gt;Down the Iterator Rabbit Hole&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Following the trail when you have a chain of iterators&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16569/feed&quot; target=&quot;_blank&quot;&gt;STEPHEN GRUPPETTA&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/16585/feed&quot; target=&quot;_blank&quot;&gt;PEP 833: Freezing the HTML Simple Repository API (Accepted)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16585/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/16563/feed&quot; target=&quot;_blank&quot;&gt;PEP 800: Solid Bases in the Type System (Final)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16563/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/16574/feed&quot; target=&quot;_blank&quot;&gt;PEP 798: Unpacking in Comprehensions (Final)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16574/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/16575/feed&quot; target=&quot;_blank&quot;&gt;Python 3.15.0b2 Released&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16575/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/16560/feed&quot; target=&quot;_blank&quot;&gt;Django Security Releases Issued: 6.0.6 and 5.2.15&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16560/feed&quot; target=&quot;_blank&quot;&gt;DJANGO SOFTWARE FOUNDATION&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;h2&gt;Articles &amp;amp; Tutorials&lt;/h2&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16567/feed&quot; target=&quot;_blank&quot;&gt;olmOCR-2 vs PaddleOCR-VL: Which Extracts PDF Tables Better?&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Compare olmOCR-2 and PaddleOCR-VL on a real arXiv PDF with dense technical tables. This article walks through a Python-based OCR workflow, then evaluates how each model handles table detection, runtime, numeric accuracy, merged cells, and multi-tier headers.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16567/feed&quot; target=&quot;_blank&quot;&gt;KHUYEN TRAN&lt;/a&gt; • Shared by &lt;a href=&quot;https://pycoders.com/link/16577/feed&quot; target=&quot;_blank&quot;&gt;Khuyen Tran&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/16568/feed&quot; target=&quot;_blank&quot;&gt;Using Typing in Python Leads to Different Sorts of Code&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Chris has been moving lots of code from Python 2 to 3 and experimenting with more rigid type hints as he goes along. He&amp;rsquo;s found that keeping the type checker happy makes him write code in a different way, almost like writing in a second language.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16568/feed&quot; target=&quot;_blank&quot;&gt;CHRIS SIEBENMANN&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/16578/feed&quot; target=&quot;_blank&quot;&gt;Django: Introducing Django-Integrity-Policy&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Recently, browsers have added support for the new Integrity-Policy response header (Firefox 145+, Chrome 138+). Adam quickly went to work to build a library that enables your Django project to take advantage of the feature.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16578/feed&quot; target=&quot;_blank&quot;&gt;ADAM JOHNSON&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/16564/feed&quot; target=&quot;_blank&quot;&gt;PSF Strategic Plan 2026 Draft&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. The first draft has been released and they&amp;rsquo;re looking for community feedback.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16564/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/16558/feed&quot; target=&quot;_blank&quot;&gt;EuroPython 2026 Language Summit Talks&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This year&amp;rsquo;s EuroPython includes a Python Language Summit. This post highlights the talks scheduled for it, including adding Rust capabilities to CPython, an update on incremental garbage collection, and more.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16558/feed&quot; target=&quot;_blank&quot;&gt;EUROPYTHON.EU&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/16587/feed&quot; target=&quot;_blank&quot;&gt;Free Threading Internals: Reference Counting&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; This article describes how the lifetime of Python objects are tracked using reference counting and how that is effected by the changes brought about by removing the GIL.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16587/feed&quot; target=&quot;_blank&quot;&gt;VICTOR STINNER&lt;/a&gt;&lt;/span&gt; &lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16580/feed&quot; target=&quot;_blank&quot;&gt;Keep Your Developer Instincts When AI Writes the Code&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; The promise was less friction. The cost, it turns out, is instinct, a high price to pay. Bob&amp;rsquo;s answer: add deliberate practice to your routine, and keep the struggle.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16580/feed&quot; target=&quot;_blank&quot;&gt;BOB BELDERBOS&lt;/a&gt; • Shared by &lt;a href=&quot;https://pycoders.com/link/16579/feed&quot; target=&quot;_blank&quot;&gt;Bob Belderbos&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/16588/feed&quot; target=&quot;_blank&quot;&gt;How to Use GitHub Copilot Code Review in Pull Requests&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Learn how to use GitHub Copilot code review on pull requests for AI-assisted feedback, one-click fixes, and project-specific custom instructions.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16588/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/16582/feed&quot; target=&quot;_blank&quot;&gt;Quiz: How to Use GitHub Copilot Code Review in Pull Requests&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16582/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/16581/feed&quot; target=&quot;_blank&quot;&gt;Parsing XML EXIF From &lt;code&gt;.avif&lt;/code&gt; Files (Plus a Rant)&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; The .avif format tends to result in smaller files, but the EXIF strippers that Andrew was using didn&amp;rsquo;t support the format, so he wrote his own.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16581/feed&quot; target=&quot;_blank&quot;&gt;ANDREW STEPHENS&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/16572/feed&quot; target=&quot;_blank&quot;&gt;Structuring Your Python Script&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; Master Python script structure with best practices for shebangs, ordered imports, formatting with Ruff, constants, and a clean entry point.&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16572/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;h2&gt;Projects &amp;amp; Code&lt;/h2&gt; &lt;div&gt; &lt;h3&gt;&lt;a href=&quot;https://pycoders.com/link/16561/feed&quot; target=&quot;_blank&quot;&gt;spoof: A Simple HTTP Server for Test Environments&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16561/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/LEXSCA&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/16559/feed&quot; target=&quot;_blank&quot;&gt;django-upgrade: Automatically Upgrade Your Django Projects&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16559/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/ADAMCHAINZ&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/16576/feed&quot; target=&quot;_blank&quot;&gt;bocpy: Behavior-Oriented Concurrency in Python&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16576/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/16571/feed&quot; target=&quot;_blank&quot;&gt;cohesion: A Tool for Measuring Python Class Cohesion&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16571/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/MSCHWAGER&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/16570/feed&quot; target=&quot;_blank&quot;&gt;pypistats.org: PyPI Downloads Analytics Dashboard&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16570/feed&quot; target=&quot;_blank&quot;&gt;GITHUB.COM/PSF&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/16566/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; June 10, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16566/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/16562/feed&quot; target=&quot;_blank&quot;&gt;Python Atlanta&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; June 11 to June 12, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16562/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/16565/feed&quot; target=&quot;_blank&quot;&gt;PyDelhi User Group Meetup&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; June 13, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16565/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/16573/feed&quot; target=&quot;_blank&quot;&gt;DFW Pythoneers 2nd Saturday Teaching Meeting&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; June 13, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16573/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/16586/feed&quot; target=&quot;_blank&quot;&gt;DjangoCologne&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; June 16, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16586/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/16583/feed&quot; target=&quot;_blank&quot;&gt;PyCon Singapore 2026&lt;/a&gt;&lt;/h3&gt; &lt;p&gt; June 19 to June 22, 2026&lt;br /&gt; &lt;span&gt;&lt;a href=&quot;https://pycoders.com/link/16583/feed&quot; target=&quot;_blank&quot;&gt;PYCON.SG&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 #738.&lt;br /&gt;&lt;a href=&quot;https://pycoders.com/issues/738/feed&quot;&gt;View in Browser »&lt;/a&gt;&lt;/p&gt; &lt;img src=&quot;https://pycoders.com/issues/738/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, 09 Jun 2026 19:30:00 +0000</pubDate>
</item>
<item>
	<title>Python Docs Editorial Board: Meeting Minutes: Jun 9, 2026</title>
	<guid>https://python.github.io/editorial-board/updates/2026-06-09/</guid>
	<link>https://python.github.io/editorial-board/updates/2026-06-09/</link>
	<description>Meeting Minutes from Python Docs Editorial Board: Jun 9, 2026</description>
	<pubDate>Tue, 09 Jun 2026 19:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Accessing Multiple AI Models With the OpenRouter API</title>
	<guid>https://realpython.com/courses/multiple-ai-models-openrouter-api/</guid>
	<link>https://realpython.com/courses/multiple-ai-models-openrouter-api/</link>
	<description>&lt;p&gt;One of the quickest ways to call multiple AI models from a single Python script is to use OpenRouter&amp;rsquo;s API, which acts as a unified routing layer between your code and multiple AI providers. By the end of this course, you&amp;rsquo;ll be able to access models from several providers through one unified API.&lt;/p&gt;
&lt;p&gt;This convenience matters because the AI ecosystem is highly fragmented: each provider exposes its own API, authentication scheme, rate limits, and model lineup. Working with multiple providers often requires additional setup and integration effort, especially when you want to experiment with different models, compare outputs, or evaluate trade-offs for a specific task.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://openrouter.ai/&quot;&gt;OpenRouter&lt;/a&gt; gives you access to thousands of models from leading providers like OpenAI, Anthropic, Mistral, Google, and Meta. You can switch between them without changing your application code.&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, 09 Jun 2026 14:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Quiz: Embeddings and Vector Databases With ChromaDB</title>
	<guid>https://realpython.com/quizzes/chromadb-vector-database/</guid>
	<link>https://realpython.com/quizzes/chromadb-vector-database/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of &lt;a href=&quot;https://realpython.com/chromadb-vector-database/&quot;&gt;Embeddings and Vector Databases With ChromaDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit key concepts like vectors, cosine similarity, word and text embeddings, ChromaDB collections, metadata filtering, and retrieval-augmented generation (RAG).&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, 09 Jun 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Quiz: Accessing Multiple AI Models With the OpenRouter API</title>
	<guid>https://realpython.com/quizzes/multiple-ai-models-openrouter-api/</guid>
	<link>https://realpython.com/quizzes/multiple-ai-models-openrouter-api/</link>
	<description>&lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/courses/multiple-ai-models-openrouter-api/&quot;&gt;Accessing Multiple AI Models With the OpenRouter API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how OpenRouter provides a unified routing layer, how to call AI models from a single Python script, how to switch between intelligent routing and a specific model, how to prioritize providers, and how to add model fallbacks for reliability.&lt;/p&gt;
&lt;p&gt;It also reinforces how to weigh trade-offs like cost, latency, and quality when you choose a model for your use case.&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, 09 Jun 2026 12:00:00 +0000</pubDate>
</item>
<item>
	<title>Python Bytes: #483 Thanks Brian</title>
	<guid>https://pythonbytes.fm/episodes/show/483/thanks-brian</guid>
	<link>https://pythonbytes.fm/episodes/show/483/thanks-brian</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;Vulnerability and malware checks in uv&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://alexwlchan.net/2026/python-http-with-the-stdlib/?featured_on=pythonbytes&quot;&amp;gt;HTTP GET requests with the Python standard library&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;Millions of AI agents imperiled by critical vulnerability in open source package&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://github.com/Mergifyio/alembic-git-revisions?featured_on=pythonbytes&quot;&amp;gt;alembic-git-revisions&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=WIykgbceuVg' style='font-weight: bold;'data-umami-event=&quot;Livestream-Past&quot; data-umami-event-episode=&quot;483&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;&amp;lt;strong&amp;gt;Goodbye and Thanks Brian&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Thanks Calvin for being part of this and future episodes! Also new time for the live show. Thanks Brian for all the hard work over the years.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Calvin #1: Vulnerability and malware checks in uv&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;release just yesterday by Astral https://astral.sh/blog/uv-audit&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;uv audit&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt; scans dependencies for known vulnerabilities and abandoned packages via the OSV database — runs 4–10x faster than &amp;lt;code&amp;gt;pip-audit&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Malware check&amp;lt;/strong&amp;gt; runs on every install/sync, catching actively malicious packages (credential stealers, etc.) before they execute — including ones PyPI quarantined but lockfiles can still reference&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Enable malware scanning with &amp;lt;code&amp;gt;UV_MALWARE_CHECK=1&amp;lt;/code&amp;gt; — it's opt-in and in preview&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Future roadmap includes a resolver that steers toward vulnerability-free versions and install-time warnings scoped to newly added deps only&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Michael #2: &amp;lt;a href=&quot;https://alexwlchan.net/2026/python-http-with-the-stdlib/?featured_on=pythonbytes&quot;&amp;gt;HTTP GET requests with the Python standard library&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;If you’re doing HTTP in Python, you’re probably using one of three popular libraries: &amp;lt;a href=&quot;https://requests.readthedocs.io/en/latest/?featured_on=pythonbytes&quot;&amp;gt;requests&amp;lt;/a&amp;gt;, &amp;lt;a href=&quot;https://github.com/encode/httpx?featured_on=pythonbytes&quot;&amp;gt;httpx&amp;lt;/a&amp;gt;, or &amp;lt;a href=&quot;https://github.com/urllib3/urllib3?featured_on=pythonbytes&quot;&amp;gt;urllib3&amp;lt;/a&amp;gt;.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;There have been &amp;lt;a href=&quot;https://pythonbytes.fm/episodes/show/476/common-themes&quot;&amp;gt;issues with httpx lately&amp;lt;/a&amp;gt;.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&quot;https://github.com/jawah/niquests?featured_on=pythonbytes&quot;&amp;gt;Niquest&amp;lt;/a&amp;gt; is another option: Drop-in replacement for Requests. Automatic HTTP/1.1, HTTP/2, and HTTP/3. WebSocket, and SSE included.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;But maybe less is more, especially in the age of agentic AI&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;A good candidate needs two things to be true at once, not one: the &amp;lt;em&amp;gt;used surface&amp;lt;/em&amp;gt; is small, and the &amp;lt;em&amp;gt;behavior behind that surface&amp;lt;/em&amp;gt; is shallow.&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Calvin #3: Millions of AI agents imperiled by critical vulnerability in open source package&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;&quot;BadHost&quot; (CVE-2026-48710)&amp;lt;/strong&amp;gt; is a critical vulnerability in Starlette — the ASGI framework underlying FastAPI — with 325 million weekly downloads; also affects vLLM, LiteLLM, and most MCP server tooling&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;The exploit is trivial&amp;lt;/strong&amp;gt;: injecting a single character into an HTTP Host header bypasses path-based authentication, and can lead to credential theft, SSRF, and in some cases remote code execution&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;MCP servers are a prime target&amp;lt;/strong&amp;gt; since they store credentials for external services (email, databases, cloud accounts) — exposed data in the wild includes biopharma clinical trial DBs, full mailboxes, HR/PII pipelines, and AWS topology&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Fix is available&amp;lt;/strong&amp;gt; — patch to Starlette 1.0.1 immediately; use the free scanner at mcp-scan.nemesis.services to check if your servers are still running a vulnerable version&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Open source sustainability footnote&amp;lt;/strong&amp;gt;: the maintainer triages near-daily security reports solo, in his free time — most are AI-generated noise, and real ones like this still compete for the same evenings and weekends&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://github.com/Mergifyio/alembic-git-revisions?featured_on=pythonbytes&quot;&amp;gt;alembic-git-revisions&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;By Julien Danjou from &amp;lt;a href=&quot;https://mergify.com/?featured_on=pythonbytes&quot;&amp;gt;Mergify&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Automatic &amp;lt;a href=&quot;https://alembic.sqlalchemy.org/?featured_on=pythonbytes&quot;&amp;gt;Alembic&amp;lt;/a&amp;gt; migration chaining based on git commit history. No more &amp;lt;code&amp;gt;Multiple head revisions are present for given argument 'head'&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;See &amp;lt;a href=&quot;https://julien.danjou.info/blog/fixing-alembics-multiple-heads-problem-with-git/?featured_on=pythonbytes&quot;&amp;gt;the introductory article&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;Caused by two migrations landed with the same &amp;lt;code&amp;gt;down_revision&amp;lt;/code&amp;gt;, and Alembic doesn’t know which one comes first. The fix is always the same: someone manually edits the migration file to re-chain the revisions.&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;The insight: git already knows the order&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

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

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

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;GNU &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; can do pattern matching in the target. Not new at all, mentioned in the 1994-era docs. &amp;lt;code&amp;gt;just&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;task&amp;lt;/code&amp;gt; don’t have this super power on the target name yet.
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;train-%:
        uv run ./train.py $* --save-hyper-params --overwrite $(TRAIN_ARGS)
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

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

&amp;lt;ul&amp;gt;
&amp;lt;li&amp;gt;Updated my HTTP client using packages from httpx to &amp;lt;a href=&quot;https://github.com/pydantic/httpx2?featured_on=pythonbytes&quot;&amp;gt;httpx2&amp;lt;/a&amp;gt;: &amp;lt;a href=&quot;https://pypi.org/project/listmonk/?featured_on=pythonbytes&quot;&amp;gt;listmonk&amp;lt;/a&amp;gt;, &amp;lt;a href=&quot;https://pypi.org/project/umami-analytics/?featured_on=pythonbytes&quot;&amp;gt;umami&amp;lt;/a&amp;gt;, and &amp;lt;a href=&quot;https://pypi.org/project/memberful/?featured_on=pythonbytes&quot;&amp;gt;memberful&amp;lt;/a&amp;gt;. For motivation, see &amp;lt;a href=&quot;https://www.reddit.com/r/Python/comments/1rl5kuq/anyone_know_whats_up_with_httpx/?featured_on=pythonbytes&quot;&amp;gt;this reddit thread&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;Joke: &amp;lt;a href=&quot;https://x.com/PR0GRAMMERHUM0R/status/2061508112083714478?featured_on=pythonbytes&quot;&amp;gt;Accurate&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;</description>
	<pubDate>Tue, 09 Jun 2026 08:00:00 +0000</pubDate>
</item>
<item>
	<title>Hynek Schlawack: How to Ditch Codecov for Python Projects</title>
	<guid>https://hynek.me/articles/ditch-codecov-python/</guid>
	<link>https://hynek.me/articles/ditch-codecov-python/</link>
	<description>&lt;p&gt;Codecov&amp;rsquo;s unreliability breaking CI on my open source projects has been a constant source of frustration for me for years. I have found a way to enforce coverage over a whole GitHub Actions build matrix that doesn&amp;rsquo;t rely on third-party services.&lt;/p&gt;</description>
	<pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Real Python: Python 3.15 Hits Feature Freeze and Other News for June 2026</title>
	<guid>https://realpython.com/python-news-june-2026/</guid>
	<link>https://realpython.com/python-news-june-2026/</link>
	<description>&lt;div&gt;&lt;p&gt;While the Northern Hemisphere warms up for summer, Python 3.15 went the other way with its &lt;strong&gt;beta 1 feature freeze&lt;/strong&gt; 🥶. Since May 7, the list of what will be included in the next release is final. That list includes a brand-new &lt;strong&gt;&lt;code&gt;sentinel&lt;/code&gt; built-in&lt;/strong&gt; that finally standardizes a pattern Python developers have been hand-rolling for decades.&lt;/p&gt;
&lt;p&gt;And while AI kept writing code, buggy or not, developers also directed it to &lt;em&gt;look&lt;/em&gt; for bugs in code that had been sitting untouched for years. The results were hundreds of bug fixes in Python’s C extensions and in Firefox. Meanwhile, in a quieter corner of the ecosystem, Pydantic forked &lt;code&gt;httpx&lt;/code&gt;, kicking off one of the more interesting governance stories of the year.&lt;/p&gt;
&lt;p&gt;Time to dig into the &lt;strong&gt;Python news&lt;/strong&gt; from the past month!&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot;&gt;
&lt;p&gt;&lt;strong&gt;Join Now:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/newsletter/&quot; class=&quot;alert-link&quot;&gt;Click here to join the Real Python Newsletter&lt;/a&gt; and you’ll never miss another Python tutorial, course, or news update.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;python-releases-and-pep-highlights&quot;&gt;Python Releases and PEP Highlights&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#python-releases-and-pep-highlights&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The 3.15 release of &lt;a href=&quot;https://realpython.com/cpython-source-code-guide/&quot;&gt;CPython&lt;/a&gt; crossed from alpha into beta, which means its feature set is now frozen, and the &lt;a href=&quot;https://realpython.com/ref/glossary/python-steering-council/&quot; class=&quot;ref-link&quot;&gt;Steering Council&lt;/a&gt; cleared out a backlog of proposals before the gate closed. Two of those changes will touch the code you write every day.&lt;/p&gt;
&lt;h3 id=&quot;beta-1-marks-the-315-feature-freeze&quot;&gt;Beta 1 Marks the 3.15 Feature Freeze&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#beta-1-marks-the-315-feature-freeze&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Last month, &lt;a href=&quot;https://realpython.com/python-news-may-2026/#python-3150-alpha-8-final-alpha-before-beta-freeze&quot;&gt;the eighth and final alpha&lt;/a&gt; rolled out as the runway to the beta phase. With &lt;a href=&quot;https://www.python.org/downloads/release/python-3150b1/&quot;&gt;Python 3.15.0b1&lt;/a&gt; on May 7 came the &lt;strong&gt;feature freeze&lt;/strong&gt;, which means that from here until the final release of 3.15, the core team works only on bug fixes and polishing.&lt;/p&gt;
&lt;p&gt;That makes the beta releases a good moment to step back and look at the headline features of 3.15, which are now locked:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Explicit lazy imports&lt;/strong&gt; (&lt;a href=&quot;https://realpython.com/python-news-december-2025/#pep-810-accepted-explicit-lazy-imports&quot;&gt;PEP 810&lt;/a&gt;) for faster startup&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;frozendict&lt;/code&gt; built-in&lt;/strong&gt; (&lt;a href=&quot;https://realpython.com/python-news-march-2026/#pep-814-accepted-frozendict-joins-the-built-ins&quot;&gt;PEP 814&lt;/a&gt;) for immutable mappings&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;sentinel&lt;/code&gt; built-in&lt;/strong&gt; (&lt;a href=&quot;https://peps.python.org/pep-0661/&quot;&gt;PEP 661&lt;/a&gt;), which you’ll dig into &lt;a href=&quot;https://realpython.com/atom.xml#a-built-in-sentinel-lands-in-python-315&quot;&gt;below&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unpacking in comprehensions&lt;/strong&gt; (&lt;a href=&quot;https://realpython.com/python-news-march-2026/#python-3150-alpha-6-comprehension-unpacking-and-more&quot;&gt;PEP 798&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UTF-8 as the default &lt;a href=&quot;https://realpython.com/python-encodings-guide/&quot;&gt;encoding&lt;/a&gt;&lt;/strong&gt; (&lt;a href=&quot;https://peps.python.org/pep-0686/&quot;&gt;PEP 686&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A stable ABI for &lt;a href=&quot;https://realpython.com/python-news-may-2026/#pep-803-accepted-stable-abi-goes-free-threaded&quot;&gt;free-threaded builds&lt;/a&gt; (&lt;a href=&quot;https://peps.python.org/pep-0803/&quot;&gt;PEP 803&lt;/a&gt;), plus C-API modernization (PEPs &lt;a href=&quot;https://peps.python.org/pep-0820/&quot;&gt;820&lt;/a&gt; and &lt;a href=&quot;https://peps.python.org/pep-0793/&quot;&gt;793&lt;/a&gt;) that should make it easier to write C extensions that work across Python versions&lt;/li&gt;
&lt;li&gt;A new &lt;strong&gt;sampling profiler&lt;/strong&gt; in the &lt;a href=&quot;https://realpython.com/ref/glossary/standard-library/&quot; class=&quot;ref-link&quot;&gt;standard library&lt;/a&gt; (&lt;a href=&quot;https://peps.python.org/pep-0799/&quot;&gt;PEP 799&lt;/a&gt;) for low-overhead &lt;a href=&quot;https://realpython.com/python-profiling/&quot;&gt;profiling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://realpython.com/ref/glossary/jit-compiler/&quot; class=&quot;ref-link&quot;&gt;JIT compiler&lt;/a&gt; also gets faster, with the beta announcement citing an 8–9 percent geometric-mean improvement on x86-64 Linux. If you’ve been putting off testing your code against 3.15, then now is the time to get started! The &lt;a href=&quot;https://realpython.com/ref/glossary/api/&quot; class=&quot;ref-link&quot;&gt;API&lt;/a&gt; surface won’t shift under you anymore, and your feedback will help catch regressions before the release candidate phase.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Beta builds are for testing, not production. &lt;a href=&quot;https://realpython.com/python-pre-release/&quot;&gt;Install the pre-release version&lt;/a&gt;, run your test suite against 3.15, and report anything that breaks while there’s still time to fix it before the release candidate.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The first round of improvements already landed with &lt;a href=&quot;https://www.python.org/downloads/release/python-3150b2/&quot;&gt;beta 2&lt;/a&gt; on June 2, and the next big checkpoint is the &lt;a href=&quot;https://realpython.com/ref/glossary/release-candidate/&quot; class=&quot;ref-link&quot;&gt;release candidate&lt;/a&gt; phase on August 4, with the final release expected, as usual, this fall.&lt;/p&gt;
&lt;h3 id=&quot;a-built-in-sentinel-lands-in-python-315&quot;&gt;A Built-in &lt;code&gt;sentinel&lt;/code&gt; Lands in Python 3.15&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#a-built-in-sentinel-lands-in-python-315&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here’s the new feature that you’ll likely want to reach for. If you’ve ever needed to tell the difference between a caller passing &lt;code&gt;None&lt;/code&gt; and a caller passing nothing at all, then you’ve probably written something like this:&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;/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;_MISSING&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_MISSING&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_MISSING&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;c1&quot;&gt;# No value was provided&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;It works, but it has rough edges. The &lt;code&gt;repr()&lt;/code&gt; is an unhelpful &lt;code&gt;&amp;lt;object object at 0x7f...&amp;gt;&lt;/code&gt;, the marker can’t be used cleanly in type &lt;a href=&quot;https://realpython.com/ref/glossary/annotation/&quot; class=&quot;ref-link&quot;&gt;annotations&lt;/a&gt;, and its identity doesn’t survive copying or pickling. &lt;a href=&quot;https://peps.python.org/pep-0661/&quot;&gt;PEP 661&lt;/a&gt; replaces the idiom with a new &lt;a href=&quot;https://docs.python.org/3.15/library/functions.html#sentinel&quot;&gt;&lt;code&gt;sentinel&lt;/code&gt;&lt;/a&gt; built-in:&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;/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;MISSING&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sentinel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;MISSING&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MISSING&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MISSING&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MISSING&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;c1&quot;&gt;# No value was provided&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 signature is &lt;code&gt;sentinel(name, /, *, repr=None)&lt;/code&gt;, and the result is a unique truthy object whose default &lt;code&gt;repr()&lt;/code&gt; is the name you gave it, so &lt;code&gt;MISSING&lt;/code&gt; shows up as &lt;code&gt;MISSING&lt;/code&gt; in &lt;a href=&quot;https://realpython.com/ref/glossary/traceback/&quot; class=&quot;ref-link&quot;&gt;tracebacks&lt;/a&gt; instead of a memory address.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Sentinels and &lt;code&gt;None&lt;/code&gt; solve related but different problems. If you’re still fuzzy on when &lt;code&gt;None&lt;/code&gt; is the right tool, then Real Python’s guide to &lt;a href=&quot;https://realpython.com/null-in-python/&quot;&gt;Python’s &lt;code&gt;None&lt;/code&gt;&lt;/a&gt; is worth revisiting.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Because the sentinel is its own type, you can drop it straight into annotations like &lt;code&gt;int | MISSING&lt;/code&gt; without reaching for &lt;code&gt;Literal&lt;/code&gt;. The &lt;a href=&quot;https://realpython.com/ref/glossary/pep/&quot; class=&quot;ref-link&quot;&gt;PEP&lt;/a&gt; was first submitted back in 2021, so it’s satisfying to see it cross the finish line.&lt;/p&gt;
&lt;h3 id=&quot;pep-829-graduates-from-draft-to-accepted&quot;&gt;PEP 829 Graduates From Draft to Accepted&lt;a class=&quot;headerlink&quot; href=&quot;https://realpython.com/atom.xml#pep-829-graduates-from-draft-to-accepted&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://realpython.com/python-news-may-2026/#pep-829-draft-replacing-pth-files-for-package-startup&quot;&gt;Last month’s roundup&lt;/a&gt; featured PEP 829 while it was still a draft. It’s since been accepted for Python 3.15, so the change is now official.&lt;/p&gt;
&lt;p&gt;As a quick recap, &lt;code&gt;.pth&lt;/code&gt; files in your &lt;code&gt;site-packages&lt;/code&gt; directory can do two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Extend &lt;code&gt;sys.path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run arbitrary code through &lt;code&gt;import&lt;/code&gt; lines that Python feeds directly to &lt;a href=&quot;https://realpython.com/python-exec/&quot;&gt;&lt;code&gt;exec()&lt;/code&gt;&lt;/a&gt; at startup&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/python-news-june-2026/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/python-news-june-2026/ »&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, 08 Jun 2026 14:00:00 +0000</pubDate>
</item>

</channel>
</rss>
