skip to navigation
skip to content

Planet Python

Last update: July 21, 2026 07:48 PM UTC

July 21, 2026


PyCoder’s Weekly

Issue #744: CPython ABI, CLAUDE.md, Itertools Cheatsheet, and More (2026-07-21)

#744 – JULY 21, 2026
View in Browser »

The PyCoder’s Weekly Logo


What Every Dev Should Know About the CPython ABI

An introduction to the concept of the Application Binary Interface (ABI), the various CPython ABIs, and the new abi3t stable ABI in Python 3.15.
NATHAN GOLDBAUM

How to Write a CLAUDE.md File for Claude Code

Learn how to write a CLAUDE.md file for Claude Code, with global, project, and local examples that capture your Python commands and conventions.
REAL PYTHON

Quiz: How to Write a CLAUDE.md File for Claude Code

REAL PYTHON

Pip Install Actian VectorAI!

alt

VectorAI DB gives your Python AI agents persistent vector memory on your own hardware. No cloud dependency or per-query billing. Native LangChain and LlamaIndex support. On-premises, at the edge, or air-gapped. Free Community Edition available. Get Started Free →
ACTIAN VECTORAI DB sponsor

Itertools Cheatsheet

Cheatsheet with visual diagrams that explain how the iterables from itertools work.
RODRIGO GIRÃO SERRÃO

Python 3.15.0 Beta 4 Released

PYTHON.ORG

PEP 838: Adding python-version to pyvenv.cfg (Added)

PYTHON.ORG

PEP 840: Name Resolution in Class Namespaces (Added)

PYTHON.ORG

PyData Global 2026 Call for Proposals

PYDATA.ORG

Articles & Tutorials

Git for Data Scientists

A practical Git walkthrough for data scientists, focused on real workflows like branching for experiments, reverting mistakes, and keeping project history clean with small, focused commits. It also explains merge vs. rebase, why you should not rebase shared branches, and how to set up .gitignore for data-heavy projects.
KHUYEN TRAN • Shared by Khuyen Tran

In Defense of Not Understanding Your Codebase

In this opinion piece, Sean argues that there is a difference in the thought process between maintaining smaller software projects vs larger ones, and that the former is over represented in engineering discussion in the internet.
SEAN GOEDECKE

Learn Agentic Coding With Claude Code

alt

Unlike a chat window, Claude Code works directly in your project, where it can run your tests and manage your git history. In this two-day live course (August 1–2), you’ll use it to scaffold, test, debug, and ship a Python app project, and leave with a starter kit of reusable skills. See the Full Curriculum →
REAL PYTHON sponsor

Polars: Benchmarking Single Node vs Distributed

Polars has recently added a mechanism for doing distributed calculations. This post describes how that relates to speed-up. As with benchmarking all things, whether it is faster or not depends on your situation.
CHIEL PETERS

Browser Push Notifications for a Django Website

Web Push notifications are an alternate way of getting information to your users. This post shows you how to implement them with Django using a service worker and a Huey background task.
AIDAS BENDORAITIS

12K+ JPEGs From NASA’s Artemis II Mission

Mark writes articles on data analysis. This one is all about the images NASA released from the Artemis II mission. It includes step-by-step instructions that you can follow along.
MARK LITWINTSCHIK

Introducing django-orjson

orjson is a Rust-based replacement for Python’s json module. So what would Adam Johnson do with it? Make it easier to use in Django of course.
ADAM JOHNSON

Stop Using if-else Chains

Learn a cleaner, more extensible way to dispatch logic in Python using dictionaries and function pointers instead of long if-else chains.
KANWAL MEHREEN

Understanding Mixin Classes in Python

Learn how to write reusable Python mixin classes, distinguish them from abstract base classes, and steer clear of common pitfalls.
REAL PYTHON course

Quiz: Understanding Mixin Classes in Python

REAL PYTHON

Creating Presentations in Your Terminal

Spiel is a Python tool for creating terminal based presentations. It uses the Rich package to give you a clean look and feel.
MIKE DRISCOLL

Projects & Code

kademlia-dynamic: Kademlia Distributed Hashtable

GITHUB.COM/F4RSANTOS • Shared by Fernando Santos

userharbor: Framework Agnostic User Management

GITHUB.COM/USERHARBOR

balance: Deal With Biased Data Samples

GITHUB.COM/FACEBOOKRESEARCH

fstache: Fast, Typed, Mustache Renderer

GITHUB.COM/SERVLETCLOUD • Shared by Vladimir Korobkov

bounty-check: Is a GitHub Bounty Issue Still Claimable?

GITHUB.COM/WREN-CASTELLAN • Shared by Wren Castellan

Events

Weekly Real Python Office Hours Q&A (Virtual)

July 22, 2026
REALPYTHON.COM

PyData PyCon Armenia 2026

July 24 to July 26, 2026
PYCON.AM

PyDelhi User Group Meetup

July 25, 2026
MEETUP.COM

Python Sheffield

July 28, 2026
GOOGLE.COM

Python Southwest Florida (PySWFL)

July 29, 2026
MEETUP.COM


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

alt

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

July 21, 2026 07:30 PM UTC


PyCharm

What’s New in PyCharm 2026.2

In PyCharm 2026.2, you can build Python extensions with the new Rust plugin and debug them using debugpy, which is now the default engine. Running external utilities is now managed through a redesigned settings UI for uvx, while multi-project setups are supported out of the box for uv, Poetry, and Hatch workspaces. This release also introduces an editor minimap, integrates the Pyrefly engine for faster type insights, adds AI project generation, and more.

Python extension development with the Rust plugin [Beta][Pro]

Work seamlessly with Python projects that leverage Rust modules to speed up performance-critical components.

debugpy as the default debugger

Following its introduction as an optional backend in 2026.1, debugpy is now enabled by default for all Python projects and Jupyter notebooks, using the Debug Adapter Protocol (DAP).

Support for uv-backed tools and uvx

PyCharm now leverages the uv toolchain to streamline how you run your external development utilities, eliminating manual package setups that clutter your local environment.

Support for uv, Poetry, and Hatch multi-projects and uv workspaces [Beta]

Previously available as an optional feature in PyCharm 2026.1.1, this functionality is enabled by default in version 2026.2. It streamlines your subproject management and provides richer dependency insights directly within your configuration files. 

Editor minimap

Navigate complex source files and notebooks more efficiently with the official editor minimap. It provides a high-level visual overview of your document structure across all supported file types – while offering a dedicated layout built just for Jupyter notebooks.

Pyrefly type engine integration

Use Pyrefly as an external type engine to significantly accelerate code insight features for large-scale Python codebases.

Start new projects with AI

If you have a JetBrains AI license, you can now generate fully configured, runnable projects from scratch using natural language prompts directly from the Welcome screen.

Agent skills manager

AI agents are only as useful as the context they have. When they don’t have knowledge of your frameworks, conventions, and tooling, you end up re-explaining the same setup in every new chat window.

Agent skills fix that. Install them once in PyCharm, and your agents carry that domain knowledge across every project and session – automatically. Browse and manage skills directly from the IDE, expand the built-in library with external registries like public GitHub repositories, or let PyCharm import skills you’ve already set up for Claude Code or Codex. 

July 21, 2026 03:53 PM UTC


Rodrigo Girão Serrão

Python quiz: EuroPython 2026 edition

Replay the EuroPython 2026 Python quiz.

These are the questions asked during the EuroPython 2026 quiz. They will test your knowledge of the Python language, the community, and of EuroPython 2026. Since we were celebrating 25 years of EuroPython at EuroPython 2026, some questions also touched on that theme. (Unless explicitly stated, questions refer to CPython 3.14.)

Note that the version of the quiz presented here is less interactive than the one presented at the conference.

Questions

In 25 years of conference, which of these European cities never hosted EuroPython?

A photograph of the city that never hosted EuroPython.

  • Bilbao
  • Birmingham
  • Lisbon
  • Prague

This year's conference programme has it all. This quiz. Talks. Lightning talks. Tutorials. Summits. Open spaces. Talks. And posters during lunch breaks. How many posters are scheduled to be presented at EP 2026?

  • 4
  • 6
  • 12
  • 15

Which of the following Python-related projects has the FEWEST stars on GitHub?

  • CPython
  • Django
  • FastAPI
  • uv

The Python repo has over 130,000 commits made by more than 3,500 contributors over the past 35+ years. The Python core developers are the people with permissions to commit directly to the CPython GitHub repo and plenty of them were at the conference. Out of the following 4 core devs, who were all at the conference, who's made the fewest commits?

  • Guido van Rossum, the creator of Python
  • Hugo van Kemenade, Python 3.14 and 3.15 release manager
  • Łukasz Langa, Python Developer in Residence for ~5 years
  • Pablo Galindo Salgado, Python 3.10 and 3.11 release manager

Speaking of commits, how many commits did Guido van Rossum make?

A screenshot of Guido's contribution graph without any numbers.

Since we're celebrating 25 years of EuroPython, which of the following expressions does not evaluate to 25?

  • 0x19
  • 0b11001
  • 0o33
  • 25

3.15 comes with two new built-in functions. Before that, the previous Python version that got new built-ins was 3.10, with also TWO new built-ins. What two built-ins were introduced in 3.10?

A screenshot of all Python built-in functions in 3.15

  • aiter and anext
  • breakpoint and compile
  • frozendict and sentinel
  • frozenset and memoryview

What's printed by the second print if you run this code?

A screenshot of a snippet of code caching a generator

  • 0
  • 285
  • KeyError
  • ValueError

By the way, speaking of commits, do you still remember how many commits Guido van Rossum made?

A screenshot of Guido's contribution graph without any numbers.

What does the following cursed Python 2 code print?

A tiny cursed snippet of Python code.

  • 'a'
  • 25
  • True
  • SyntaxError

Explanations

Question 1 — Hosting EuroPython

EuroPython 2009 and 2010 was hosted in Birmingham. EuroPython 2015 and 2016 was hosted in Bilbao. EuroPython 2023, 2024, and 2025 was hosted in Prague. Of the four options, Lisbon is the only European city that never hosted an EuroPython.

Question 2 — poster presentations

Originally, 9 poster presentations were scheduled. After a mixup and a couple cancellations we ended with only 6.

Question 3 — GitHub stars

The official quiz asked you to order all four projects, from most stars to least stars. Can you do it?

On the 15th of July of 2026, this would be the correct ordering:

  1. FastAPI, 101k
  2. Django, 88.2k
  3. uv, 87.5k
  4. CPython, 73.8k

Question 4 — commits

On the 15th of July of 2026, GitHub reported the following number of all-time...

July 21, 2026 03:00 PM UTC


Python Bytes

#489 Or JSON?

<strong>Topics covered in this episode:</strong><br> <ul> <li><strong><a href="https://adamj.eu/tech/2026/07/15/introducing-django-orjson/?featured_on=pythonbytes">django-orjson</a></strong></li> <li><strong><a href="https://www.peterbe.com/plog/best-django-redis-configuration-for-speed-and-size?featured_on=pythonbytes">Best Django Redis configuration for speed and size</a></strong></li> <li><strong>Linus Torvalds <a href="https://lore.kernel.org/linux-media/CAHk-=wi4zC+Ze8e+p3tMv8TtG_80KzsZ1syL9anBtmEh5Z40vg@mail.gmail.com/?featured_on=pythonbytes">puts the foot down</a> against Anti-AI Kernel Maintainers</strong></li> <li><strong><a href="https://www.djangoproject.com/weblog/2026/jul/15/supporting-the-triptych-project/?featured_on=pythonbytes">Django Steering Council backs the Triptych Project</a></strong></li> <li><strong>Extras</strong></li> <li><strong>Joke</strong></li> </ul><a href='https://www.youtube.com/watch?v=zaoPcuKz970' style='font-weight: bold;'data-umami-event="Livestream-Past" data-umami-event-episode="489">Watch on YouTube</a><br> <p><strong>About the show</strong></p> <p>Sponsored by us! Support our work through:</p> <ul> <li>Our <a href="https://training.talkpython.fm/?featured_on=pythonbytes"><strong>courses at Talk Python</strong></a></li> <li>Consulting from <a href="https://sixfeetup.com/?featured_on=pythonbytes"><strong>Six Feet Up</strong></a></li> </ul> <p><strong>Connect with the hosts</strong></p> <ul> <li>Michael: <a href="https://fosstodon.org/@mkennedy">Mastodon</a> / <a href="https://bsky.app/profile/mkennedy.codes?featured_on=pythonbytes">BlueSky</a> / <a href="https://x.com/mkennedy?featured_on=pythonbytes">X</a> / <a href="https://www.linkedin.com/in/mkennedy/?featured_on=pythonbytes">LinkedIn</a></li> <li>Calvin: <a href="https://sixfeetup.social/@calvin?featured_on=pythonbytes">Mastodon</a> / <a href="https://bsky.app/profile/calvinhp.com?featured_on=pythonbytes">BlueSky</a> / <a href="https://x.com/calvinhp?featured_on=pythonbytes">X</a> / <a href="https://www.linkedin.com/in/calvinhp/?featured_on=pythonbytes">LinkedIn</a></li> <li>Show: <a href="https://fosstodon.org/@pythonbytes">Mastodon</a> / <a href="https://bsky.app/profile/pythonbytes.fm">BlueSky</a> / <a href="https://x.com/PythonBytes?featured_on=pythonbytes">X</a></li> </ul> <p>Join us on YouTube at <a href="https://pythonbytes.fm/stream/live"><strong>pythonbytes.fm/live</strong></a> to be part of the audience. Usually <strong>Tuesday at 7am PT</strong>. Older video versions available there too.</p> <p><strong>Michael #1: <a href="https://adamj.eu/tech/2026/07/15/introducing-django-orjson/?featured_on=pythonbytes">django-orjson</a></strong></p> <ul> <li><strong>Adam Johnson dropped <code>django-orjson</code></strong> - drop-in replacements for the Django and DRF pieces that touch JSON, swapping stdlib <code>json</code> for <strong>orjson</strong>, the Rust-based library. Headline numbers: <strong>10x faster serialization, 2x faster deserialization</strong>.</li> <li><strong>The interesting question is why this needs to be a package at all.</strong> <code>pip install orjson</code> is the easy part. Adam's actual pitch: adopting it "isn't easy, especially when your framework uses <code>json</code> in many different parts." Django scatters JSON across <code>JsonResponse</code>, the test client and test case classes, the <code>json_script</code> template tag, and more. There's no single hook to grab, so you get a library that catches them all.</li> <li><strong>Adam is refreshingly honest about the scale of the win.</strong> His words: <em>"While database queries tend to dominate the typical Django application's runtime, the time spent in serialization and deserialization can still be significant."</em> He calls it <strong>"a nearly free performance win"</strong> - not "this will 10x your app." That's a claim about <em>cost</em>, not magnitude, and it's worth keeping those straight.</li> <li><strong>Worth flagging what the post doesn't cover: caveats.</strong> There are none in the article, but orjson has real ones. Django and Flask both render datetimes as RFC 822 HTTP-date (<code>Wed, 15 Jul 2026 12:00:00 GMT</code>); orjson does ISO 8601. It can't do <code>ensure_ascii</code>, it rejects NaN and Infinity (which stdlib happily emits), and it raises on <code>Decimal</code>. If you've got a JS client parsing dates, that's a wire-format change.</li> <li><strong>Who should actually take this?</strong> If you're a DRF shop shoveling JSON all day, yes - it's cheap and it's real. If your app mostly renders HTML templates, you're optimizing a slice of runtime that's already near zero.</li> <li><strong>The problem Adam's package solves doesn't exist in Flask or Quart.</strong> They already centralize every JSON operation - <code>jsonify</code>, <code>request.get_json()</code>, the test client, the <code>|tojson</code> filter - behind one provider object at <code>app.json</code>. So there's no library to install. It's about ten lines: <div class="codehilite"> <pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">orjson</span> <span class="kn">from</span><span class="w"> </span><span class="nn">quart.json.provider</span><span class="w"> </span><span class="kn">import</span> <span class="n">JSONProvider</span> <span class="c1"># or flask.json.provider</span> <span class="k">class</span><span class="w"> </span><span class="nc">OrjsonProvider</span><span class="p">(</span><span class="n">JSONProvider</span><span class="p">):</span> <span class="k">def</span><span class="w"> </span><span class="nf">dumps</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span> <span class="k">return</span> <span class="n">orjson</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span> <span class="c1"># provider must return str</span> <span class="k">def</span><span class="w"> </span><span class="nf">loads</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> <span class="k">return</span> <span class="n">orjson</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">app</span><span class="o">.</span><span class="n">json</span> <span class="o">=</span> <span class="n">OrjsonProvider</span><span class="p">(</span><span class="n">app</span><span class="p">)</span> </code></pre> </div></li> </ul> <p><strong>The numbers on <a href="https://talkpython.fm/?featured_on=pythonbytes">talkpython.fm</a></strong></p> <ul> <li><strong>Evaluated it, measured it, and skipped it.</strong> The biggest JSON payload we serve is our MCP server returning a cached episode transcript, about 139 KB. Swapping the provider saves <strong>0.119 milliseconds per request</strong>. That total response takes 1.1 ms</li> <li><strong>We got 4.1x, not 10x - and the reason is the good lesson.</strong> Payload <em>shape</em> decides your speedup. The 10x is for structure-heavy data, lots of small keys where stdlib burns time in Python-level dispatch per item. Our hot payload is one giant transcript string, so the work is escaping and memcpy</li> </ul> <p><strong>Calvin #2: <a href="https://www.peterbe.com/plog/best-django-redis-configuration-for-speed-and-size?featured_on=pythonbytes">Best Django Redis configuration for speed and size</a></strong></p> <ul> <li>Peter Bengtsson revisits a classic: his 2017 "<a href="https://www.peterbe.com/plog/fastest-redis-optimization-for-django?featured_on=pythonbytes">Fastest Redis configuration for Django</a>" benchmark now has a 2026 update posted this week.</li> <li>The 2017 post pitted django-redis serializers (json, ujson, msgpack, pickle) and compressors (zlib, lzma) against each other; conclusion was <strong>msgpack + zlib</strong> as the sweet spot - avoid the json serializer, it's fat and slow.</li> <li>The 2026 update narrows focus to just compressors: default (no compression), <code>zlib</code>, <code>lzma</code>, and newcomer <code>zstd</code>.</li> <li>New results: <code>lzma</code> compresses best but is slowest; <code>zstd</code> is the fastest compressor on Ubuntu; differences between them are very small.</li> <li>Big takeaway across both: compression buys you a lot of space (2–3.5x smaller) for very little speed cost - worth it for Redis where memory is the constraint.</li> <li>Caveat from the author: results depend heavily on your data - his test stores short strings of numbers, so benchmark your own workload.</li> </ul> <p><strong>Michael #3: Linus Torvalds <a href="https://lore.kernel.org/linux-media/CAHk-=wi4zC+Ze8e+p3tMv8TtG_80KzsZ1syL9anBtmEh5Z40vg@mail.gmail.com/?featured_on=pythonbytes">puts the foot down</a> against Anti-AI Kernel Maintainers</strong></p> <ul> <li>Write up <a href="https://arstechnica.com/ai/2026/07/linus-torvalds-to-critics-of-ai-coding-in-linux-fork-it-or-just-walk-away/?featured_on=pythonbytes">on Ars</a>.</li> <li>Really good coverage by Maximillian: <a href="https://www.youtube.com/watch?v=kxEoF8sn-K4">Time to wake up (for some)</a></li> <li>Torvalds said that “Linux is not one of those anti-AI projects, and if somebody has issues with that, they can do the open-source thing and fork it. Or just walk away.”</li> <li>I agree with Max, putting your head in the sand and waiting for AI to go away will likely mean you won’t be working professionally in software development in the coming years.</li> <li>The statement came amid a lengthy thread arguing about the use of <a href="https://github.com/sashiko-dev/sashiko?featured_on=pythonbytes">Sashiko</a>, an “agentic Linux kernel code review system” that its creators claim can, in tests, independently find 53.6 percent of the bugs that would end up being fixed by human coders in later commits.</li> <li>“We’re not forcing anybody to use [LLM tools], but I will very loudly ignore people who try to argue against other people from using it,” Torvalds said.</li> <li>“Anybody who points to the problems at AI had better be looking in the mirror and pointing at themselves at the same time,” Torvalds wrote.</li> </ul> <p><strong>Calvin #4: <a href="https://www.djangoproject.com/weblog/2026/jul/15/supporting-the-triptych-project/?featured_on=pythonbytes">Django Steering Council backs the Triptych Project</a></strong></p> <ul> <li>Django Steering Council issued a Letter of Collaboration backing Carson Gross &amp; Alex Petros's funding bid for the <a href="https://triptychproject.org/?featured_on=pythonbytes">Triptych Project</a> - three proposals to make HTML more expressive natively, in every browser.</li> <li>The three additions: PUT/PATCH/DELETE methods for forms, button actions (buttons that fire HTTP requests without a wrapping form), and partial page replacement.</li> <li>Distills the core ideas from HTMX/Unpoly/Turbo into the HTML standard itself - no JS, no library, nothing to ship or maintain.</li> <li>Current focus is button actions (<a href="https://github.com/whatwg/html/issues/12330?featured_on=pythonbytes">WHATWG #12330</a>): <code>&lt;button action=/logout method=POST&gt;Logout&lt;/button&gt;</code> instead of wrapping a button in a form.</li> <li>Relevant to Django directly - think the admin submit row and disguised delete links; Django 6.0's template partials were already inspired by these patterns.</li> <li>How to help: companies can send non-binding letters of support on letterhead; individuals can read the proposals and weigh in on the WHATWG issues.</li> </ul> <p><strong>Extras</strong></p> <p>Calvin:</p> <ul> <li><a href="https://github.com/petergpt/doomql?featured_on=pythonbytes">DOOMQL</a> - <strong>A playable first-person shooter whose framebuffer is a SQL query.</strong></li> </ul> <p>Michael:</p> <ul> <li><a href="https://github.com/emmett-framework/granian/releases/tag/v2.7.9?featured_on=pythonbytes"><strong>Granian 2.7.9 fixes WSGI threadpool scheduler starvation/underscaling</strong></a></li> <li><a href="https://talkpython.fm/blog/posts/calvin-hendryx-parker-joins-python-bytes-as-co-host/?featured_on=pythonbytes">Welcome Calvin post</a></li> </ul> <p><strong>Joke: <a href="https://x.com/PR0GRAMMERHUM0R/status/2077211586440151184?featured_on=pythonbytes">Solving all bugs</a></strong></p>

July 21, 2026 08:00 AM UTC


Talk Python Blog

Calvin Hendryx-Parker joins Python Bytes as Co-Host

Calvin and Michael kicking off a Python Bytes episode

TL;DR: Calvin Hendryx-Parker is the new permanent co-host of Python Bytes, starting with episode 483 on June 9th, 2026. After almost 10 years, Brian Okken, who founded the show with me back in 2016, has decided it’s time for him to move on.


We have some major news to announce over at Python Bytes. We are welcoming a new co-host to the show: Calvin Hendryx-Parker. After almost 10 years, Brian Okken who founded the show with me, Michael back in 2016 has decided it’s time for him to move on. On the air I called it the next generation of Python Bytes.

July 21, 2026 02:46 AM UTC

July 20, 2026


Wingware

Wing Python IDE Version 12 - July 20, 2026

Wing Python IDE version 12 has been released. Wing 12 integrates the Claude Code AI coding agent directly into the IDE, with a new Claude Code tool, a Tasks tool for planning and reviewing AI agent work, and a set of MCP servers that give the agent access to Wing's source code analysis, unit testing, debugger, and code review features. Wing 12 makes it faster and cheaper to direct AI agents; see our benchmarks for details.

Wing 12 also adds configurable AI-driven Code Actions, code FIX actions, automated Write Tests, pseudo-terminal support for OS Commands and Debug I/O, support for tools and OS Commands in editor splits, a reorganized Tools menu, automatic test discovery, Preferences search, and more.

Wing 12 Screen Shot

Downloads

Be sure to Check for Updates in Wing's Help menu after installing, to make sure that you have the latest hot fixes.

Wing 12 -- the full Python IDE, available as Wing Pro (for agentic development) or Wing Classic (for manual development) depending on your license, with a free 30-day trial of Wing Pro.

Wing 101 v. 12 -- a simplified free Python IDE for teaching beginning programmers.

Wing 11 and earlier versions are not affected by installation of Wing 12 and may be installed and used independently. However, project files for Wing 11 and earlier are converted when opened by Wing 12 and should be saved under a new name, since Wing 12 projects cannot be opened by older versions of Wing.

New in Wing 12

AI Coding Agent Integration with Claude Code

Wing 12 adds a Claude Code tool that integrates the Claude Code AI coding agent with the IDE. Set Up for Claude Code in the Project menu configures the active project for AI agent development.

A set of MCP (Model Context Protocol) servers gives Claude Code access to Wing's source code analysis, testing, and debugger functionality, so the agent can more efficiently navigate and understand your code, write, run, and fix unit tests, and use the debugger to diagnose difficult runtime errors. In our benchmarks, giving Claude Code access to Wing's MCP servers made agent-driven coding tasks both faster and cheaper.

Tasks Tool

The new Tasks tool lets you plan, queue, execute, review, and audit the history of AI agent development tasks, making it easier to supervise and inspect the agent's work before committing it to revision control.

FIX Features and Write Tests

Wing 12 adds AI agent driven FIX features that hand the current debugger bug, failing unit tests, or code warnings to Claude Code for resolution. New Write Tests items in the Testing and editor context menus prompt the agent to write unit tests for selected code.

Code Actions

Wing 12 also adds AI Code Actions, accessed from the FIX icon in the editor toolbar, that operate on selected code or the enclosing scope. Built-in actions include explaining code, reviewing it for quality or security risks, fixing code warnings, optimizing for performance, and updating comments and docstrings. The action list is user-extensible, so you can add your own prompts for tasks you run often.

Pseudo-Terminal for OS Commands and Debug I/O

The OS Commands and Debug I/O tools now default to using a pseudo-terminal that implements full ANSI terminal emulation, so you can run and debug programs that use color output, cursor positioning, or full-screen TUIs.

Redesigned OS Commands Capability

The OS Commands tool has been replaced with configurable OS Commands in the Tools menu. Each OS Command acts like its own tool, for use in any tool or editor split.

Tools in Editor Splits and Reorganized Tools Menu

Tools can now also be added or dragged to editor splits, allowing for much more flexible workspace layout. The Tools menu has been reorganized into related groups, with less-user and legacy tools in an Other sub-menu, so more commonly used tools area easier to find.

Test Discovery and Preferences Search

Wing 12 adds automatic test file discovery and discovery of individual unit tests within files, so you usually don't need to specify test file patterns or add test files individually. The Preferences dialog now supports text search and back/forward navigation.

Other Minor Features and Improvements

Wing 12 also significantly speeds up source code analysis, prompts for SSH passphrases and HTTPS credentials when needed during VCS operations, detects externally modified files much more quickly and with reduced CPU load, saves and restores tool console scrollback across project close/reopen, supports clickable OSC 8 hyperlinks in OS Commands and Debug I/O tools, adds a preference to select the ssh or plink.exe SSH implementation, shows a notice on the next startup when Wing's previous session ended in an unexpected crash, and makes a number of other bug fixes and usability improvements.

Product Line Changes

Wing 12 simplifies the product line. The Commercial / Non-Commercial use distinction has been replaced by two feature-based product tiers:

  • Wing Pro -- the full-featured Python IDE including AI agent development tools
  • Wing Classic -- the complete traditional Python IDE for hands-on development, with no AI agent features

Anyone may purchase either tier for any purpose. Existing Commercial and Non-Commercial Use licenses both become Wing Pro. Customers who don't need the AI agent features may move to Wing Classic at renewal time, or any time sooner by contacting support@wingware.com.

Wing Personal has been discontinued. Existing Wing Personal users may continue to use Personal 11.x indefinitely, switch to free Wing 101, or purchase a Wing Classic license. See Pricing for details.

Changes and Incompatibilities

The single-LLM-query AI features originally introduced in Wing 11 (the AI Coder and AI Chat tools) are considered legacy in Wing 12 and hidden from the user interface by default. They remain available in projects that already use them and can be re-enabled with Project Properties > AI in Project Properties or in the .``Projects > AI`` preferences.

See Wing's Claude Code Agent Integration for Wing 12's AI agent approach.

If you have questions, please don't hesitate to contact us at support@wingware.com.

July 20, 2026 01:00 AM UTC

July 19, 2026


Paolo Melchiorre

My EuroPython 2026

My EuroPython 2026 experience in Krakow, captured through Mastodon posts about talks, community, people, and moments along the way.

July 19, 2026 10:00 PM UTC


Peter Bengtsson

Best Django Redis configuration for speed and size

`lzma` compresses the most and `zlib` is about as fast as `zstd` in `django_redis` as compressor.

July 19, 2026 08:01 PM UTC

July 18, 2026


PyPy

Moving linux builds to GLIBC==2.28

A short note for visibility.

PyPy builds tarballs of the python interpreter ready for download. These include the latest releases and also nightly builds, fresh from our fleet of buildbots. Over the next couple of days, the nightly builds on linux will transition from manylinux2014 based docker images to manylinux2_28 images. The practical implication is that nightly images, and the next releases, will require a minimum of GLIBC>=2.28, i.e. AlmaLinux8, amanzonlinux 2023, debian 10, ubuntu 20.04. For a good overview of how this glibc/distro/manylinux all works, see the PEP 600 compliance page.

The next release will indicate this change by a new PyPy major version, 8.0.0. It should include a Python3.12 interpreter, in which case it will be the last release of the Python 3.11 interpreter.

July 18, 2026 06:09 PM UTC


Core Dispatch

Core Dispatch #8

Welcome back to Core Dispatch! This edition covers July 5 through July 18, 2026. Python 3.15.0 beta 4 landed today, July 18 (we just released it at the EuroPython sprints!), with 3.13.15, 3.14.7 and the first 3.15 release candidate following on August 4.

It's EuroPython week! Much of the core team has been gathered in one place for our annual Language Summit (blog posts to come!) and the conference. Recordings aren't up just yet, but as promised with the PyCon US talks, once they are, we'll pull talks and Language Summit coverage from the team into a future edition.

On the PEP front, discussion is lively: PEP 835 (shorthand syntax for Annotated metadata) and PEP 836 ("JIT Go Brrr") are both drawing dozens of new replies, and a few fresh PEPs — including PEP 840 on name resolution in class namespaces — have joined the queue.

Don't miss the "One More Thing" at the bottom of this edition. This one's a little sillier (correction: more unhinged) than usual, but we think you'll enjoy it.

As always, if you maintain a package or just like living on the edge, give the final 3.15 beta a spin and file any issues you find.

Upcoming Releases

PEP Updates

Steering Council Updates

Merged PRs

Discussion

Core Dev Musings

Upcoming CFPs & Conferences

One More Thing

"The Meowl is a part of life."

Ken Jin

"We're just normal men"

Łukasz Langa
AI-generated glitch meme of Pablo Galindo Salgado presenting a surreal Pablo during one of his "EuroPython 2026" talks, as hallucinated by AI.

Credits

July 18, 2026 12:00 AM UTC


Python Insider

Python 3.15.0 beta 4 is here!

The final 3.15 beta is out!

July 18, 2026 12:00 AM UTC

July 17, 2026


PyPodcats

Episode 12: With Juanita Gomez

Learn about Juanita Gomez, a Ph.D. candidate at UC Santa Cruz researching open source security. From developing the Spyder IDE to leading community efforts for Scientific Python and singing on stage at SciPy, Juanita shares her journey in open source.Learn about Juanita Gomez, a Ph.D. candidate at UC Santa Cruz researching open source security. From developing the Spyder IDE to leading community efforts for Scientific Python and singing on stage at SciPy, Juanita shares her journey in open source.

We interviewed Juanita Gomez.

Juanita is a Ph.D. candidate in Computer Science at UC Santa Cruz, where her research focuses on improving the security of scientific open source software in collaboration with the Open Source Program Office (OSPO) at UCSC. She is a former developer of the Spyder IDE, and currently one of the community managers for the Scientific Python project. She is also part of the organizing committee for the SciPy conference.

In this episode, Juanita shares how a music YouTube channel led her to open source: the video editing skills she picked up making covers helped her create friendlier documentation, tutorials, and videos for Spyder, which caught the attention of the Scientific Python project founders. She talks about bridging her security research with her passion for open source, and gives practical advice for maintainers who want to make their projects more secure, from GitHub’s built-in security features to the OpenSSF Scorecard. She also opens up about imposter syndrome, being doubly underrepresented as a woman and Latina in tech, and how surrounding herself with people who elevate her work keeps her growing. And yes, there is singing: from auditioning for The X Factor in Colombia as a kid to performing lightning talk songs with the SciPy 5 at the SciPy conference.

Be sure to listen to the episode to learn all about Juanita’s inspiring story!

Topic discussed

July 17, 2026 01:00 PM UTC

July 16, 2026


Tryton News

Release 1.0.0 of Relatorio

We are proud to announce the release of Relatorio version 1.0.0.

Relatorio is a templating library for OpenDocument using also OpenDocument as source format.

In addition to bug-fixes, this release contains the following improvements:

The package is available at Client Challenge
The documentation is available at Relatorio — A templating library able to output odt files

1 post - 1 participant

Read full topic

July 16, 2026 04:42 PM UTC

Release 1.0.0 of GooCalendar

We are proud to announce the release 1.0.0 of GooCalendar.

GooCalendar is a Python library that implements a calendar widget for GTK+.

In addition to bug-fixes, this release contains this following improvements:

GooCalendar is available on PyPI: GooCalendar · PyPI
The documentation is available at goocalendar — Calendar widget — A calendar widget for GTK

1 post - 1 participant

Read full topic

July 16, 2026 04:25 PM UTC


Seth Michael Larson

EuroPython 2026: Learning from the “not-so-secret” Python security cabal

I delivered this talk at EuroPython 2026, I'll update this blog post once the recording is available on EuroPython's YouTube channel. Below are the slides and full list of links and resources included. This talk is a continuation of a talk I gave a year ago: “Security Work isn’t Special” as the keynote for OpenSSF Community Day NA where I lamented on how security work didn't match other Open Source contribution models like documentation, community, or code contributions.

My work as the Security Developer-in-Residence at the Python Software Foundation is sponsored by Alpha-Omega. Thanks to Alpha-Omega for supporting security in the Python ecosystem.

Links and Resources



Thanks for reading ♥ I would love to hear your thoughts! Contact me via Mastodon, Bluesky, or email. Browse the blog archive. Check out my blogroll.



July 16, 2026 12:00 AM UTC

July 15, 2026


Python Software Foundation

Affirm Your PSF Membership Voting Status

Every Python Software Foundation (PSF) voting-eligible Member (Supporting, Contributing, and Fellow) needs to affirm their membership to vote in this year’s PSF Board and Python Packaging Council (PPC) elections.

If you wish to vote in either the PSF Board or Python Packaging Council elections, you must affirm your intention to vote for each election no later than Tuesday, August 25th, 2:00 pm UTC, to participate in this year’s elections. This year’s election votes begin Tuesday, September 1st, 2:00 pm UTC, and close on Tuesday, September 15th, 2:00 pm UTC. 

Election communications from psfmember.org

You should have received an email from "psf@psfmember.org <Python Software Foundation>" with the subject "[Action Required] Affirm your PSF Membership voting intention for the 2026 PSF Board Election" and/or “2026 Python Packaging Council Inaugural Election Information & Schedule” that contains information on how to affirm your voting status. If you were expecting to receive the email but have not (make sure to check your spam!), please email psf-elections@pyfound.org for the PSF Board election or pc-elections@python.org, and we’ll assist you. Please note: If you opted out of emails related to your membership, you did not receive these emails. 

PSF Members should review their communication preferences on psfmember.org if you would like to opt in or out of receiving emails about the PSF Board, PPC elections, or both. Here’s how:

If you had previously opted out of communications from the PSF through psfmember.org and would like to review or change your preference, we encourage you to update them using the instructions above. The PSF only sends a handful of election and fundraising related communications every year via psfmember.org. The PSF newsletter runs through a separate mailing list (and we welcome you to sign up!). 

How to affirm your intention to vote

You can affirm your voting intention by following the steps in our video tutorial:

Need to check your membership status?

Log on to psfmember.org and visit your PSF Member User Information page to see your membership record and status. If you are a voting-eligible member (active Supporting, Contributing, and Fellow members of the PSF) and do not already have a login, please create an account on psfmember.org and then email psf-elections@pyfound.org so we can link your membership to your account. Please ensure you have an account linked to your membership so that we can have the most up-to-date contact information for you in the future. 

PSF Bylaws

Section 4.2 of the PSF Bylaws requires that “Members of any membership class with voting rights must affirm each year to the corporation in writing that such member intends to be a voting member for such year.”

Our motivation is to ensure that our elections can meet quorum as required by Section 3.9 of our bylaws. As our membership has grown, we have seen that an increasing number of Contributing and Fellow members with indefinite membership do not engage with our annual election, making quorum difficult to reach. 

An election that does not reach quorum is invalid. This would cause the whole voting process to be re-held, resulting in fewer voters and an undue amount of effort on the part of the PSF Staff.

Reminders about membership and voting

Reminder: If you were formerly a Managing member, your membership type was changed last year to Contributing per 2024’s Bylaw change that merged Managing and Contributing memberships

Per another recent Bylaw change that allows for simplifying the voter affirmation process by treating past voting activity as intent to continue voting, if you voted last year, you will automatically be added to the 2026 voter roll. Please note: If you removed or changed your email on psfmember.org, you may not automatically be added to this year's voter roll. 

What happens next?

You’ll get an email from OpaVote with a ballot (or two!) on or right before September 1st, and then you can vote!

Check out our PSF Membership page to learn more. If you have questions about membership, nominations, or this year’s Board election, please email psf-elections@pyfound.org or join the PSF Discord for the upcoming Board Office Hours on August 11th, 9 PM UTC. You are also welcome to join the discussion about the PSF Board election on the Python Discuss forum.

July 15, 2026 11:06 AM UTC


Django Weblog

Supporting the Triptych Project

The Django Steering Council — in its role as the DSF's arm for technical governance — has provided a Letter of Collaboration in support of a funding application by Carson Gross and Alex Petros to advance the Triptych Project: three proposals to make HTML itself more expressive, in every browser, by default.

Here's why, and how you can help.

HTML over the wire, and Django

The last few years have seen a move back towards serving multipage applications, with server-rendered templates. The HTMX library has probably had the biggest impact in the Django space, but Unpoly, Turbo, and others are part of the same story: send HTML over the wire, let the browser do what browsers do, and skip the client-side application layer where you don't really need it. It's a simpler model of the web — and it's one that speaks to Django's heart.

This isn't a movement Django has watched from the sidelines. Template partials, added in Django 6.0, were directly inspired by the patterns these libraries make natural.

The Triptych Project

The Triptych Project takes the core insights from HTMX (and the related libraries) and proposes them for the HTML standard itself. Three small additions:

  1. PUT, PATCH, and DELETE methods for forms — completing HTML's HTTP vocabulary.
  2. Button actions — buttons that make HTTP requests without a wrapping form. This is the current focus.
  3. Partial page replacement — links, forms, and buttons that target part of the DOM.

Together these aim to make it possible to build far more of the web with plain HTML — no JavaScript dependency, no library, nothing to ship or maintain.

Button actions

The current proposal (WHATWG #12330, full proposal) adds the action and method attributes to <button>. The canonical example is logout. Today there's no semantic way to write a logout button; you have to wrap it in a form:

<form action=/logout method=POST>
  <button>Logout</button>
</form>

Every Django developer has written this kind of thing. With button actions we could write the simpler single line:

<button action=/logout method=POST>Logout</button>

This isn't abstract for us. The Django admin's submit row holds multiple buttons, and a link disguised as a button:

<div class="submit-row">
  <input type="submit" value="Save" class="default" name="_save">
  <input type="submit" value="Save and add another" name="_addanother">
  <input type="submit" value="Save and continue editing" name="_continue">
  <a href="/admin/auth/user/.../delete/" class="deletelink">Delete</a>
</div>

Here, all the save inputs lead to the same action URL from the wrapping form. The view then branches on the submitted name value. That, of course, works, but we can imagine simpler, more flexible ideas being enabled via the Multi-Action Pages examples in the proposal.

The disguised submit link leads to the deletion confirmation page, where we then submit a form to confirm the action. That's the correct behaviour, but the markup confuses the intent: this isn't (really) a navigation to a new page, it's the first step of an action — deleting the object. The proposal's discussion of Buttons vs Links describes situations we come up against writing applications regularly.

The goal here is simpler patterns that will help us write better markup.

Why we're supporting this

The Django Software Foundation's mission includes a commitment to "advance the state of the art in Web development". Standards work is that in its purest form: an improvement to HTML lands for everyone, in every framework, in every browser, indefinitely.

It's also slow, painstaking work — specification, implementer engagement, web platform tests — that needs sustained attention. Carson and Alex are applying for funds so that people can devote real time to it. Our Letter of Collaboration is a concrete contribution to that application.

How you can help

If your company builds on Django, or indeed any other framework — with HTMX, Unpoly, Turbo, or plain HTML forms — this work benefits you directly. Carson and Alex are seeking non-binding letters of support on official letterhead for the funding application. Details and contacts are on the Triptych Project site.

Individually, do read the proposals, weigh in constructively on the WHATWG issues, and spread the word.

A simpler web is a better web. We're glad to support work that moves HTML in that direction.

July 15, 2026 11:00 AM UTC

July 14, 2026


PyCoder’s Weekly

Issue #743: Stacks & Queues, Django F-Expressions, MCP Clients, and More (2026-07-14)

#743 – JULY 14, 2026
View in Browser »

The PyCoder’s Weekly Logo


Stacks and Queues in Python

This post shows you how to use a Python list for stack operations (last-in, first-out) and a deque from the collections module for queue operations (first-in, first-out).
TREY HUNNER

Nifty Django Feature: F Expressions

Django’s F-Expression provides a way of querying fields from the ORM. They’re particularly handy to traverse relationships in more complex queries.
TIM SCHILLING

Secure Your Code, Wherever, or However You Write It

alt

AI coding agents have blind spots, they reproduce patterns but struggle with security context. AURI by Endor Labs plugs into your editor via MCP, catching flaws, signaling exposed secrets, and spotting malicious dependencies. Ship secure by default. Try AURI Free →
ENDOR LABS sponsor

Testing MCP Servers With a Python MCP Client

Learn how to build a Python MCP client that tests MCP servers from your terminal. List their tools, prompts, and resources, then call each one.
REAL PYTHON course

Quiz: Testing MCP Servers With a Python MCP Client

REAL PYTHON

PEP 797: Shared Object Proxies (Rejected)

PYTHON.ORG

Django Security Releases Issued: 6.0.7 and 5.2.16

DJANGO SOFTWARE FOUNDATION

Articles & Tutorials

Constructing and Judging Modern Agentic Workflows

How can you improve your LLM agent systems through specification enrichment? What are the advantages of having an LLM act as a judge within an agent system? This week on the show, Senior IEEE Member and Quality Engineer Suneet Malhotra joins us to discuss building and evaluating agentic architecture.
REAL PYTHON podcast

What for x in y Hides From You

An explanation of how Python’s for x in y syntax is a thin wrapper around the iterator protocol: iter(...), next(...), and StopIteration. Using examples from Memphis, a Python interpreter written in Rust, it shows how this design makes lists, ranges, and generators feel unified rather than magical.
TYLER GREEN • Shared by Tyler Green

Stop stitching 5 different systems together for your agents.

alt

Dev teams spend weeks fitting together vector DBs, graph DBs, relational stores, filesystem primitives and optimizing cache. How about everything via a single API? P90 sub-200ms recall - the fastest graph database to unlock true agent memory, knowledge graphs and user-personalization. Click Here to Try HydraDB Out for Free
HYDRADB sponsor

Building a Fast HTML Toolkit in C for Python

turbohtml began as a patch to speed up html.escape and html.unescape in CPython. When the core team declined to maintain SIMD in the standard library, it became a third party library instead. This post is its story.
BERNÁT GÁBOR • Shared by Bernát Gábor

How to Publish to PyPI Using GitHub Actions Securely

If you’re using GitHub Actions to publish your Python libraries, this article is for you. Learn what are the best practices to ensure the process is secure and what tools you can use to validate it.
BRETT CANNON

Python 3.15’s Ultra-Low Overhead Interpreter Profiling Mode

Ken is one of the key contributors to the experimental JIT. This post talks about how Python 3.15’s interpreter profiling mode is helping them figure out what is working with the JIT and what isn’t.
KEN JIN

PEP 814: Add Frozendict Built-in Type

Victor has been involved in multiple attempts to add a frozen dict type to Python. His latest PEP has been accepted and frozen dictionaries will be added to Python 3.15. This post is his story.
VICTOR STINNER

How to Clean Messy CSV Files With Python

This introductory article shows you how to do data cleaning on CSV files using pandas, including dealing with duplicate rows, missing values, mixed date formats, and more.
ABID ALI AWAN,

PSF News: Security, Elections, and PyCon US 2026

This post is the monthly news round up of all things PSF. It covers a re-cap of PyCon US, several security fixes, updates from the PSF board, and more.
PYTHON SOFTWARE FOUNDATION

How to Use GitHub

Learn how to use GitHub step by step to create a remote repository, push your local Python project, and collaborate with others using GitHub Issues.
REAL PYTHON

Quiz: How to Use GitHub

REAL PYTHON

Projects & Code

pyStrich: 1D and 2D Barcode Generator Library

GITHUB.COM/MMULQUEEN • Shared by Michael Mulqueen

Snakie: Cross-Platform MicroPython IDE

GITHUB.COM/KEVINMCALEER

Notion2Pandas: Import Notion Databases Into pandas

GitLab.com
GITLAB.COM/JAEGER87

envgap: Find Gaps Between .env, Shell Env, and Python Code

GITHUB.COM/PINAK-DATTA • Shared by Pinak Datta

CLI-based Text-to-Speech Tool

GITHUB.COM/REALPACIFIC • Shared by Prashant Barahi

Events

Weekly Real Python Office Hours Q&A (Virtual)

July 15, 2026
REALPYTHON.COM

PyData Bristol Meetup

July 16, 2026
MEETUP.COM

PyLadies Dublin

July 16, 2026
PYLADIES.COM

DjangoGirls Tamale 2026

July 17 to July 19, 2026
DJANGOGIRLS.ORG

EuroSciPy 2026

July 18 to July 24, 2026
EUROSCIPY.ORG

PyData PyCon Armenia 2026

July 24 to July 26, 2026
PYCON.AM


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

alt

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

July 14, 2026 07:30 PM UTC


Peter Bengtsson

How to use a list/tuple/array in Django with a raw SQL cursor

This does not work:


from django.db import connection

list_of_values = [1, 2, 3]
with connection.cursor() as cursor:
    cursor.execute("""
        SELECT *
        FROM my_model_table
        WHERE some_value IN %s
    """, [
        tuple(list_of_values),
    ])
    results = cursor.fetchall()

It will give you:

django.db.utils.ProgrammingError: syntax error at or near "'(1,2,3)'"
LINE 4:         WHERE id IN '(1,2,3)'

It used to work with psycopg v2. Now, in psycopg v3, you have to use the ANY operator. See "You cannot use IN %s with a tuple"

This will work:


from django.db import connection

list_of_values = [1, 2, 3]
with connection.cursor() as cursor:
    cursor.execute(
        """
        SELECT *
        FROM my_model_table
        WHERE some_value = ANY(%s)
    """,
        [
            list_of_values,
        ],
    )
    results = cursor.fetchall()

Note the ANY(%s), and instead of a list that has a tuple, it's a list that has a list.

What About a List of Strings

Consider...


from django.db import connection

-list_of_values = [1, 2, 3]
+list_of_values = ['foo', 'bar', 'fiz']
with connection.cursor() as cursor:
    cursor.execute(
        """
        SELECT *
        FROM my_model_table
        WHERE some_value = ANY(%s)
    """,
        [
            list_of_values,
        ],
    )
    results = cursor.fetchall()

That will result in:

django.db.utils.DataError: invalid input syntax for type integer: "foo"
LINE 4:         WHERE some_value = ANY('{foo,bar,fiz}')

My solution was to rewrite the SQL string itself and treat each value as a parameter each. In other words, the SQL string, before being sent to cursor.execute(...) will contain something like this:


AND (
  some_value = % OR
  some_value = % OR
  some_value = % OR
  some_value = % OR
  -- ...etc...
  some_value = %
)

This will work and is safe:


from django.db import connection

list_of_values = ["foo", "bar", "fiz"]
with connection.cursor() as cursor:
    cursor.execute(
        f"""
        SELECT *
        FROM my_model_table
        WHERE ({" OR ".join(["some_value = %s" for _ in list_of_values])})
    """,
        list_of_values,
    )
    results = cursor.fetchall()

July 14, 2026 01:14 PM UTC


Mike Driscoll

Python 101 3rd Edition Kickstarter Launch

Learn Python with a Book Designed for Beginners

Hello! I’m Michael Driscoll, and I’m excited to announce the third edition of Python 101.

For years, Python 101 has helped readers take their first steps into programming. Whether you’re a complete beginner, a student, or someone looking to learn Python for work or personal projects, the goal has always been the same: make learning Python approachable, practical, and enjoyable.

Python has continued to evolve, and it’s time for the book to evolve with it. This Kickstarter will help fund the writing, editing, production, and publication of the fully updated third edition.

Why a Third Edition?

Python has changed significantly since the previous edition. New language features, updated best practices, and improvements throughout the ecosystem make this the right time for a comprehensive update.

The third edition will include:

The goal isn’t simply to revise the previous edition—it’s to create the best beginner-focused version of Python 101 yet.

Who Is This Book For?

This book is designed for:

No prior programming knowledge is required.

Why Kickstarter?

Kickstarter allows readers to directly support the creation of the book while helping ensure it receives the time and attention needed for a high-quality release.

Funding will help cover:

Most importantly, it allows me to focus on creating the strongest edition possible.

Rewards

Depending on your pledge level, rewards may include:

Project updates will be shared throughout the process so backers can follow the book’s progress.

Thank You

Whether you back this project or simply share it with others, your support means a great deal.

Writing technical books is a collaborative effort between authors and readers. Your encouragement has helped make previous editions successful, and I’m excited to bring an updated Python 101 to the next generation of Python learners.

Thank you for helping make the third edition possible.

Back the project

The post Python 101 3rd Edition Kickstarter Launch appeared first on Mouse Vs Python.

July 14, 2026 01:05 PM UTC


PyPodcats

Trailer: Episode 12 With Juanita Gomez

A preview of our chat with Juanita Gomez. Watch the full episode on July 17, 2026A preview of our chat with Juanita Gomez. Watch the full episode on July 17, 2026

Sneak Peek of our chat with Juanita Gomez, hosted by Cheuk Ting Ho and Mariatta Wijaya.

Juanita is a Ph.D. candidate in Computer Science at UC Santa Cruz, where her research focuses on improving the security of scientific open source software. She is a former developer of the Spyder IDE, one of the community managers for the Scientific Python project, and part of the organizing committee for the SciPy conference.

In this episode, Juanita shares how she went from making music videos on YouTube to creating friendlier documentation for Spyder, her research on open source security, practical security tips for maintainers, and her journey navigating imposter syndrome as a woman and Latina in tech. Plus: The X Factor, Shakira, and singing on stage at SciPy.

Full episode is coming on July 17th, 2026! Subscribe to our podcast now!

July 14, 2026 01:00 PM UTC


Python Bytes

#488 tau - it's 2pi and it writes code

<strong>Topics covered in this episode:</strong><br> <ul> <li><strong>The trusted-publishing debate: how to do it right vs. why you shouldn't trust it</strong></li> <li><strong><a href="https://link.mail.beehiiv.com/ss/c/u001.nhis-D9RLtwtIum5I0BjhZ22Z4E_bpBKQN-16RenQ3ws2TZPhzEfwjZMSGiGAQx3p407RO5QUnbYLEGjQnorGAGD5oCA5TGTjsy6RbCrTYDXJN8BUDTRz-W0ZLYlAKrwzGPByECjf7lwVCl3nZRCGXvvhp8TvBLNfJRgnY-wJ9ktogLFr2YqqQyXhwmgzpa-6HsPhylQ_9BWTK3teRtSwrRXrLfxrVWwQXEG6Zbqaz5nRGc6xNV7pMdWvEGpfoBMUwbGl0aGZ40ZX_cYbR-sgKDJdl0v95gGqtcySNXfNgokF54k8Xao40CrloFhcFtX/4s6/5odqdEikSeKZEjId8lTcSg/h29/h001.6m_9ZXKKfEi-Sx1OcsN8EInQX8eEjhrHaS4h_Yo0T7o?featured_on=pythonbytes">JupyterLab 4.6 and Notebook 7.6 are out!</a></strong></li> <li><strong><a href="https://twotimespi.dev/?featured_on=pythonbytes">Tau</a> – new small, readable terminal coding agent</strong></li> <li><strong><a href="https://docs.djangoproject.com/en/6.0/topics/tasks/?featured_on=pythonbytes">Django Tasks and Django 6.1</a></strong></li> <li><strong>Extras</strong></li> <li><strong>Joke</strong></li> </ul><a href='https://www.youtube.com/watch?v=lJpOzcVTlho' style='font-weight: bold;'data-umami-event="Livestream-Past" data-umami-event-episode="488">Watch on YouTube</a><br> <p><strong>About the show</strong></p> <p>Sponsored by us! Support our work through:</p> <ul> <li>Our <a href="https://training.talkpython.fm/?featured_on=pythonbytes"><strong>courses at Talk Python</strong></a></li> <li>Consulting from <a href="https://sixfeetup.com/?featured_on=pythonbytes"><strong>Six Feet Up</strong></a></li> </ul> <p><strong>Connect with the hosts</strong></p> <ul> <li>Michael: <a href="https://fosstodon.org/@mkennedy">Mastodon</a> / <a href="https://bsky.app/profile/mkennedy.codes?featured_on=pythonbytes">BlueSky</a> / <a href="https://x.com/mkennedy?featured_on=pythonbytes">X</a> / <a href="https://www.linkedin.com/in/mkennedy/?featured_on=pythonbytes">LinkedIn</a></li> <li>Calvin: <a href="https://sixfeetup.social/@calvin?featured_on=pythonbytes">Mastodon</a> / <a href="https://bsky.app/profile/calvinhp.com?featured_on=pythonbytes">BlueSky</a> / <a href="https://x.com/calvinhp?featured_on=pythonbytes">X</a> / <a href="https://www.linkedin.com/in/calvinhp/?featured_on=pythonbytes">LinkedIn</a></li> <li>Show: <a href="https://fosstodon.org/@pythonbytes">Mastodon</a> / <a href="https://bsky.app/profile/pythonbytes.fm">BlueSky</a> / <a href="https://x.com/PythonBytes?featured_on=pythonbytes">X</a></li> </ul> <p>Join us on YouTube at <a href="https://pythonbytes.fm/stream/live"><strong>pythonbytes.fm/live</strong></a> to be part of the audience. Usually <strong>Tuesday at 7am PT</strong>. Older video versions available there too.</p> <p>Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to <a href="https://pythonbytes.fm/friends-of-the-show">our friends of the show list</a>, we'll never share it.</p> <p><strong>Calvin #1:</strong> The trusted-publishing debate: how to do it right vs. why you shouldn't trust it</p> <p>https://snarky.ca/how-to-publish-to-pypi-using-github-actions-securely/ (Brett Cannon) and https://blog.yossarian.net/2026/07/07/You-shouldnt-trust-trusted-publishing (W<strong>illiam Woodruff</strong>)</p> <ul> <li>Trusted Publishing (PyPI's OIDC-based auth scheme, also now used by npm, RubyGems, <a href="http://crates.io?featured_on=pythonbytes">crates.io</a>, NuGet) replaces long-lived API tokens with short-lived, auto-scoped credentials tied to CI/CD machine identity.</li> <li>Yossarian's post: it's purely an <em>authentication</em> mechanism between a machine identity and a package — it says nothing about package safety or quality. PyPI deliberately avoids any "verified/trusted" badge for it, unlike its verified-URL checkmarks.</li> <li>Same logic applies to PyPI attestations: anyone can sign with any machine identity they control, so an attestation's presence isn't itself a trust signal.</li> <li>Bottom line from that post: don't confuse "trusted" (machine-to-machine) with "trustworthy" (human judgment about the package).</li> <li><a href="http://Snarky.ca?featured_on=pythonbytes">Snarky.ca</a>'s companion piece is more practical: given GitHub Actions compromises in the news, the real fix is 3 concrete steps — run zizmor to lock down workflow permissions/checkout credentials and pin actions to commit hashes, adopt Trusted Publishing to eliminate stored PyPI tokens, and require manual approval via a GitHub environment before any publish job runs.</li> <li>Takeaway for listeners: Trusted Publishing is good hygiene for <em>how</em> you authenticate to PyPI, but it's not a substitute for securing your CI pipeline itself — or for actually vetting the packages you install.</li> </ul> <p><strong>Michael #2: <a href="https://link.mail.beehiiv.com/ss/c/u001.nhis-D9RLtwtIum5I0BjhZ22Z4E_bpBKQN-16RenQ3ws2TZPhzEfwjZMSGiGAQx3p407RO5QUnbYLEGjQnorGAGD5oCA5TGTjsy6RbCrTYDXJN8BUDTRz-W0ZLYlAKrwzGPByECjf7lwVCl3nZRCGXvvhp8TvBLNfJRgnY-wJ9ktogLFr2YqqQyXhwmgzpa-6HsPhylQ_9BWTK3teRtSwrRXrLfxrVWwQXEG6Zbqaz5nRGc6xNV7pMdWvEGpfoBMUwbGl0aGZ40ZX_cYbR-sgKDJdl0v95gGqtcySNXfNgokF54k8Xao40CrloFhcFtX/4s6/5odqdEikSeKZEjId8lTcSg/h29/h001.6m_9ZXKKfEi-Sx1OcsN8EInQX8eEjhrHaS4h_Yo0T7o?featured_on=pythonbytes">JupyterLab 4.6 and Notebook 7.6 are out!</a></strong></p> <p>Michał Krassowski's rundown - a chunky minor release: 68 features, 97 bug fixes, 95 contributors, one of the biggest ever.</p> <ul> <li><strong>Scratchpad console</strong> (Notebook 7.6 headliner) - a console next to your notebook sharing its kernel, for throwaway experiments. Ctrl+B.</li> <li><strong>Jump to last-edited cell</strong> - new commands hop through recently edited cells.</li> <li><strong>File browser glow-up</strong> - Date Created column, editable breadcrumbs with Tab-completion, and Open in Terminal.</li> <li><strong>Debugger</strong> - sources open in the main area, floating step/continue overlay, live kernel-sources filter.</li> <li><strong>Custom layouts (Lab)</strong> - activity bar top/bottom, draggable panels, four-way tab splits, per-panel Ctrl+scroll zoom.</li> <li><strong>~5x faster extension builds</strong> - webpack → Rspack, and <code>jupyter-builder</code> means no full Lab install needed to build extensions.</li> <li><strong>Keyboard/a11y</strong> - add shortcuts from the UI (no JSON), Find &amp; Replace in Edit menu (Ctrl+H).</li> </ul> <p><strong>Calvin #3: <a href="https://twotimespi.dev/?featured_on=pythonbytes">Tau</a></strong> – new small, readable terminal coding agent</p> <ul> <li><strong>Tau</strong> – new small, readable terminal coding agent (Python 3.12+), built as both a working tool and a teaching project for how coding agents work under the hood</li> <li>Install via <code>uv tool install tau-ai</code>, <code>pipx</code>, or <code>pip</code>; ships a <code>tau</code> CLI</li> <li>Three-layer architecture: <code>tau_ai</code> (provider-neutral model layer) → <code>tau_agent</code> (reusable "brain": messages, tools, events, loop) → <code>tau_coding</code> (CLI/TUI, file &amp; shell tools, sessions)</li> <li>Supports OpenAI, Anthropic, OpenAI Codex, OpenRouter, Hugging Face, and custom/local OpenAI-compatible endpoints</li> <li>Built-in tools (read/write/edit/bash), durable JSONL sessions with resume/branching, project instructions via <code>AGENTS.md</code>, and context compaction</li> <li>Core harness is UI-agnostic — same brain can power the TUI, print mode, or a custom frontend — usable as a standalone library too</li> </ul> <p><strong>Michael #4: <a href="https://docs.djangoproject.com/en/6.0/topics/tasks/?featured_on=pythonbytes">Django Tasks and Django 6.1</a></strong></p> <ul> <li><strong>Django 6.0 finally ships first-party background tasks</strong> (<code>django.tasks</code>) - out of Jake Howard's DEP 14, accepted May 2024, after two decades of everyone bolting on Celery/RQ/Huey.</li> <li><strong>It's an API, not a worker.</strong> Django handles task definition, validation, queuing, and result storage - it does not execute them. You bring the backend.</li> <li><strong>The default backend traps people.</strong> <code>ImmediateBackend</code> runs tasks inline on the request thread and blocks until done - so out of the box <code>.enqueue()</code> backgrounds nothing (a 5-second task means a 5-second response). The other built-in, <code>DummyBackend</code>, runs nothing at all. Both are dev/test only.</li> <li><strong>Nice API otherwise:</strong> slap <code>@task</code> on a function, call <code>.enqueue()</code>, get back a <code>TaskResult</code> you look up later by id - with async twins like <code>aenqueue()</code>. Gotcha: args and return values must survive a JSON round-trip, so a tuple sneakily comes back as a list.</li> <li><strong>The community local backend to know: <code>django-tasks-local</code></strong> by Chris Beaven (SmileyChris). A <code>ThreadPoolExecutor</code> backend that gives real background threads with zero infrastructure - no Redis, no Celery, no database - plus a <code>ProcessPoolBackend</code> for CPU-bound work → <a href="http://github.com/lincolnloop/django-tasks-local?featured_on=pythonbytes">github.com/lincolnloop/django-tasks-local</a></li> <li><strong>Its catch:</strong> results live in memory, so pending tasks vanish on restart or deploy. Great for dev and low-traffic production; for persistence, drop to Jake Howard's <code>django-tasks</code> (DatabaseBackend + worker command).</li> </ul> <p><strong>Extras</strong></p> <p>Calvin:</p> <ul> <li><a href="https://hugovk.dev/blog/2026/fixing-dict/?featured_on=pythonbytes">Fixing the dictionary with Python 3.14</a> — Hugo van Kemenade stumbled on - and got fixed - a markup bug in the OED's own citation of a 1706 use of the pi symbol.</li> </ul> <p>Michael:</p> <ul> <li><a href="https://bunny.net/blog/were-making-bunny-dns-free/?featured_on=pythonbytes">Bunny DNS is now free</a></li> </ul> <p><strong>Jokes:</strong></p> <ul> <li><strong>What's the object-oriented way to become wealthy?</strong> Inheritance</li> <li><strong>To understand what recursion is...</strong> You must first understand what recursion is</li> <li><strong>3 SQL statements walk into a NoSQL bar.</strong> Soon, they walk out They couldn't find a table.</li> </ul>

July 14, 2026 08:00 AM UTC

July 13, 2026


Django Weblog

Explore the DjangoCon US 2026 Speaker Lineup and Reserve Your Spot

DjangoCon US 2026 is just around the corner, and now is the perfect time to start planning your conference experience.

Our speaker lineup is now available, featuring talks from Django contributors, maintainers, educators, and community members covering everything from web development and APIs to deployment, security, testing, AI, and the future of the Django ecosystem.

Whether you're attending your first DjangoCon US or returning to reconnect with friends and colleagues, you'll find opportunities to learn, share ideas, and meet people from across the global Django community.

Beyond the talks, your conference registration includes access to tutorials, Open Spaces, community sprints, hallway conversations, and social events that make DjangoCon US a unique experience.

If you haven't registered yet, there's still time to join us in Chicago, August 24–28.

Register for DjangoCon US 2026: https://2026.djangocon.us

Browse the speaker lineup: https://2026.djangocon.us/news/announcing-lineup/

We'll be sharing more updates in the coming weeks, including the full conference schedule, travel reminders, and everything you need to make the most of your time at DjangoCon US.

We look forward to seeing you in Chicago this August!

July 13, 2026 10:51 PM UTC


Hugo van Kemenade

Security: line goes up

Like many other projects, CPython is experiencing a huge increase in security reports.

CVEs per year #

Last month, PSF Security Developer-in-Residence Seth Larson posted a chart of CVEs per year, showing a large increase in 2026:

2007-2024 all below 20 per year. 2025 and year-to-date 2026 had just over 20, with 2026 extrapolated to around 65.

But this only represents the output of security work, and doesn’t show all the work dealing with incoming reports. Many are closed and dealt with as non-security bug reports instead; many are closed as neither security nor bug reports.

Let’s reveal some of this unseen work by the Python Security Response Team (PSRT).

GHSAs by month #

Here are the number of incoming GitHub Security Advisories (GHSA) reports created since July 2024:

Chart of new security reports. Single digits or zero per month from 2024, increasing to around 40 in 2026.

GHSAs by year #

Here is the same thing by year, and remembering we’re only halfway through 2026:

18 in 2024, 41 in 2025, 175 so far in 2026.

Email reports by month #

We’ve only fairly recently been encouraging new reports be made via GHSA. Before this, they were usually made by email. The next chart is the number of email discussions (or threads) and participants by month:

Number of discussions and participants per month follow each other closely. Single digits from 2014, around 20 by 2019, 40 by 2021 and 2022, a dip to 15 for 2023 to 2025, up to 50 for 2026 so far.

Thanks #

Big thanks to Seth for all his work as Security Developer-in-Residence: helping shepherd all these reports, developing a security policy to improve the quality of incoming reports and help us assess them, and defining PSRT membership and responsibilities via PEP 811 to build an active team. All this would be much harder without his guidance! And thanks to Alpha-Omega for sponsoring his position at the PSF.

July 13, 2026 08:44 PM UTC


Talk Python to Me

#555: Marimo Pair - A Canvas for Agent + Developers Collaboration

Coding agents have gotten really good at one kind of work. You scope a feature, edit some files, run the tests, ship it. It all happens on disk. But that is not how data work feels. You load something, you look at it, you run a cell, you watch how it responds, and you decide the next move from whatever is sitting in memory. And until now, your agent couldn't see any of that. It only saw the files. Never the live state. <br/> <br/> This episode, that wall comes down. marimo pair drops a coding agent right inside a running notebook, with full access to every variable Python is holding in memory. The notebook becomes a shared canvas. You point, it runs the code. You tell it to zoom in on the Picasso paintings, and the chart just updates. No MCP tools to wire up, no schema to describe. Just Python, and an agent that can finally see what you see. Trevor Manz is back to walk us through it.<br/> <br/> <strong>Episode sponsors</strong><br/> <br/> <a href='https://talkpython.fm/sentry'>Sentry Error Monitoring, Code talkpython26</a><br> <a href='https://talkpython.fm/training'>Talk Python Courses</a><br/> <br/> <h2 class="links-heading mb-4">Links from the show</h2> <div><strong>marimo pair</strong>: <a href="https://marimo.io/pair?featured_on=talkpython" target="_blank" >marimo.io/pair</a><br/> <br/> <strong>Course transcripts announcement</strong>: <a href="https://talkpython.fm/blog/posts/announcing-german-subtitles-on-courses/" target="_blank" >talkpython.fm/blog</a><br/> <br/> <strong>anywidget: Jupyter Widgets made easy</strong>: <a href="https://talkpython.fm/episodes/show/530/anywidget-jupyter-widgets-made-easy" target="_blank" >talkpython.fm</a><br/> <strong>marimo</strong>: <a href="https://marimo.io/?featured_on=talkpython" target="_blank" >marimo.io</a><br/> <strong>blog</strong>: <a href="https://marimo.io/blog/marimo-pair?featured_on=talkpython" target="_blank" >marimo.io</a><br/> <strong>GitHub</strong>: <a href="https://github.com/marimo-team/marimo-pair?featured_on=talkpython" target="_blank" >github.com</a><br/> <strong>given this</strong>: <a href="https://martinalderson.com/posts/wall-street-lost-285-billion-because-of-13-markdown-files/?featured_on=talkpython" target="_blank" >martinalderson.com</a><br/> <strong>llms.txt</strong>: <a href="https://talkpython.fm/llms.txt" target="_blank" >talkpython.fm</a><br/> <strong>mcp</strong>: <a href="https://talkpython.fm/ai-integration" target="_blank" >talkpython.fm</a><br/> <strong>cli</strong>: <a href="https://talkpython.fm/blog/posts/talk-python-now-has-a-cli/" target="_blank" >talkpython.fm</a><br/> <strong>open issues</strong>: <a href="https://github.com/marimo-team/marimo-pair/issues?featured_on=talkpython" target="_blank" >github.com</a><br/> <strong>Discord</strong>: <a href="https://marimo.io/discord?featured_on=talkpython" target="_blank" >marimo.io</a><br/> <strong>Marimo Pair</strong>: <a href="https://marimo.io/pair?featured_on=talkpython" target="_blank" >marimo.io</a><br/> <strong>OpenCode</strong>: <a href="https://opencode.ai?featured_on=talkpython" target="_blank" >opencode.ai</a><br/> <strong>AI Tooling for Software Engineers in 2026</strong>: <a href="https://newsletter.pragmaticengineer.com/p/ai-tooling-2026?featured_on=talkpython" target="_blank" >newsletter.pragmaticengineer.com</a><br/> <br/> <strong>Watch this episode on YouTube</strong>: <a href="https://www.youtube.com/watch?v=6LAQnnW-gTY" target="_blank" >youtube.com</a><br/> <strong>Episode #555 deep-dive</strong>: <a href="https://talkpython.fm/episodes/show/555/marimo-pair-a-canvas-for-agent-developers-collaboration#takeaways-anchor" target="_blank" >talkpython.fm/555</a><br/> <strong>Episode transcripts</strong>: <a href="https://talkpython.fm/episodes/transcript/555/marimo-pair-a-canvas-for-agent-developers-collaboration" target="_blank" >talkpython.fm</a><br/> <br/> <strong>Theme Song: Developer Rap</strong><br/> <strong>🥁 Served in a Flask 🎸</strong>: <a href="https://talkpython.fm/flasksong" target="_blank" >talkpython.fm/flasksong</a><br/> <br/> <strong>---== Don't be a stranger ==---</strong><br/> <strong>YouTube</strong>: <a href="https://talkpython.fm/youtube" target="_blank" ><i class="fa-brands fa-youtube"></i> youtube.com/@talkpython</a><br/> <br/> <strong>Bluesky</strong>: <a href="https://bsky.app/profile/talkpython.fm" target="_blank" >@talkpython.fm</a><br/> <strong>Mastodon</strong>: <a href="https://fosstodon.org/web/@talkpython" target="_blank" ><i class="fa-brands fa-mastodon"></i> @talkpython@fosstodon.org</a><br/> <strong>X.com</strong>: <a href="https://x.com/talkpython" target="_blank" ><i class="fa-brands fa-twitter"></i> @talkpython</a><br/> <br/> <strong>Michael on Bluesky</strong>: <a href="https://bsky.app/profile/mkennedy.codes?featured_on=talkpython" target="_blank" >@mkennedy.codes</a><br/> <strong>Michael on Mastodon</strong>: <a href="https://fosstodon.org/web/@mkennedy" target="_blank" ><i class="fa-brands fa-mastodon"></i> @mkennedy@fosstodon.org</a><br/> <strong>Michael on X.com</strong>: <a href="https://x.com/mkennedy?featured_on=talkpython" target="_blank" ><i class="fa-brands fa-twitter"></i> @mkennedy</a><br/></div>

July 13, 2026 05:07 PM UTC