social.dk-libre.fr is a Fediverse instance that uses the ActivityPub protocol. In other words, users at this host can communicate with people that use software like Mastodon, Pleroma, Friendica, etc. all around the world.
This server runs the snac software and there is no automatic sign-up process.
Python Tip #174 (of 365):
Python modules are cached.
The first time each Python process imports a module, it caches it in sys.modules.
The second time you import the same module, Python returns the cached module object without re-running the module code.
This means if you edit a file and then re-import it in the same REPL session, your changes won't appear.
Re-importing a module does not reload it.
The simplest fix: RESTART PYTHON.
🧵 (1/2)
Reminder: The PSF's Strategic Plan full draft is available and we want your feedback! Check out the full draft and tell us: Are these the right goals? Is anything missing?
The feedback window closes in a couple of days on June 25, 2026, AoE.
https://pyfound.blogspot.com/2026/06/psf-strategic-plan-2026-draft-open-for.html
RE: https://fosstodon.org/@ThePSF/116800035337786641
Completely remediating this report was a massive coordinated team effort and would not be possible without paid security staffing at the PSF. Confirmed remediation in 48 hours from report with extensive follow-up auditing, hardening, and coordinating a third-party audit from Trail of Bits.
Thank you to Alpha-Omega for funding my time and OpenAI for funding the audit through "Patch the Planet".
Please see the write-up for details.
#opensource #oss #security #supplychain #python
The Python Security Response Team patched an authentication bypass in the python.org release management API in under 48 hours. No evidence of exploitation, all artifacts verified.
Check out the full writeup 👇
https://pyfound.blogspot.com/2026/06/mitigated-api-bypass-for-download-metadata-python-dot-org.html
The Python Security Response Team patched an authentication bypass in the python.org release management API in under 48 hours. No evidence of exploitation, all artifacts verified.
Check out the full writeup 👇
https://pyfound.blogspot.com/2026/06/mitigated-api-bypass-for-download-metadata-python-dot-org.html
🐍🚀 Out now: Python 3.15 beta 3!
💤 Lazy imports!
🧊 frozendict builtin!
💂 sentinel builtin!
📉 Tachyon profiler!
🖼️ Frame pointers everywhere!
🛅 Unpacking in comprehensions!
🗣️ UTF-8 as the default encoding!
🆕 Package startup config files!
⌨️ TypedDict and TypeForm!
🐎 Faster JIT!
🎨 More colour!
🚌 & more!
Library maintainer? We *strongly encourage* you to add 3.15 to your CI and test during the beta. And send us those bugs reports!
https://discuss.python.org/t/python-3-15-0-beta-3-is-here/107866?u=hugovk
#Python #Python315 #CPython #release
The supplemental June edition of the PSF Board Office Hour is about to begin 🐍 🗒️ 1 PM UTC. We welcome you to join us to share how we can help your community, express your perspectives, and we'd love to receive your questions and feedback about the ongoing strategic planning at the PSF! #python
https://pyfound.blogspot.com/2025/10/a-new-psf-board-another-year-of-psf.html
So the next time you find yourself making a list of lists or flattening a list of lists, try out the comprehension approach.
Read more 👉 https://trey.io/aeo9fg
Python Tip #173 (of 365):
Use _ to see the previous REPL result.
Say you ran an expression in the REPL and only decided AFTER you ran it that you want to capture the result:
>>> 2**50
1125899906842624
This is what the REPL's magical _ variable is for.
The last result the REPL generated is stored in the _ variable.
So you can just point a different variable to that value:
>>> n = _
>>> n
1125899906842624
This week's tips are all about the Python REPL.
Out now: linkotron 0.7!
CLI to format links in a shorter format.
🖇️ Format regular links
🔗 Format GHSA links -- thanks @stanfromireland!
🖇️ Add support for Python 3.15-3.16
🔗 Stop testing experimental 3.13t
Maybe one day I'll remember how to write reStructuredText links but now I don't need to:
❯ linkotron example.com --rst
Copied! `example.com <https://example.com>`__
Out now: PrettyTable 3.18!
Library to display tabular data in a visually appealing ASCII table format.
Lots of stuff here, including performance improvements, some thanks to improvements in wcwidth dependency.
Add support for:
Python 3.16
reStructuredText tables
multiline headers
captions in Markdown
And more!
https://github.com/prettytable/prettytable/releases/tag/3.18.0
#Python #release #PrettyTable
🐍🅰️ Out now, Python 3.15 alpha 6!
PEP 799: A high-frequency, low-overhead, statistical sampling profiler
PEP 798: Unpacking in comprehensions with * and **
PEP 686: Python now uses UTF-8 as the default encoding
PEP 782: A new PyBytesWriter C API to create a Python bytes object
PEP 728: TypedDict with typed extra items
The JIT compiler has been significantly upgraded with up to 7-8% speedup
🧊 Just two more alphas until the feature freeze! 🧊
https://discuss.python.org/t/python-3-15-0-alpha-6/106122
#Python #Python315 #release
#HIRING! Senior Engineer, #python based full stack but leaning to devops/infra. 70/30 would be my ideal split. Fully remote UK only, £63,000 non negotiable sadly, but ~20% pension on top. Closing date: WEDS NOON! So get in touch (thayer@team-prime.com) asap if this might be you.
Org: healthcare, data, ~30 person team. Zero AI currently in place, but some may be implemented very gently/ethically/thoughtfully over the next year, or not!
Would esp suit someone who prefers chill vs rocket ship.
Watch PSF PyPI Safety & Security Engineer @miketheman's talk from Open Source Summit NA 2026: Trusted Publishing uses OIDC to generate short-lived tokens from CI/CD. No passwords. No tokens to rotate. No secrets in repos.
TIL about #python named escapes: "\N{FIGURE SPACE}" is equivalent to and more self-explanatory than "\u2007"
“Dataclasses allow us to create friendly classes while writing less boilerplate code.”
Read more 👉 https://pym.dev/friendly-classes/
Python Tip #172 (of 365):
Know your object introspection tools
When you're in an interactive Python environment remember that these 4 tools can be helpful for introspecting the state of your Python process:
1. type
2. help
3. dir
4. vars
type shows the class of an object (the terms "class" and "type" are synonyms in Python).
If you have a mystery object, type can tell you what it is:
>>> type(letter_counts)
<class 'collections.Counter'>
🧵 (1/4)
RE: https://mastodon.social/@coredispatch/116777745023446095
If you are interested in the beating hearts of the #Python community (the language core, the PSF, and other things), then reading @coredispatch is well worth your time, it is always informative!
Customize PDB with a ~/.pdbrc file.
You can make a ~/.pdbrc file to add your own commands to the Python debugger.
This ISN'T a Python file, so it's a bit tricky to create, but spending a few minutes making one is well worth it.
At startup, PDB runs commands from a ~/.pdbrc file.
The handiest thing to put there are custom PDB aliases.
🧵 (1/4)
I was told about this blog site, a couple of weeks ago. There are interesting pages listed here
The subjects vary in the manner as seen in the first page (check the screencaps)
## What I really like about this place, is that it loads blazingly fast
I also love the fact that you can use browsers in your,
* bash
* csh
* ksh
* zsh
* sh
* fish
* without any bloat just like browsing should be, everywhere
https://rldane.space/junited-2026.html
Thank you @rl_dane
#Blog #site #fast #HTML #great #cool #sweet #nice #programming #Python
An #introduction perhaps?
I’m this middle-aged dad from Germany. I have a wonderful partner, 4 kids and a cat.
I care about society and technology. A retired #FOSS activist, these days I work at a globocorp doing IT stuff for trains 🚄
My interests include baking #bread, #fermenting stuff, paddling a whitewater #kayak, n00bing around with #Python, #RaspberryPi and #arduino, and oh so many books.
There’s never enough time, and I haven’t been bored in more than a decade.
Python Tip #170 (of 365):
Use b to set a breakpoint while you're in PDB
You can use the b command to set a breakpoint at a certain line of code:
(Pdb) b 4
Breakpoint 1 at script.py:4
But why...?
Why not just add another breakpoint() call?
Well, imagine you've entered PDB via post-mortem debugging (see tip 154 from yesterday).
You've realized once you're IN PDB that it would be useful to pause on a particular line.
The b command makes that easy!
🧵 (1/2)
“You can make a self-documenting expression by putting an = sign at the end of an f-string's replacement field (the part between { and }).”
Read more 👉 https://pym.dev/debugging-with-f-strings/
Ce mardi 30 juin 2026 à 18h30, je présenterai le fonctionnement de Trognoncal, le moteur d'agenda culturel participatif que je développe depuis plus de trois ans pour propulser https://pommesdelune.fr
Ça se passera au bar Fermenté.e, et même si on ne rentrera pas trop dans la technique, je présenterai tout de même pas mal d'éléments du fonctionnement interne.
Tout ça est organisé par David Rigaudie / PyClermont, et il reste encore quelques places :
https://www.meetup.com/pyclermont/events/315067285/
Après 20h, on invite toutes les personnes intéressées par l'agenda à venir partager un moment de convivialité pour la fin de la deuxième saison de pommes de lune.
La communauté Python au Togo @pytogo_org lève des fonds pour offrir des bourses à 100 étudiant·e·s pour participer à la prochaine PyCon Togo.
J'ai été invité à parler de ma relation à #Python lors d'un stream cet après midi : https://inv.thepixora.com/watch?v=U1a-crY7xGs
Et pour donner des sous, c'est là : https://pycontg.pytogo.org/donate
La configuration d'une application Django se fait habituellement via un script Python dont les résultats dépendent de l'environnement d'exécution (variables d'environnement). Ce projet de @adamghill permet de déporter tout ou partie de la configuration dans des fichiers TOML qu'on peut associer à des environnements différents : https://github.com/adamghill/dj-toml-settings
Python Tip #169 (of 365):
Use PDB's post-mortem mode to debug exceptions
Python script raising an exception and want to drop into an interactive environment RIGHT after the exception occurs?
Use "python -m pdb your_script.py"
Using "-m" runs the pdb module as a script.
When launched like this, PDB enters "post-mortem debugging" mode.
You'll drop into PDB as soon as your program launches.
🧵 (1/3)
The 2026 PSF Board Elections are coming up soon 🗳️ Whether you share our social media posts, vote, or decide to run, your engagement in the election makes all the difference! #Python
Check out the timeline on our blog: https://pyfound.blogspot.com/2026/06/psf-board-election-dates-for-2026.html
Python Tip #168 (of 365):
Want to start a proper Python REPL within PDB?
Run the interact command:
(Pdb) interact
*pdb interact start*
>>>
Before Python 3.13 added support for multi-line Python expressions within PDB, I used interact often.
Launching a Python REPL was essential whenever I needed to run a block of code or even to span one line over multiple lines with code wrapped in braces/brackets/parentheses (thanks to implicit line continuation).
🧵 (1/3)
My talk from @posetteconf : An Event for Postgres 2026 is now available on YouTube 🎥🐘
If you missed it live, you can now watch “PostgreSQL Generated Columns by Example” online.
I’ve also collected links and additional information on my blog, and I plan to publish the slides there next week ✨
RE: https://mastodon.social/@djangonews/116765592686029364
Thanks to the support of six of our sponsors, the Django Software Foundation has secured initial funding to support an Executive Director.
This is the very beginning, and we have a lot of planning and discussions to go, but this is a big step towards hiring an Executive Director.
Lily boostedAnnouncing the Search for a DSF Executive Director https://www.djangoproject.com/weblog/2026/jun/17/announcing-the-search-for-a-dsf-executive-director/
“When you find yourself using indexes in Python, ask yourself is there a specialized tool for this task that might avoid indexing and make my code more readable?”
Read more 👉 https://pym.dev/avoid-indexes-in-python/
Python Tip #167 (of 365):
In PDB, prepending a line with ! will force it to be treated as Python code.
This is especially handy when your expression starts with something that PDB thinks is a debugger command.
For example, n is a PDB command ("next line"), so if you have a variable named n, typing this won't show its value:
(Pdb) n
Instead, use "!n":
(Pdb) !n
'1'
The ! tells PDB to treat n as Python code, not as a PDB command.
Da gibt es so eine LED-Badge in 🔴 oder 🟢 oder 🔵 mit einem programmierbaren LED Feld . Herkunft und Link zum ursprünglichen Bashslript gibts hier.
Das Python GUI hat Dankward, Teilnehner am Wolust gemacht. Ein Fork
https://github.com/dewomser/LED-badge-gui
ICYMI: There’s a new Humble Bundle from No Starch Press with 15 #Python related titles!! Grab ‘Python: the Good Stuff’ for just $36 and a percentage of the proceeds goes to supporting the PSF 💝🐍 https://www.humblebundle.com/books/python-good-stuff-no-starch-books
Python Tip #166 (of 365):
Consider using PDB to debug your code.
Instead of temporary print calls, consider using Python's breakpoint() function to pause your program and drop you into the Python debugger (PDB).
Here's a tiny example:
from random import randint
breakpoint()
answer = randint(0, 1)
n = input("Guess: 0 or 1? ")
🧵 (1/2)
“What if you wanted to sort by something that wasn't quite the original item?”
Read more 👉 https://pym.dev/sorting-in-python/
I'm looking for work, please boost!
I'm a senior software engineer with 35 years of experience. I've worked across an unusually wide range of domains: mobile game backends, privacy-preserving data platforms, high-throughput COVID testing infrastructure, email and account systems, e-payment processing, job marketplace systems, and bioinformatics. I pick up new domains quickly and have a track record of doing it repeatedly. I understand how to turn business needs into engineering requirements.
I've worked remotely since the 1990s and can operate with minimal supervision. I don't need hand-holding to find the right problem to solve. Several of my most valued projects were self-directed: I identified the need, built the thing, and shipped it.
Some of the technologies I'm familiar with include: Python, Perl, TypeScript/JavaScript, Haskell, Go, C, Java. Postgres, MySQL, SQLite. Flask, SQLAlchemy. AWS (Lambda, S3, RDS, SQS, EC2). Docker, Git. Github and Gitlab.
I've also repeatedly picked up new languages and stacks as needed: Haskell for differential privacy research, TypeScript for a 24/7 AWS Lambda system, Flask for my most recent employer. I've become productive with new systems over and over, and I can do it quickly.
I'm also a published author (Higher-Order Perl, Morgan Kaufmann), longtime blogger, and conference speaker with a reputation for making complex ideas clear.
My résumé is at https://plover.com/~mjd/cv/Mark%20Jason%20Dominus.pdf
mjd@pobox.com
Thanks for your attention!
#OpenToWork #remoteWork #softwareEngineering #Python #backend #hiring
@JallBarret Hardcoding the path like that would break execution of the script in a virtual environment (which is exceedingly common these days), so I wouldn't do that. A better shebang line would be `#!/usr/bin/env python3`, since that will resolve it using PATH, and I believe /usr/bin/env is very standard on POSIX-ish systems.
pyodide est un portage de l'interpréteur Python en webassembly, qui permet donc de faire tourner du code écrit en Python dans le navigateur, code qui a accès à toute l'API web du navigateur.
Avec l'acceptation de la PEP 783, il est désormais possible de publier sur PyPI des paquets construits pour PyOdide : https://blog.pyodide.org/posts/314-release/.
Michel Caradec nous avait parlé de PyOdide dans son intervention "Python loin de ton ordinateur" : https://youtu.be/Dzjjwhx2Amk?list=PLv7xGPH0RMUT1GSCGHJmqnswpk-nyz5aq&t=1129
Python Tip #165 (of 365):
You can make a set of sets by using frozenset.
Sets can only contain hashable objects. And regular sets are NOT hashable:
>>> groups = {{"a", "b"}, {"c", "d"}}
Traceback (most recent call last):
...
TypeError: unhashable type: 'set'
So you can't make a set-of-sets with regular sets.
🧵 (1/3)
Pyodide 314.0: Python packages can now publish WebAssembly wheels to PyPI
https://blog.pyodide.org/posts/314-release/
#HackerNews #Pyodide #WebAssembly #Python #PyPI #314.0 #development
Pyodide 314.0: WebAssembly wheels for PyPI https://lobste.rs/s/azz673 #python #wasm
https://blog.pyodide.org/posts/314-release/
Python Tip #164 (of 365):
Thinking in terms of a Venn diagram? You need a set.
Need to find all items in one collection but not another? Intersect two collections? Check what's unique to each?
Python's sets support set arithmetic using operators:
>>> a = {1, 2, 3, 4, 7}
>>> b = {1, 3, 5, 7, 9}
>>> a | b
{1, 2, 3, 4, 5, 7, 9}
>>> a & b
{1, 3, 7}
>>> a - b
{2, 4}
>>> a ^ b
{2, 4, 5, 9}
🧵 (1/2)
RE: https://mastodon.social/@hugovk/116731833341936501
I wrote about the stuff I got up to during the Sovereign Tech Fellowship pilot last year. Turns out it was a lot! Expect more this year!
https://hugovk.dev/blog/2026/sovereign-tech-fellowship/
#Python #SovereignTechFellowship @sovtechfund
RE: https://mastodon.social/@sovtechfund/116731663840822816
After our successful pilot last year, I'm very excited to not only rejoin the 2026 Sovereign Tech Fellowship, but also that @georgically and @stanfromireland are also joining! Plus looking forward to meeting the other new Fellows!
#SovereignTechFellowshipWe’re thrilled to announce the 2026 #SovereignTechFellowship cohort. Welcome to Jan Kowalleck, Philipp Sauberzweig, Pablo Neira Ayuso, @jorisvandenbossche, @yabellini, Denis Cornehl, Jakub Beránek, @matk, @georgically, @stanfromireland, @hugovk, Alexander Ziaee, @elioqoshi and @b0rk
Meet the 14 maintainers, community managers, and technical writers building and sustaining the critical open source infrastructure we all rely on: https://www.sovereign.tech/news/meet-the-2026-sovereign-tech-fellows
Python Tip #163 (of 365):
Commit the most important time complexities to memory.
Time complexity is about how your code slows as your data grows (I stole that phrase from @nedbat).
You don't need a Computer Science degree to benefit from knowing a handful of common complexities.
🧵 (1/4)
“Unlike many programming languages, you can accomplish quite a bit in Python without ever making a class.”
Read more 👉 https://pym.dev/when-are-classes-used/
Python Tip #162 (of 365):
Avoid modifying a list while you're looping over it.
Adding or removing items while looping over a list can cause clear bugs due to skipped or double-visited items.
This loop misses -3:
>>> numbers = [4, -1, -3, 2, -1, 5]
>>> for n in numbers:
... if n < 0:
... numbers.remove(n)
...
>>> numbers
[4, -3, 2, 5]
🧵 (1/3)
@hugovk @georgically @stanfromireland This is absolutely incredible news for the #Python ecosystem and for all #opensource ecosystems. The STA Fellowship Program is one of the most exciting things happening right now IMO, I am so happy to see it return after the pilot and to have even more lovely Pythonistas among the ranks of fellows.
Congratulations everyone!
One of those "I wonder if I could" not "I wonder if I should" results...
A command line sub-pixel renderer (gray scale). Uses 7 sub pixel emoji and 5 semi-shade emoji all in bash.
💬 Interested by QGIS Plugin development ? Let's talk during Oslandia's next webinar !
👉 "Creating QGIS plugins in 2026 : issues, expectations and concerns!", Tuesday, June 30th at 5pm ( Paris time ).
Schedule :
- An Oslandia QGIS developer shares his experience and vision
- quick presentation of useful tools for QGIS development
- open discussion to share experiences
✍️ Registration is free but mandatory : https://framaforms.org/webinar-discussion-panel-creating-qgis-plugins-in-2026-1780384809
Python Tip #161 (of 365):
To flatten an iterable-of-iterables, use chain.from_iterable.
Got a list of lists?
>>> groups = [["Hong", "Ryan"], ["Anthony", "Willa"], ["Margaret", "Adrian"]]
You could flatten it with a nested comprehension:
names = [name for group in groups for name in group]
Or you could use chain.from_iterable:
from itertools import chain
names = list(chain.from_iterable(groups))
🧵 (1/4)
Out now: Python 3.14.6 and 3.13.14!
A day late to include a last-minute OpenSSL release in the installers. Thanks to @standupmaths for the help with the release notes :)
https://discuss.python.org/t/python-3-14-6-and-3-13-14-are-now-available/107714
#Python #CPython #Python314 #Python313 #release
Just released! 🚀
🎶 pylast 6.0.0
🎤 A Python interface to Last.fm and Libre.fm
📯 Restore proxy support (potential breaking change: proxies are now always stored as a dict, before it was a str or dict)
🪇 Drop support for almost-EOL Python 3.9
Just released! 🚀
em-keyboard 5.3.0
🎲 Pick a random emoji from a search. For example:
❯ em --search music --random
Copied! 👩🎤 woman_singer
🧛♂️ Drop support for Python 3.9
Just released! 🚀
flake8-implicit-str-concat 0.6.0
A Flake8 plugin to identify those unjoined strings that a first Black run leaves behind:
"111111111111111111111" "222222222222222222222"
I hear there's another big release tomorrow? This release adds support for Python 3.14 and for once code changes were needed due to AST deprecation removals.
Also drop support for almost-very-nearly-EOL Python 3.9.
https://github.com/flake8-implicit-str-concat/flake8-implicit-str-concat/releases/tag/0.6.0
#Python #flake8 #release #Python314 #Python39
Out now!
Python 3.14.3 and 3.13.12!
All the best bugfixes!
https://discuss.python.org/t/python-3-14-3-and-3-13-12-are-now-available/105995
New screencast on stack-like and queue-like operations in Python.
Lists are great for one of these and not so great for the other.
gh-profiler 0.8.3 introduces a feature people have been asking for: when running it as a GitHub Action against new PRs or issues, you can have the action only write the profile output to the Actions log.
Instead of writing the profile output in a public comment on the PR/issue, it writes a link to the Actions log. The profile is still public, but it's not nearly as prominent.
Just posted an updated version of my little #Python frontend to yt-dlp. With this one I'm no longer bundling yt-dlp, but instead it gets downloaded to a config directory. As a result, if there's an update to yt-dlp, I don't have to go updating my software, anybody else who uses it doesn't have to install an update, all they have to do is run the "Component Updater" shortcut in their applications menu and it'll automatically pull down the updated yt-dlp.
https://gitlab.com/gerowen/youtube-dl-pytk/-/releases/26.6.10
les outils Python écrits en rust se multiplient : polars, uv, prek, pydantic, pyarrow, etc. À l’aune de cette belle collaboration entre les langages, ce guide "Rust pour les développeur·euses Python" de Microsoft est intéressant. Il explique les rouages de rust pour des personnes ayant les concepts de Python en tête.
The June edition of the PSF Board Office Hour is about to begin 🐍 🗒️ 9 PM UTC. We welcome you to join us to share how we can help your community, express your perspectives, and we'd love to receive your questions and feedback about the ongoing strategic planning at the PSF! #python
https://pyfound.blogspot.com/2025/10/a-new-psf-board-another-year-of-psf.html
Python Tip #160 (of 365):
Using list.insert(0, ...) in Python? Consider using a deque instead.
Inserting at the beginning of a list is slow because every existing item needs to be shuffled over.
On my machine, this takes multiple seconds to run:
numbers = []
for n in range(200_000):
numbers.insert(0, n)
There's a better structure than a list for this situation...
🧵 (1/3)
The June edition of the PSF Board Office Hour is about to begin 🐍 🗒️ 9 PM UTC. We welcome you to join us to share how we can help your community, express your perspectives, and we'd love to receive your questions and feedback about the ongoing strategic planning at the PSF! #python
https://pyfound.blogspot.com/2025/10/a-new-psf-board-another-year-of-psf.html
To remove a prefix or suffix, use the removeprefix or removesuffix methods.
Read more 👉 https://trey.io/dley4p
“Generator expressions also pair nicely with reducer functions.”
Read more 👉 https://pym.dev/custom-comprehensions/
🐍📣 la prochaine session de #PythonRennes aura finalement lieu le mercredi 1er juillet 2026 à 19h chez Liksi (🙏 pour l'accueil) 🎉
Jonathan Leger questionnera l'utilisation d'#ORM, @anthony vous parlera de #SQL avancé avec @django.
Inscription gratuite mais nécessaire sur https://www.meetup.com/python-rennes/events/315168209/
Hear from PSF's @pypi Support Specialist Maria Ashna on what her day-to-day looks like, how she cleared multiple months-long backlogs, and the future of PyPI Orgs in this Behind the Commit episode from Mia Bajić.
“So the next time you need to split a string into lines, don't use the string split method.”
Read more 👉 https://pym.dev/splitlines/
Python Tip #159 (of 365):
When it comes to modifications, think of lists as stack-like.
This week's tips are all about lists and data structures.
Regardless of how large your list is, these are both very fast operations:
items.append("more")
last = items.pop()
Lists are optimized for adding items to the end and removing items from the end.
🧵 (1/3)
gh-profiiler's bulk processing feature is a really interesting way to see how AI has been affecting contribution patterns in different projects.
Here's the 25 most recent merged/closed PRs in cPython. Most were merged. Two of the three PRs that were rejected were submitted by a user who raised a red flag when profiled.
To be clear, cPython maintainers are not using gh-profiler to make these decisions. But the output is aligning reasonably well with those decisions so far.
🐱 What can cats teach us about open source leadership? A lot, actually.
PSF Executive Director @baconandcoconut spoke at @NorthBayPython 2026 on staying focused, filtering noise, and not letting the internet knock you off course.
Check it out: https://www.youtube.com/watch?v=lHlAY1bLRBs
la dernière intervention de @lucsorelgiffo tournait autour des #conventionalcommits (https://youtu.be/KKBBOGeRPJg?si=zejM7RTwFtrQ6PVN&t=578) :
- extension git-commit-plugin + hook de pre-commit commitlint : guider l'écriture du message de commit
- python-semantic-release : calculer la prochaine version du paquet
- le mécanisme de trusted publisher pour pousser le paquet sur PyPI
Conscient des limites de ce formalisme, Luc vous partage cet article très pertinent qui les analyse très bien : https://sumnerevans.com/posts/software-engineering/stop-using-conventional-commits/
#Python #CI
slimtoolkit permet de réduire la taille d'une image Docker. L'outil s'appuie pour cela sur une analyse dynamique du container lors de son exécution, en consignant tous les fichiers utilisés.
Il faut donc être certain de passer par tous les chemins d'exécution. Ça peut être risqué pour une image contenant un produit complexe, mais pourquoi pas pour des micro-services (vraiment micros) ou des images de démonstration...
- https://codecut.ai/shrink-python-container-slimtoolkit/
- https://github.com/slimtoolkit/slim
Symbolica 2.0: Programmable Symbols for Python and Rust
Python Tip #158 (of 365):
If you had to choose, prefer automated tests over type annotations.
Of course... you don't need to choose. You can have both!
A type checker can tell you that your function returns the wrong type but it can't tell you that it returns the wrong answer.
Type annotations catch a specific category of bug: passing the wrong KIND of object.
Tests can catch that and more: logic bugs, incorrect output, mishandled edge cases, etc.
🧵 (1/2)
Mini Shai-hulud / Miasma on #pypi https://socket.dev/blog/shai-hulud-descends-to-hades-miasma-pypi-wave #malware #python
Deux ressources autour du monkeypatching et de la création de mocks pour des tests :
- Bob Benderbos : https://belderbos.dev/blog/python-mock-patch-verify-interception/
- Anthony Sottile : https://www.youtube.com/watch?v=ZW0QaclnJKA
Python Tip #157 (of 365):
Old type annotations still work, but newer Python has cleaner ways to write most of them.
Modernizing your annotations removes a lot of typing imports and boilerplate.
🧵 (1/3)
Weekend project that turned into infra I actually run daily: MastoSum.
The stack: RHEL host, 100% rootless Podman. Web on FastAPI, Celery worker/beat/flower, PostgreSQL 16, Valkey. All on userspace networking (pasta), images built & shipped by a self-hosted Forgejo runner. No root daemon, no privileged anything.
What it does: tracks technical hashtags all day and produces one daily briefing, every point linked to the original post + author. It reads only public hashtag timelines, credits every source, and trains on nothing.
And yes, an LLM writes the prose: a local Ministral model from French lab Mistral AI, running on my own hardware. No cloud, nothing leaving the box. Saying that plainly, not burying it. The whole design goal was to point readers *back* at the authors, not replace reading them.
Example output:
https://mastosum.linuxserver.pro/s/OGuLC5whmCS1ET9jAe9leg
This is really good: @ichard26 has funding to work part-time on pip for the next three months! 🎉
He has lots of exciting things planned, but also the flexibility to work on whatever is best for pip, including all-important general maintenance. 💪
https://sichard.ca/blog/2026/06/pip-contract-development/
#Python #pip
Python Tip #156 (of 365):
Parsing JSON with json.loads hands you a blob of nested dicts and lists with no structure.
But you CAN describe the shape, so a type checker (or pydantic) can catch typos and wrong assumptions.
Parsed JSON has no schema. Nothing would catch a mistyped keys:
>>> import json
>>> book = json.loads(response)
>>> book["titel"] # typo, no warning
You only find out at runtime, with a KeyError (if lucky) or a subtle bug (if not).
🧵 (1/4)
Vous aimez Python, Django, les logiciels libres et toute cette sorte de choses ? Profitez de votre week-end pour postuler ! On ferme dimanche soir.
#jerecrute #python #django #logiciellibre
https://mastodon.libre-entreprise.com/@entrouvert/116651361333143503
🤔📚 Wondering what to do this weekend? Grab the latest No Starch Press Humble Bundle, ‘Python: the Good Stuff’ and dig into 15 #Python related titles for just $36! A percentage of the proceeds goes to supporting the PSF! https://www.humblebundle.com/books/python-good-stuff-no-starch-books
I'm trying to measure noise levels in my room. I downloaded an Adroid app which giving me base levels of ~30dB, but then I have this python program https://stackoverflow.com/questions/79636781/how-can-i-find-the-decibel-of-music-or-video-that-comes-out-of-my-device-python (which is more similar to what I want in terms of capturing the sound and providing values to register) that is giving me values in the ~-40dB.
Could it be a matter of "just" adding a constant so they more or less match? Or could it be related to mixer volumes and different mics (phone vs computer)?
1/
RE: https://fosstodon.org/@jong0uld/116675459855568556
Thank you Foxley Talent for sponsoring DjangoCon US once again.
We're grateful for your continued support of the Django community and for helping make DjangoCon US possible year after year.
See you in Chicago this August!
Made some changes to and posted an update for one of my really old #Python #programming projects. I first wrote this back in like 2011. It's a tool that lets you ping several targets in series and save the results to an output file.
“This seems like it should have resulted in a SyntaxError!”
Read more 👉 https://pym.dev/implicit-string-concatenation/
Python Tip #155 (of 365):
When a method returns an instance of its own class, annotate the return type as Self.
Hard-coded class names break for subclasses:
class Connection:
def __enter__(self) -> "Connection":
self.connect()
return self
If PooledConnection inherits from Connection, a type checker will think PooledConnection().__enter__() returns a Connection (not a PooledConnection).
🧵 (1/2)
gh-profiler 0.7.0 is a significant improvement over previous versions.
All PR and issue activity is broken into three categories: repos the user owns, repos in orgs the user is publicly associated with, and external repos. All flag evaluation focuses on activity against *external* repos.
This is a model open source maintainer. They were showing up red, because they were opening a bunch of identical issues. But those were in their own orgs, and quite appropriate.
The PSF's Strategic Plan full draft is available and we want your feedback.
After sharing high-level goals in May, we're opening a 3-week community feedback window. Read the full draft and tell us: Are these the right goals? Is anything missing? #Python #PyPI
https://pyfound.blogspot.com/2026/06/psf-strategic-plan-2026-draft-open-for.html
un article sur uv et les écueils relatifs à la gestion des dépendances :
The talks list is up for the Language Summit and we've emailed the attendees! This'll be the first time for the summit at EuroPython since we decided to alternate with PyCon US.
https://ep2026.europython.eu/language-summit/
I'm looking forward to it in Kraków next month!
Python Tip #154 (of 365):
Writing a type that's "this or that"? Use the | operator instead of Union or Optional.
"int | str" reads better than "Union[int, str]", and "int | None" reads better than "Optional[int]".
The old way involved helpers imported from typing:
from typing import Optional, Union
def parse(value: str) -> Optional[int]: ...
def normalize(value: Union[int, str]) -> str: ...
🧵 (1/2)
At the recent @pycon, @cheukting_ho gave a talk on free threading, which was great BTW. She mentioned PEP 8, calling it the “King of PEPs” 👑
Giving it a read over. I’ve probably skim-read it at best — just doing what flake8 told me for years. 🫡
That the opening bit is “A Foolish Consistency is the Hobgoblin of Little Minds” is just lovely. 🥰
I wonder if “this style guide evolves over time” will mean that the 79 chars line length will be revisited? 🤔
https://peps.python.org/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds #PEP8 #Python
“You can use the built-in sorted function to sort any iterable in Python.”
Read more 👉 https://pym.dev/sorting-in-python/
🐍🚀 Out now: Python 3.15 beta 2!
Still all this good stuff:
💤 Lazy imports!
🧊 frozendict builtin!
💂 sentinel builtin!
📉 Tachyon profiler!
🖼️ Frame pointers everywhere!
🧳 Unpacking in comprehensions!
8️⃣ UTF-8 default encoding!
🆕 Startup config files!
⌨️ Loadsa typing!
🎨 More colour!
🚌 & more!
Library maintainer? Add 3.15 to your CI and keep those bug reports coming!
https://discuss.python.org/t/python-3-15-0-beta-2-is-here/107610
Just released: Python Docs Sphinx Theme 2025.9! 🚀
This enables translations of the theme and adds translations for:
Brazilian Portuguese
Greek
Japanese
Polish
Simplified Chinese
Spanish
Swedish
Traditional Chinese
Turkish
Thanks to all our translators!
https://github.com/python/python-docs-theme/releases/tag/2025.9
#Python #docs #Sphinx #PythonDocsTheme #PythonDocsSphinxTheme
Just released: Python Docs Sphinx Theme 2025.9.2! 🚀
Add German, Korean and Indonesian translations
Fix html page translation
Fix Copy button copying line numbers
Fix search button cutting off long translations
https://github.com/python/python-docs-theme/releases/tag/2025.9.2
#Python #docs #Sphinx #PythonDocsTheme #PythonDocsSphinxTheme
Just released: Python 3.14.0 release candidate 3! 🚀🐍
🪄 Finally, the final release candidate
🪄 We fixed *another* bug that required the ".pyc magic number" to be increased
🪄 The ABI isn't changing, and wheels built for rc1 and rc2 should still work
👤 This was the first release @savannah shadowed!
🏆 Please test and report bugs!
https://discuss.python.org/t/python-3-14-0rc3-is-go/103815?u=hugovk
Just released: Python 3.15.0a4 and look at those JIT numbers!
I heard you like alphas?
Just released! Python 3.15.0a5, this time built against `main` from today instead of last month! 🚀
https://discuss.python.org/t/python-3-15-0-alpha-5-yes-another-alpha/105721
By popular demand (@miketheman), pypistats now has a `--sort` option so you can sort by other columns such as date, rather than the default downloads.
Python Tip #153 (of 365):
When you write type annotations, embrace duck typing: annotate with the most general type you can.
Don't require a list if any iterable will do. Don't require a dict if any mapping will do.
Most functions that "accept a list" actually accept any iterable.
Instead of:
def square_all(numbers: list[float]) -> list[float]: ...
Prefer:
from collections.abc import Iterable
def square_all(numbers: Iterable[float]) -> list[float]: ...
🧵 (1/2)
🟣️ Nouveau journal de bord sur le blog !
➡️ https://blog.flozz.fr/2026/06/02/journal-de-bord-1-rencontres-irl/
Le weekend dernier c'était les JDLL à Lyon, je vais donc revenir un peu sur cette édition. Je profite aussi de ce journal pour vous annoncer mon talk au prochain meetup Python lyonnais. 😄️
Want to support the PSF and stock up on #Python books at the same time? The @nostarch Humble Bundle has 15 titles (including Automate the Boring Stuff + Python Crash Course) for just $36. Offer ends June 18th! https://www.humblebundle.com/books/python-good-stuff-no-starch-books
Ein Bug (?) in Thonny (#python #ide für Anfänger) kostet mich hier echt Lebenszeit: Unter #linux #kde erscheint der "save as" Dialog HINTER dem Hauptfenster.
Für die Schüler heißt das: Das Programm ist abgestürzt (denn es ist ein modaler Dialog, das Hauptprogramm läuft nicht weiter, wenn dieser nicht beendet wurde).
Das habe ich natürlich schon 1000 mal gezeigt, aber die, die heute nachschreiben, haben das natürlich alle ausnahmslos nicht mitbekommen.
#fediLZ #informatik
Hudson River Trading is hiring Trading Systems Engineer
🔧 #python #ansible #aws #gcp
🌎 Austin, Texas; Boulder, Colorado; Chicago, Illinois; London, United Kingdom; New York City, New York; Seattle, Washington
⏰ Full-time
🏢 Hudson River Trading
Job details https://jobsfordevelopers.com/jobs/trading-systems-engineer-at-hudsonrivertrading-com-apr-23-2026-56f1e3?utm_source=mastodon.world&utm_medium=social&utm_campaign=posting
#jobalert #jobsearch #hiring
But if we use the built-in list function instead, we could make a copy of our list and accept any iterable, not just lists
Read more 👉 https://trey.io/rbi1o4
Python Tip #152 (of 365):
Be consistent about your type annotations: skip them entirely or run a type checker.
An unchecked annotation is really just a comment, and it may be a confusingly incorrect comment. A type checker keeps your annotations honest.
Annotations can add noise to code, but they can also increase correctness.
Half-annotated code that isn't type checked adds visual noise WITHOUT adding the safety of type checking.
🧵 (1/2)
ESP32/MicroPython expert wanted
My company is looking for someone to make a small proof of concept:
Read the data (NDEF) of an NFC tag using (async) MicroPython on an ESP32C3 and a PN532 (or comparable) NFC reader
If you think you can make this proof of concept, contact me for negotiating details.
la prochaine conférence PyConFR, organisée par l' @AFPy aura lieu du 29 octobre au 1er novembre 2026 à Biarritz 🎉 !
https://mamot.fr/@AFPy/116651189914289333
L'appel à interventions est ouvert jusqu'au 31 juillet 2026 : https://cfp.pycon.fr/pyconfr-2026/cfp.
✍️ New post about a new package, django-integrity-policy, for setting the new Integrity-Policy security header.
https://adamj.eu/tech/2026/05/31/introducing-django-integrity-policy/
“Normally, classes store their attributes in a dictionary called __dict__.”
Read more 👉 https://pym.dev/__slots__/
Python Tip #151 (of 365):
For truly unpredictable randomness, use the secrets module
Python's random module relies on pseudo-randomness, meaning it generates numbers in a predictable order. If someone can guess the random "seed" (it's based on the current time) they can predict the numbers produced.
For true randomness, use Python's secrets module instead.
🧵 (1/3)
I’d like to announce the most unlikely #Python package release:
service-identity 26.1.0, the best way to verify if a certificate is valid for a hostname, IP, or URI is out!
The main change is that we were able to switch from pyasn1 (thank you for more than a decade of great service! 🫡💛) to do everything within PyCA's cryptography.
https://github.com/pyca/service-identity/releases/tag/26.1.0
Si j'arrive à faire marcher ce truc, je crois que je serai heureux comme un pape ... https://ubuntuhandbook.org/index.php/2025/06/one-click-turn-linux-second-monitor/ #linux #gnome #networking #display #opensource #python
The other day I "heard" someone mentioning `niquests` as a replacement for `requests`:
https://pypi.org/project/niquests/
"It is a drop-in replacement for Requests, which is under feature freeze [...] is the “Safest, Fastest[^10], Easiest, and Most advanced” Python HTTP Client"
Meanwhile `requests` made a release after. Is this some kind of typosquatting? What do we know about `niquests` real reason to fork and/or reimplement?
Every terminal debugger forces a choice: a REPL with full evaluation power but no source context, or an editor with visual breakpoints but a crippled debug console. dap-mux removes the need to choose.
Connect your editor and your REPL to the same debug session. Both are first-class clients. Neither knows the other is there.
Ships with an IPython frontend. Speaks standard DAP — any language, any editor. This is the very first release. There's so much work to do.
github.com/dap-mux/dap-mux
#Python #debugging #Helix #neovim #IPython
Python Tip #150 (of 365):
When you need to pick a random item, use random.choice
You might be tempted to use random.randrange for selecting random items from a list by their index, but there's a better way!
To pick a random item any sequence, use random.choice:
>>> import random
>>> random.choice(["red", "green", "blue"])
'green'
“Indexing isn't bad, but there's often a higher level way to accomplish a goal than using an index.”
Read more 👉 https://pym.dev/avoid-indexes-in-python/
Another Italian-language talk this morning at PyCon Italia 2026 🇮🇹🐍
This time I’m following Luca Di Vita, co-founder of @pescara together with me, as he takes the audience on a journey from derivatives and differential equations to Neural ODEs and continuous neural networks.
It’s always nice to see local community members sharing their expertise on stage, especially on topics that combine mathematics, machine learning, and research ✨
At #PyConItalia, @cheukting_ho is telling us about free-threaded #Python. Since the screenshot was taken, we're now up to 208 / 360 of the top PyPI packages ready for free threading! 🚀🧵
https://hugovk.dev/free-threaded-wheels/
#PyConIT
One thing I always appreciate about PyCon Italia is that part of the schedule is in Italian, making the conference accessible to people who may not be comfortable following talks in English 🇮🇹🐍
This morning I’m attending Juna Salviati’s talk, “L’essenziale è invisibile agli occhi (ma non a Python)”, an introduction to steganography and the art of hiding messages in plain sight. Very interesting topic and a great example of how broad the Python ecosystem can be ✨
anybody here using niquests or, even better, urllib3.future? The projects look pretty sweet and like straight upgrades, have they been stable and good to use in your experience?
https://niquests.readthedocs.io/en/latest/ and https://urllib3future.readthedocs.io/en/latest/
Ohlala, encore du code ésotérique ...
C'est très rigolo, et très bizarre en même temps. https://susam.net/elliptical-python-programming.html #python #programming #bizarre
@pycon @BajoranEngineer @djangoconeurope Dawn’s keynote was a great way to close the second day of PyCon Italia 2026.
The talk sparked lots of questions from the audience, and the discussion could probably have continued much longer.
To wrap up the session, we took a final selfie together on stage before bringing the second day of the conference to a close.
Python Tip #149 (of 365):
Sort by specific attributes with operator.attrgetter.
Have an iterable of dataclasses, namedtuples, or some other record-like object?
Want to sort them by a specific attribute?
Use operator.attrgetter:
from operator import attrgetter
For example, if we had an iterable of Book objects that have a title attribute, we could sort them by that:
sorted_books = sorted(books, key=attrgetter("title"))
🧵 (1/2)
Closing the second day of @pycon 2026 as talk manager for @BajoranEngineer keynote.
After a long day, I’m tired but genuinely happy to help Dawn on stage. Years ago, she helped me when I gave my first talk abroad at @djangoconeurope 2019 in Copenhagen. It feels special to return the favour.
Her keynote, "Stop Being a Generalist", explores why going deep on a domain can be more valuable than trying to do everything.
This afternoon after lunch at @pycon 2026 we gathered for a community photo with many local Python groups from across Italy.
From @pycatania to @pybari , Campania @pescara , Marche, @pyvenice , Turin, @pythonmilano , Genoa, @pbg and the newest community joining the network, like Salento, it was great to see so many people representing local Python communities in one place.
The @pythonitalia community keeps growing. 🐍🇮🇹
I'm also helping Jonathan Ehwald as talk manager for his session at PyCon Italia.
Jonathan is presenting "What I learned migrating @FastAPI & Friends to uv", sharing lessons learned while migrating FastAPI, Typer, SQLModel and other projects to uv.
As someone who maintains libraries himself, it's great to hear practical advice from somebody who has already done the migration work at scale.
Today I'm helping my friend Piero Savastano as talk manager at PyCon Italia.
Piero is presenting his talk in Italian, "Stregatto 2.0", about Cheshire Cat AI, an AI agent framework born in Italy and released under the GPL license.
He brings a lot of energy to the stage: moving around the room, engaging the audience, asking questions, and throwing Cheshire Cat t-shirts to people with the right answers.
Today I'm helping my friend @carlton present his talk "Static Islands, Dynamic Sea" at PyCon Italia 2026.
We've known each other for years through Django, and we're currently co-organising Django on the Med together.
Former @django Fellow, maintainer, and co-host of @Djangocha, Carlton is exploring how typing can add safety where needed while keeping Django's dynamic nature intact.
Day 2 of PyCon Italia 2026 has started! ☕🐍
After a social evening that ended a little later than planned, we're back in the keynote room this morning with Diego Russo talking about the evolution of CPython performance.
It's always a pleasure to see friends from the Python community on stage, especially when the topic is how Python itself keeps getting faster release after release.
A strong start to the second day of the conference. 🚀
The day started with the annual @pythonitalia members' meeting. 🇮🇹
It's always a good opportunity to hear about what's happening across the Italian Python community, discuss ongoing initiatives, and help shape what comes next. 🐍
“When you print to the terminal in Python, by default, your output goes to standard output.”
Read more 👉 https://pym.dev/standard-error/
For an hour we walked through streets, squares, and porticoes while discovering the history of a city with more than two thousand years of history and home to the world's oldest university, where I had the pleasure of studying 😊
This afternoon, after the closing keynote, around sixty PyCon Italia participants joined a guided tour through the historic centre of Bologna.
This afternoon I had the pleasure of introducing @sarahboyce keynote at @pycon 2026 🐍
Her talk, “Django has a marketing problem”, tackled some old myths about Django and reminded us that, after 20 years, it is still modern, fast, and actively developed.
As someone involved in the Django community, it was a real pleasure to welcome Sarah on stage 💚
Python Tip #148 (of 365):
Sort by specific sequence items with operator.itemgetter.
Have an iterable of sequences (tuples, lists, etc.)?
You can sort them by one or more of their indexes using itemgetter from Python's operator module.
from operator import itemgetter
For example, say we have CSV rows:
rows = list(csv.reader(file))
And we want to sort these rows by their second column.
We can do this:
sorted_rows = sorted(rows, key=itemgetter(1))
🧵 (1/2)
Just finished presenting my talk at PyCon Italia 2026: “Django GeneratedField by Example” 🐍
The schedule was a bit tight, but somehow we still managed to get through all the questions after the talk 😄
Thanks to everyone who joined the session, asked questions, grabbed Django on the Med stickers, or adopted one of the small 3D-printed Python Pescara keychains 🐬
Now time to finally breathe a little before the next hallway conversation starts ☕️
borgstore 0.5.0 was just released!
borgstore is a general purpose key/value store with some nice features, supporting misc. backends (local fs, sftp, REST https, s3, rclone).
it now supports optional caching (usually via an additional posixfs caching backend).
Right now I’m helping Francesco Bruzzesi present his talk “Narwhals: One dataframe API to run them all” as talk manager here at PyCon Italia 🐍
Even if Francesco is already a very experienced speaker, it’s always nice helping behind the scenes with the setup, timing, microphones, questions from the audience, and all the small details that help a talk flow smoothly.
Lots of interest around the Python dataframe ecosystem right now 📊
#TIL #jinja2 expression have no operator precedence, so `{{ ['z'] + ['a', 'b'] | sort }}` gives `['z', 'a', 'b']` and not `['a', 'b', 'z']`.
See also https://github.com/pallets/jinja/issues/119 14yo
Django Crontask version 2.0 is out the door! Thanks for all your wonderful contributions and bug chases.
L’équipe Entr’ouvert s’agrandit encore : nous recrutons un·e développeur·euse Python/Django.
Consultez l'offre et candidatez avant le 7 juin : https://www.entrouvert.com/actualites/2026/embauche-developpeureuse-python-django-2026/
RE: https://mastodon.social/@raffaellasuardini/116651793485587192
Lots of good practical advice in here from @foosel,
https://securitytxt.org is a new one to me.
#Python #security
Le petit plus #fediverse :
**: non, ce n'est pas vrai, mais si je ne le dis pas, ils vont me tomber dessus :-p
L’équipe Entr’ouvert s’agrandit encore : nous recrutons un·e développeur·euse Python/Django.
Consultez l'offre et candidatez avant le 7 juin : https://www.entrouvert.com/actualites/2026/embauche-developpeureuse-python-django-2026/
The first keynote of the first day at PyCon Italia 2026 has just started 🐍
Right now Merve Noyan from Hugging Face is walking through the current state of open-source multimodal AI, from vision-language models to agents and OCR tools 👀
A very packed room for a topic that feels increasingly close to everyday developer workflows lately 🤖
PyCon Italia 2026 has officially started 🐍
The opening by Valerio and Sara walked everyone through the whole PyCon Italia opening: talks, lightning talks, social events, community spaces, and all the practical details around the conference.
We also received an important introduction to one of the key local topics in Bologna: the difference between tortelli and tortellini 🍝🙂
After cooling down from the intense heat with a swim in the hotel pool, we treated ourselves to a very typical Bolognese dinner near the hotel 🍝✨
Then one last round of chats at the hotel bar before the night ended.
Days at @pycon always become very long, and somehow nobody ever seems to want to go to sleep 😄
Next stop: the official start of the conference tomorrow morning 🐍
eeyyyyyy fellow python spice enjoyers, what would you say is more "readable" / straight-forward for a nested dictionary creation/update scenario?
a = {}
b = "pumpkin"
c = "spice"
if b in a:
a[b][c] = True
else:
a[b] = {c: True}vsa = {}
b = "python"
c = "spice up ya life"
a.update({b: {c: True}})Assume it will be read by non-python experts, as well, but that visually things are getting a little cluttered so maybe condensing some things would be nice...
#python #pythonQuestionsAdvice for new #Python learners: break the habit of starting every for loop with `for i in`: there is probably a much better name for your iteration variable than `i`.
Python Tip #147 (of 365):
Sort by unbound method objects instead of using "lambda" 🧵
Say you're sorting mixed capitalization strings:
>>> frameworks = ["jQuery", "React", "Alpine", "htmx", "Svelte"]
>>> sorted(frameworks)
['Alpine', 'React', 'Svelte', 'htmx', 'jQuery']
You could case-normalize with a key function that calls casefold on each string:
>>> sorted(frameworks, key=lambda s: s.casefold())
['Alpine', 'htmx', 'jQuery', 'React', 'Svelte']
Or...
🧵 (1/3)
Thanks to @sethmlarson we have a new CPython security policy.
I like how it starts:
"Python Security Response Team (PSRT) members balance this work against many other responsibilities. Please be thoughtful about the time and attention your report requires. Repeated failure to respect the security policy will result in future reports being rejected, or the reporter being banned from the python GitHub organization, regardless of technical merit."
https://devguide.python.org/security/policy/
#Python #security
@nedbat Can you really claim to support recent Python versions if you don't have 3.16 in your classifiers?
https://github.com/coveragepy/coveragepy/blob/eb55feedf54b363e3d0b678f20abf3bfd3551a88/setup.py#L68-L73
Newly public screencast on randomness in Python.
The most common function I use from #Python's random module is the choice() function.
Also, when I need randomness for something security-sensitive, like a password, I do NOT use the random module.
More on the random module in tomorrow's Python tip email.
Python Tip #145 (of 365):
To sort by specific features of an iterable of objects, use a key function.
For example, we could sort strings by their lengths:
>>> colors = ["yellow", "blue", "green", "purple"]
>>> sorted(colors, key=len)
['blue', 'green', 'yellow', 'purple']
A key function can be any callable that can accept each object from the iterable and return a "key" for each.
This all works because functions are objects (recall tip 34).
🧵 (1/2)
Python Tip #146 (of 365):
Don't use sorted to find the largest/smallest item(s).
Have an iterable of items and need the largest/smallest ones?
>>> numbers = [47, 199, 123, 275, 29, 123, 18, 76, 76, 351]
Unless you need every item in sorted order, you probably don't need to sort your iterable.
You can use the max function:
>>> max(numbers)
351
To get the smallest value, you can use min:
>>> min(numbers)
18
🧵 (1/2)
Sortie de Tryton 8.0 https://linuxfr.org/news/sortie-de-tryton-8-0 #Bureautique #cadriciel #gestion #tryton #python #erp
Follow-up to the previous post on WSGISwitchInterval tuning.
Tightening the switch interval recovered most of the throughput a GIL-bound mod_wsgi config lost going multi-threaded. But each process was still pinned to one core. That ceiling is the GIL itself.
The new post is the metrics comparison with free-threading on. Single process, multiple cores. Of interest beyond mod_wsgi users.
https://grahamdumpleton.me/posts/2026/05/free-threading-vs-the-gil-in-mod-wsgi-6-0-0/
WSGISwitchInterval is a new directive in mod_wsgi 6.0.0 that exposes Python's GIL switch interval as a tunable.
The default has not changed since Python 3.2 shipped in 2011. For CPU-bound Python workloads it can leave large throughput gains on the table. A benchmark in the post goes from 37k to 121k rpm just by tightening it.
The directive is mod_wsgi specific, but the lever applies to any Python web stack.
https://grahamdumpleton.me/posts/2026/05/wsgi-switch-interval-in-mod-wsgi-6-0-0/
Python Tip #145 (of 365):
To sort by specific features of an iterable of objects, use a key function.
For example, we could sort strings by their lengths:
>>> colors = ["yellow", "blue", "green", "purple"]
>>> sorted(colors, key=len)
['blue', 'green', 'yellow', 'purple']
A key function can be any callable that can accept each object from the iterable and return a "key" for each.
This all works because functions are objects (recall tip 34).
🧵 (1/2)
Our libzim #Python and #Node.js bindings have been upgraded with the latest libzim 9.7.0.
This brings many improvements around redirections and aliases!
Check-it out!
* https://www.npmjs.com/package/@openzim/libzim
* https://pypi.org/project/libzim/
🆕 Nouvel épisode du podcast Les Amis Causent !
🎧 Ep 94 - Tu quoque my(co)philie
https://smartlink.ausha.co/les-amis-causent/ep-94-tu-quoque-mycophilie?asmid=573636
😂 Premier épisode de la saison 5, qui réunit toujours la même équipe de chroniqueurs pour votre plus grand bonheur et celui des passagers qui vous verront rigoler tout seul dans les transports !
#aulophilie #fellaporte #forniphilie #kink #lapin #LesAmisCausent #matcha #melolania #nebulophilie #oculolinctus #ours #podcast #ponyplay #python #RATP #sdf #série #shibari #zentaï
Happy to announce the 0.18 release of Poezio, a terminal XMPP messaging client.
This new release brings better compatibility with python 3.15, Message Retraction support, a new way of showing or hiding groupchat presences, and a lot of typing!
A more detailed changelog is available on my blog:
https://blog.mathieui.net/poezio-0-18.html
#poezio #python #slixmpp #XMPP #Jabber
Last week I was in Long Beach for @pycon 2026 🌴🐍
Beyond my talk, the best part as always was meeting people from all across the Python community: hallway conversations, old friends, new friends, selfies, tacos, and many unexpected moments ✨
I collected the live posts and photos I shared during the conference into a small timeline on my blog 🙂
Second post in the mod_wsgi 6.0.0 series is up. This one covers the new WSGIFreeThreading directive for opting processes into PEP 703 free-threaded Python. Even when mod_wsgi is built against a free-threaded Python, GIL-enabled mode remains the default. You opt in per process, and can mix free-threading with per-interpreter GIL and the classic process-wide GIL across daemon process groups.
Try the RC against a real workload if you can and provide feedback.
https://grahamdumpleton.me/posts/2026/05/free-threading-in-mod-wsgi-6-0-0/
mod_wsgi 6.0.0 is out as a release candidate. First post in a series about what's new in the release, starting with the per-interpreter GIL story and the new WSGIPerInterpreterGIL directive that lets sub-interpreters in a daemon process hold their own GIL under PEP 684.
If you can try the RC against a real workload and file issues, that would be very useful.
https://grahamdumpleton.me/posts/2026/05/per-interpreter-gil-in-mod-wsgi-6-0-0/
Python Tip #144 (of 365):
To suppress specific exceptions, use contextlib.suppress.
You could suppress an exception like:
try: ...
except ValueError: pass
But I would recommend:
from contextlib import suppress
with suppress(ValueError): ...
contextlib.suppress more clearly indicates "we're deliberately suppressing an exception" instead of "we got lazy while exception handling".
You should ALSO always ask yourself, "should I actually BE suppressing this exception?"
Python lists store pointers to PyObject instances, requiring memory for both the pointer and a separate object header, whereas Lua stores numbers directly in table arrays. This overhead is CPython-specific; dynamic typing need not be so inefficient, as Lua shows.
gh-profiler 0.6.2 no longer flags users whose only issue is having a newer account. If all other flags are green, the account age flag is adjusted back to green.
This avoids discouraging people who are excited to contribute to open source, and immediately see a red or yellow flag when they're profiled.
New blog post: Async support for wrapt.synchronized.
Before 2.2.0, wrapt.synchronized on an async def looked like it worked, but the threading.RLock was only held around coroutine construction, not the awaited body. Ten gathered tasks would stomp on each other.
2.2.0 detects async functions, uses asyncio.Lock, and adds an async-with form. With a note on why there is no asyncio.RLock in the standard library.
https://grahamdumpleton.me/posts/2026/05/async-support-for-wrapt-synchronized/
New blog post: Reshaping decorated functions with wrapt.
When a decorator changes a function's parameter shape or its sync/async-ness, runtime introspection should reflect the wrapper, not the wrapped. wrapt 2.2.0 adds with_signature for the signature side, and mark_as_sync / mark_as_async for the calling-convention side. Plus async_to_sync / sync_to_async bridges.
https://grahamdumpleton.me/posts/2026/05/reshaping-decorated-functions-with-wrapt/
Python Tip #143 (of 365):
Re-raise exceptions deliberately
When you need to re-raise an exception, you have 2 options:
1. Use a bare "raise" statement
2. Use "raise" with a "from" clause
🧵 (1/3)
New blog post: Lazy monkey patching with wrapt.
If you write APM agents, tracers, profilers, or anything else that instruments Python code, wrapt has supported deferred monkey patching from the start. It just didn't have a dedicated docs page until April 2026.
wrapt 2.2.0 also adds a ? modifier that closes the last ergonomic gap, and Python 3.15's lazy imports make this the right default for instrumentation libraries.
https://grahamdumpleton.me/posts/2026/05/lazy-monkey-patching-with-wrapt/
New blog post: Per-instance lru_cache using wrapt.
wrapt 2.2.0 adds an lru_cache helper that fixes the three things that go wrong with functools.lru_cache on instance methods: a shared cache budget across all instances, strong references that block garbage collection, and a requirement that self be hashable.
It is not a replacement. functools.lru_cache still does the caching. wrapt just arranges a separate cache per method per instance.
https://grahamdumpleton.me/posts/2026/05/lru-cache-using-wrapt/
New blog post: Stateful decorators in wrapt.
The latest wrapt release (2.2.0) introduces bind_state_to_wrapper, a small helper that makes it noticeably easier to write decorators that keep state across calls and still work correctly on functions, instance methods and class methods.
The post walks through how you'd write this in plain Python, why the class-based approach silently breaks on methods, and how wrapt removes the descriptor-protocol headaches.
https://grahamdumpleton.me/posts/2026/05/stateful-decorators-in-wrapt/
#GetFediHired Our team at Fable is looking for a Staff Software Backend Engineer (10 years+) familiar with #python and #django in one of various US cities, Canadian cities, or Mexico City.
https://jobs.ashbyhq.com/ScribdInc/450391bf-4fb2-4fae-9acd-96851c7e82e3?utm_source=BDVAEvOEqo
Tuple unpacking allows us to give names to values that would otherwise only be referenced by an index.
Read more 👉 https://trey.io/nb3z3t
I'm looking for companies and systems that have been running in production for some time and use Django as their main framework for a presentation I'll be giving soon at an event. No need to be open source. I'd like to better understand what kind of applications people are building and maintaining lately ... #python #django
📰 Issue 338: Django 6.1 alpha 1 released
https://django-news.com/archive/issue-338-django-61-alpha-1-released/
This afternoon I had the honor (and honestly a lot of fun) recording an episode of @talkpython with @mkennedy 🎙️
We met last week at @pycon 2026 in Long Beach after my talk "AI-Assisted Contributions and Maintainer Load", and he invited me to continue the conversation on the podcast I’ve listened to for years 🎧
At the end we even had to take a screenshot together because we couldn’t take a proper selfie 📸😂
Live recording here: https://www.youtube.com/watch?v=1RJ1kkpTdow
Python Tip #142 (of 365):
Be specific when handling exceptions
Unless you're specifically trying to catch all possible exceptions (often for the purpose of logging them) I HIGHLY recommend being as specific as possible when handling exceptions.
In your "except" block, catch only the specific types of exceptions you intend to handle.
🧵 (1/2)
“The _ variable (if not deliberately set) will hold the value of the previously run statement, if there is one:”
Read more 👉 https://pym.dev/repl-features/
Little change we just made to the https://docs.python.org/3/ homepage:
The table on the front is no longer an HTML <table>, but <ul> lists with CSS to make it a grid.
That's because a <table> should be used for tabular data and not layout.
This improves accessibility, and also looks better as a list on mobile instead of a squashed table (compare https://docs.python.org/3.12/).
Python Tip #139 (of 365):
Use assert statements for yourself but exceptions for your users.
And "users" INCLUDES other Python programmers who are using your code function/class/etc.
When you need to ensure a precondition is met, start with assert:
assert len(character) == 1
If that condition is possible in real code, graduate to "if" with "raise":
if len(character) != 1:
raise ValueError("'character' must be a string of length 1")
🧵 (1/2)
Python Tip #141 (of 365):
Don't use bare "except" clauses
Instead of this:
try: ...
except: ...
Do this:
try: ...
except Exception: ...
Or this:
try: ...
except BaseException: ...
If you need to catch EVERY exception either use:
1. "except Exception" (excludes system-exiting exceptions)
2. "except BaseException" carefully (catches system-exiting ones too)
Note: BaseException will catch the exception raised by the user hitting Ctrl+C as well as sys.exit calls.
Hey, Mastodon! My team at Scribd is hiring a Senior Backend Engineer. #RubyonRails & #Python onto the Publisher Content Management team.
https://jobs.ashbyhq.com/ScribdInc/df3f9e47-6df4-4ae6-be4a-cba1de5a36de?utm_source=JaP91bA8Dv
Python 3.15 apparently includes symmetric difference support for collections.Counter.
It's a niche feature but it's one I've needed in real code before (albeit only once so far).
This apparently happened because I started a Discourse thread about it.
Requesting a feature can serve as validation that at least one other person has thought of it and wanted it in real code. It apparently did in my case!
gh-profiler 0.5.1 includes a number of bug fixes and small updates: better formatting, don't include private activity when profiling yourself, avoid yellow flags for having a small number of identical issues, support Python 3.10.
If you know someone is doing OSS in good faith and profiling them shows yellow or red flags, please consider opening an issue. It will take a little while to settle on appropriate criteria and thresholds.
The guidelines for using AI tools when contributing to CPython has just been updated. Must read whether you're an existing or aspiring contributor.
tl;dr: you're still responsible for what you submit.
Tell everybody you know!
https://devguide.python.org/getting-started/ai-tools/
#Python
Python Tip #140 (of 365):
Embrace EAFP (it's Easier to Ask Forgiveness than Permission) in Python
This is in contrast to Look Before You Leap, which we DO use, but a bit less often than in many other languages.
EAFP: https://pym.dev/terms/#EAFP
LBYL: https://pym.dev/terms/#LBYL
We use EAFP more often in Python because it makes duck typing easier. Instead of trying to ask whether seems to be a duck, we just treat it like it is and handle the exception if it isn't.
🧵 (1/3)
Django 6.1a1 is out 🎉 💚 I'm really happy and proud that database-level delete options for ForeignKey.on_delete (which we implemented during Django on the Med 🏖️ ) are one of the highlights of this release 💪 🤝 #django #djangoonthemed #sprint #python
https://www.djangoproject.com/weblog/2026/may/20/django-61-alpha-1-released/
My employer just announced a "strategic partnership" with Anthropic so I think it's time to try and get #FediHired. I'm a software engineer with 20 years of experience. I consider myself a #Python genralist and also have experience in embedded C (though I haven't done much C in the past few years).
And by "overwhelming" I mean: that one tag contributes over a hundred posts per day to my feed. Maybe that’s not overwhelming for you, but along with everything else, for me it is. #Python
I follow the #Python tag, and that alone makes my feed overwhelming. I do not yet have a strategy for narrowing it down to only the most valuable content. Suggestions, of course, welcomed!
RE: https://mastodon.social/@jonafato/116606614638510514
It only takes an email with a paragraph or two!
Maybe you'll be my new boss? Come work for #Shure doing #FPGA #modem development in our #Wireless lab.
I've been here 20 years. It's not bad. Ask me anything.
https://careersus-shure.icims.com/jobs/4766/engineer-staff-managing%2c-fpga/job?mode=view
Put down my name and I'll get a referral bonus.
#engineering #management #python #verilog #vhdl #proaudio #job #jobs #getfedihired #fedijobs #jobsearch #fedihire #illinois #chicago #askmeanything
Python Tip #139 (of 365):
Use assert statements for yourself but exceptions for your users.
And "users" INCLUDES other Python programmers who are using your code function/class/etc.
When you need to ensure a precondition is met, start with assert:
assert len(character) == 1
If that condition is possible in real code, graduate to "if" with "raise":
if len(character) != 1:
raise ValueError("'character' must be a string of length 1")
🧵 (1/2)
Just arrived back home after a long and tiring trip ✈️
But it was absolutely worth it. PyCon US 2026 was an intense week full of talks, keynotes, hallway track conversations, and so many encounters with people from the community.
As always, the best part of conferences for me is the people and the chance to create more connections around open source and Python.
Thanks everyone 💚
Hope to see some of you at PyCon Italia 🙂
Meanwhile, on the Python/Django side of life… Over the past few evenings I’ve made numerous updates and bug fixes to my reusable, pluggable, multi-user/multi-group task assignment system for Django. Live on the demo site and installable now. Hope it’s useful!
Python Tip #138 (of 365):
Use try-except to see whether a particular import exists
Need to see whether a third-party library is installed or whether a newer standard library module or feature exists?
You can attempt an import and catch an ImportError to fallback to the "apparently it's not available" path.
For example, if you customize the color scheme of your Python 3.14 REPL, in your PYTHONSTARTUP file you might have something like this...
🧵 (1/2)
@webknjaz @MaggieFero And here's the video of the EuroPython keynote from Antarctica in 2018!
"White Mars: living far away from any form of life"
https://www.youtube.com/watch?v=9s0AUlyIbUU
#EuroPython #Python #Antarctica
Does #python have as standard something similar to a dict but where keys are a regex (or other pattern) that is matched on lookup?
The PSF's PyPI Safety and Security Engineer, @miketheman, is giving a keynote at OpenSSF Community Day this Thursday! "Anatomy of a Phishing Campaign" is a deep dive into the 2025 PyPI phishing attack, how it worked, and what stopped it.
Thu May 21 @ 9:20am CDT 👉 https://openssfcdna2026.sched.com/event/2I44z
#Python #PyPI #SupplyChain #Security
https://openssfcdna2026.sched.com/event/2I44z
Listening to the Python Steering Council panel with Barry Warsaw, Donghee Na, Pablo Galindo Salgado, Savannah Ostrowski and Thomas Wouters at PyCon US 2026 🐍
One of those moments where you remember how much invisible work, discussion and coordination happens behind Python itself.
Currently following the final keynote of @pycon 2026 🚀
Really happy to see @Rachell and @CodenameTim on stage talking about @djangonaut , a project I’m personally very connected to and that I also had the chance to participate in.
It’s great to see a keynote focused on mentorship, inclusion, sustainability, and helping more people become long-term contributors and community leaders in open source ✨
This is a pretty interesting usage of #HomeAssistant to perform the monitoring but it makes sense considering this is their home. HA provides a ton of integrations so they're able to pull in everything they need natively.
It's a fun intersection of #Python and #HomeAssistant and I'm happy to see it showing up more at #PyConUS.
Python Tip #137 (of 365):
You can SORT OF slice non-sequences
Iterables that aren't sequences (like iterators) don't support Python's slicing syntax, but you can accomplish something similar with itertools.islice or collections.deque.
🧵 (1/2)
I just attended the “PSF - Update from our Security Engineers” session at @pycon 2026 🔐
@miketheman and @sethmlarson were both excellent presenters: funny, clear, and very informative at the same time.
It was great to hear more about the huge amount of work happening behind the scenes to improve the security of Python, @pypi and the @ThePSF infrastructure ✨
Sitting in the keynote room at PyCon US 2026 listening to @amcasari 🎤
The way she moves through topics like complexity, socio-technical systems, and the unexpected behaviors that emerge from them makes the whole room follow along naturally.
Really enjoying the examples and the direction of the talk so far. 🐍
CC @pycon
💬 The Python Developers Survey: What Would YOU Ask?
Join us for this Open Space session today at #PyConUS 2026:
📍 Room 102C
🕙 10-11 AM
Come share your ideas and feedback on how the Python Developers Survey can become more community-driven and collaborative!
#PythonDeveloperSurvey #Python
https://us.pycon.org/2026/schedule/open-spaces/#OpenSpace-28
@nedbat Can you really claim to support recent Python versions if you don't have 3.16 in your classifiers?
https://github.com/coveragepy/coveragepy/blob/eb55feedf54b363e3d0b678f20abf3bfd3551a88/setup.py#L68-L73
This afternoon, before the Expo Hall closed, we took a big group photo together at the Django and Djangonaut Space booth 📸✨
Django Fellows, Steering Council representatives, DSF members, volunteers, contributors, and community participants all joined together.
Guido van Rossum also stopped by and shared kind words about Djangonaut Space and the constant work the Django community brings into the wider Python ecosystem 🙂
Really excited to use and improve gh-profiler https://github.com/ehmatthes/gh-profiler by @ehmatthes, it's detecting the same LLM use patterns I was starting to write a tool for as well. #Python #PyConUS
After lunch I joined the “Community Organizers Unite!” open space at PyCon US 2026 ✨
It was really interesting to connect with organizers from conferences, meetups, and other technical communities, and exchange stories, ideas, and experiences around community building.
One of those sessions where you leave with many new thoughts and contacts 🙂
The Four Horsemen of the LLM Apocalypse https://anarc.at/blog/2026-05-16-four-horsemen #llm #analysis #sysadmin #copyleft #copyright #debian-planet #python-planet #internet #linux #security #kernel #software #vulnerability #free-software
I just attended the PSF Member Lunch at PyCon US 2026 🍽️
It was really interesting to hear the updates and reports from the PSF and PyCon US organizers.
I also enjoyed the Q&A session afterwards and the chance to stay around talking with other participants and sharing experiences from the community ✨
Black 26.5.0 is out supporting Python 3.15! Now you can format code with the `lazy` keyword (PEP 810), and unpacking in comprehensions (PEP 798) 🚀
https://github.com/psf/black/releases/tag/26.5.0
#Black #Python #Python315 #PEP810 #PEP798
Python Tip #136 (of 365):
Wrap iterators in iterators for VERY lazy looping
Have a file object? That's an iterator.
You can process it lazily with a looping helper.
You can wrap that in a generator expression if you want.
Lazy iterables wrapping lazy iterables makes for nicely-chunked (hopefully) work while keeping your code efficient.
One of the funniest moments in Pablo Galindo’s keynote this morning was realizing that several slides were almost identical to some I used yesterday in my talk about AI-assisted contributions and maintainer load 😄
Completely different talks, prepared independently, and yet we both referenced the same stories from projects like Matplotlib and Godot.
I guess many maintainers across open source are currently running into very similar problems at the same time.
Currently following Pablo Galindo’s keynote at PyCon US 2026 🎤
It’s the first keynote in Spanish at PyCon US, and even as an Italian speaker I’m able to follow most of it surprisingly well 🙂
Pablo is giving a keynote that is both very interesting and genuinely funny, while talking about the life of open source maintainers and the changing world around them.
CC @pycon
Currently following the D&I panel at PyCon US 2026: “Python is for Everyone — Growing the Community Without Limits” ✨
Really interesting discussion around community building, inclusion, education, and local Python communities from different parts of the world.
Panel with Débora Azevedo, Alla Barbalat, Georgi Ker, Theresa Seyram Agbenyegah, and Abhijeet Mote.
#PyConUS #Python #Diversity #PyLadies #OpenSource #DjangoGirls
CC @pycon @ThePSF @georgically @pyladies @pyladiescon @djangogirls
Great start to @psobot lightning talk "@chrisjrn you will not regret letting me give a lightning talk ... Here's my live demo of how to make PyPI perfectly secure ... pip install flask ... floppy disk required ... @sethmlarson do you have a copy of Flask for me?" *inserts disk into floppy disk reader* flopyPI #python #pyconus #flask #pypi
Thank you @samdoran 🙂 hearing that means a lot to me.
I had the feeling during the conference that this topic has been weighing on many people in open source for quite some time, so I’m really happy the way I approached it resonated with you. 😊
I hope to continue discussing it with more people across the community, and in the meantime I’ve shared the slides from the talk on my website ✨
https://www.paulox.net/2026/05/15/pycon-us-2026/#1
That was a fantastic talk by @treyhunner on the pathlib module in #Python. I'd highly recommend checking out the recording or slides if you weren't able to catch it at #PyConUS.
This morning at PyCon US 2026 I presented my talk about AI-assisted contributions and maintainer load 🎤
Thanks to everyone who joined the session. It was a really great experience, and I had many interesting conversations afterwards.
Also thanks to @simon for hosting the AI track, the first one at PyCon US ✨
I’ve already uploaded the slides to my personal website for anyone who couldn’t attend the talk.
https://www.paulox.net/2026/05/15/pycon-us-2026/
Next #PyConUS talk for me is by @treyhunner talking about `pathlib` in #Python in Grand Ballroom B (second floor). I'm looking forward to this one not only because Trey is an awesome person, but also because I too love `pathlib`.
The “Open Source Maintainer Security Forum” Open Space will be in Room 202C at 3PM today 🐍🛡️
If you’re a project maintainer and want to discuss security, how to keep your project secure, or how to handle vulnerability reports: come and find us! 👋
👉 https://us.pycon.org/2026/schedule/open-spaces/#OpenSpace-43
#Python #PyCon #PyConUS #PyConUS2026 #security #oss #opensource
Python Tip #135 (of 365):
Embrace the infinite
Remember that infinite iterables are possible in Python.
itertools.count() is like an infinite range().
itertools.repeat() and itertools.cycle() are like infinite self-concatenation.
🧵 (1/3)
RE: https://tech.lgbt/@skimbrel/116579499717899668
"Python 3.15.0 is in beta 1! And, it's the most colourful Python yet!"
🎨
Receipts:
"More color in argparse, ast, calendar, difflib, http.server, pickletools, PyREPL tab completion, python –help, sqlite3, timeit, tokenize, unraisable exceptions and stdlib (ast, compileall, doctest, gzip, inspect, json.tool, pdb, profiling.sampling, random, regrtest, sqlite3, timeit, tokenize, trace, unittest, uuid, zipapp, zipfile) CLI help."
https://docs.python.org/3.15/whatsnew/3.15.html#whatsnew315-more-color
Django LiveView vs Phoenix LiveView: a real benchmark
https://en.andros.dev/blog/80134668/django-liveview-vs-phoenix-liveview-a-real-benchmark/
Today at 11:00 AM I’ll be speaking at PyCon US in Grand Ballroom A about AI-assisted contributions and the impact they are already having on open source maintainers 🎤
Really curious to hear how other people in the community are experiencing this shift in practice and discuss it after the talk.
🔐 Catch PSF's PyPI Safety and Security Engineer, @miketheman, talking Trusted Publishing at #OSSummit next week! Learn how to eliminate long-lived credentials from your #PyPI release workflow: no tokens, no secrets, just secure deploys. Tue May 19 @ 11am CDT #Python #SupplyChain #Security
https://osselcna2026.sched.com/event/2JQsc
Python Tip #134 (of 365):
Use looping helpers
Python's "for" loops are simple: they loop over an iterable one item at a time.
That's all they can do.
Because our "for" loops are so simple and iterable-centric, looping helpers are a VERY big deal in Python.
We use enumerate to count upward while looping, reversed to loop in the reverse direction, and zip to loop over multiple iterables at the same time.
🧵 (1/2)
Today I am proud to announce that Phase One of my wildlife conservation project is complete.
This project is personal. I come from a family of farmers and wildlife rangers. Conservation is not just a cause for me, it is my heritage. After losing my job, I spent months in the fields, mountains, and valleys of our beautiful land, Namibia, talking to my community, listening, and building.
The road has not been easy. The project faces a serious challenge: funding. I have exhausted my budget. On top of that, my ideas are being taken by those in power, people who know that without their approval, the project cannot move forward. That is the biggest obstacle I face.
And yet, at the end of it all, if this project never sees the light of day, I will still be proud that I tried. Proud that Django and Python were the tools I chose. Proud that the open-source community walked this road with me.
I am also still open to job opportunities though.
Thank you, Django community. Thank you, Python community, Thank you, Ubuntu community.. You gave me the tools and the encouragement. This is as much yours as it is mine.
#Django #Python #OpenSource #WildlifeConservation #Africa
@django@fosstodon.org @django@kowelenz.social @djangocon @ThePSF @CodenameTim
After 20 hours of traveling, I finally arrived at the hotel in Long Beach for the conference 🌍
Already met a few friends, took some selfies, and had a first quick look around the city.
So far, Long Beach looks really beautiful ☀️
Selfie with @Rachell, Natalia Bidart, @bmispelon, @CodenameTim, and @pythonbynight
#PyConUS #PyCon #PyConUS2026 #Python #OpenSource #Community #Conference #US
La prochaine #PyConFR sera à Biarritz !
https://linuxfr.org/users/chadys/liens/la-prochaine-pyconfr-sera-a-biarritz
Si votre boite ou si vous connaissez une boite qui peut sponsoriser une conférence #Python, #need
Speaker spotlight: Felipe Moreno: "How Translations Work" - Maintainers Summit
Most OSS projects say they want to be welcoming to a global community. Far fewer have actually figured out the translation pipeline, how you avoid the "half-translated forever" problem.
Felipe is going to walk through how it actually works, in enough detail to take back to your own project.
🕥 2:10 PM, Saturday, May 16, Room 201A
RE: https://mastodon.social/@bagder/116566403633172153
#Python has been reproducible since October 2023 (Python 3.12.0)
https://sethmlarson.dev/security-developer-in-residence-weekly-report-14
"Packages that can't be rebuilt byte-for-byte are now blocked from entering Debian's testing branch."
https://itsfoss.com/news/debian-makes-reproducible-builds-mandatory/
Python Tip #133 (of 365):
Beware of containment checks on iterators
Membership checks will consume iterator items and can completely exhaust them.
Using "item in my_generator" will loop over my_generator, consuming items from it until a matching one is found. If you need to loop again, you'll start from where you left off.
One of my strong suites in all the packaging work is the knowledge in my head.
"Why don't you write it down for others to benefit from, then?", you'd ask.
The thing is, this knowledge is basically "hot cache". I'm bumping hundreds of #Python packages in #Gentoo, so I remember stuff. And because of that, I can quickly notice some things or answer some questions.
If that were written down, the effort needed to find it would diminish all the gain. I mean, technically *it is* already written down, and the whole point is that I have it "cached".
Audius is hiring Software Engineer - Full Stack
🔧 #javascript #python #rust #solidity #typescript #electron #react #reactnative #redux #blockchain #css #docker #elasticsearch #html #postgresql #redis
🌎 Remote
⏰ Full-time
🏢 Audius
Job details https://jobsfordevelopers.com/jobs/software-engineer-full-stack-at-audius-co-may-31-2022-da9984?utm_source=mastodon.world&utm_medium=social&utm_campaign=posting
#jobalert #jobsearch #hiring
On my way to Los Angeles from Rome ✈️
See you all there in only 12 hours 👋
#PyConUS #PyCon #PyConUS2026 #Python #OpenSource #Community #Conference
RE: https://fosstodon.org/@pycon/116538489589981492
This talk from @andrewnez grows more and more important as the days go on... it's a must watch!
Python Tip #132 (of 365):
Know your iterator concepts.
Items are "consumed" from an iterator as you loop over it.
And iterators can be "exhausted" if their items have all been consumed.
But not all iterators CAN be exhausted. Infinitely long iterators do exist.
🧵 (1/2)
Lyon: Excursion dans le monde des microcontrôleurs, Le lundi 18 mai 2026 de 19h00 à 21h00. https://www.agendadulibre.org/events/35113 #python #micropython
RE: https://fosstodon.org/@ThePSF/116521504644649677
We've still got some volunteer shifts open at the PSF Booth (and other shifts across the conference)! Our shifts take a little bit of work but they include a LOT of fun and connections with other folks in the #Python community 🤝🤩 Sign up today via the #PyConUS website: https://us.pycon.org/2026/volunteer/volunteering/
Joining #PyConUS 2026? PSF booth volunteers WANTED!! Spend a little of your conference time helping things run smoothly at the PSF Booth (or other volunteer opportunities!), hang out with fellow Pythonistas, and enjoy the fun activities we have planned (coloring & video games included) 💛🐍💙 https://us.pycon.org/2026/volunteer/volunteering/
Congratulations to the newest PSF Community Service Award recipients!
Inessa, Kafui, Kalyan, Maria, and @pauleveritt have each made lasting contributions to the Python community. From conferences to founding initiatives to education worldwide, their service to the community deserves recognition and celebration!
https://pyfound.blogspot.com/2026/05/announcing-psf-community-service-award.html
The May edition of the PSF Board Office Hour is about to begin 🐍 🗒️ 1 PM UTC. We welcome you to join us to share how we can help your community, express your perspectives, and we'd love to receive your questions and feedback about the ongoing strategic planning at the PSF! #python
https://pyfound.blogspot.com/2025/10/a-new-psf-board-another-year-of-psf.html
Sortie de Crème CRM en version 2.8 https://linuxfr.org/news/sortie-de-creme-crm-en-version-2-8 #gestion_relation_clients #Commercial #cremecrm #python #django #crm
Le nombre de téléchargements sur pypi.org est vraiment effrayant !
Oui on parle de ~140 milliards de téléchargements par mois, contre ~40 milliards il y a 2 ans.
They say you're supposed to scratch your own itches, so here's my take on a printer-friendly version of the #PyConUS 2026 schedule:
https://snoopj.dev/files/PyConUS_2026_printable/
My target here is to fit one day on a double-sided landscape 8.5x11" (on my browser/printer) and it just about squeezes down this way.
Python Tip #131 (of 365):
Know the difference between iterables and iterators.
Python programmers sometimes say "iterator" when they mean "iterable".
These terms are NOT interchangeable.
Any objects that you can use a "for" loop to loop over is an iterable.
Iterators can be passed to the built-in next() function. Arbitrary iterables cannot be passed to next(). Only iterators can be.
But all iterables can be passed to iter() to get an iterator from them.
🧵 (1/2)
The PSF is excited to share that the PSF Board is developing a five-year strategic plan–and we want to hear from you! We're sharing the high-level goals we’ve drafted and welcoming the whole Python community into the conversation. Read more on our blog: https://pyfound.blogspot.com/2026/05/strategic-planning-at-psf.html
#Python #PyPI
https://pyfound.blogspot.com/2026/05/strategic-planning-at-psf.html
There are a couple of ways to share your feedback:
- Email the address listed in the blog post
- Join PSF Board Office Hours in May & June
- Comment on the Discuss thread
- Join the dedicated Open Space session at #PyConUS
https://discuss.python.org/t/strategic-planning-at-the-psf/107314
#Python #PyPI
https://discuss.python.org/t/strategic-planning-at-the-psf/107314
The PSF is excited to share that the PSF Board is developing a five-year strategic plan–and we want to hear from you! We're sharing the high-level goals we’ve drafted and welcoming the whole Python community into the conversation. Read more on our blog: https://pyfound.blogspot.com/2026/05/strategic-planning-at-psf.html
#Python #PyPI
https://pyfound.blogspot.com/2026/05/strategic-planning-at-psf.html
La rediffusion du #PythonRennes du 27 avril est en ligne : https://youtu.be/FhUBmdUDe-w?list=PLv7xGPH0RMUT1GSCGHJmqnswpk-nyz5aq 🎉
Merci Néosoft pour l'accueil, Alex pour la captation et la mise en ligne, Quentin et Jesshuan pour vos interventions sur les frameworks web et d'orchestrations de workflows.
Retrouvez les diaporamas des actualités et des interventions sur https://github.com/python-rennes/sessions/tree/main/python-rennes-2026.04.27-rex-frameworks-web-et-orchestrateurs
@mgorny You're welcome?
We don't usually do RCs for patch releases, the last one was five years ago. The 3.14.5 RC was specifically for the GC change.
Unfortunately timelines were a bit short because I wanted to get this out, but it took a bit of time to prepare and test the patches and I didn't want to rush that, nor release during PyCon US.
https://discuss.python.org/t/reverting-the-incremental-gc-in-python-3-14-and-3-15/107014
#Python #CPython
Always appreciate how people release RCs to give others opportunity to test their changes early, then release final versions before the fixes for "breaks #Portage" kind of regressions introduced in the RCs are merged.
So either I've overdone it, or really nailed it:
The #python version of REBOUND is only a thin wrapper of the C code interfaced via ctypes. In the past, adding or changing a parameter in a C structure required you to also update the parameter on python. I have now one source of truth, the C code. I there define the structures, but now also an interface to them. This is not only used by python to access and modify parameters, but also by C itself to serialize data to a restart file.
#PyConUS is only a few days away! 🤩 As usual I’ll be covering the event exclusively on Mastodon (specifically the NEW “Trailblazing #Python Security” talk track on Saturday May 16th).
Time to reshare my hack for quick #Mastodon toot templates with event #hashtags:
https://sethmlarson.dev/quick-mastodon-toot-templates-for-event-hashtags
Python Tip #130 (of 365):
Only use recursion for trees
Recursion is most useful for traversing or constructing TREE-LIKE STRUCTURES.
For most other problems, iteration is usually more readable.
Recursion is when a function calls itself.
Computer science classes almost always introduce recursion using factorial or fibonacci. Those are not great examples because those are both very clear (and fast) using a simple "for" loop instead.
🧵 (1/6)
🐍🚀 Out now: Python 3.14.5 final!
♻️ This now has the new (old) garbage collector, and the official macOS installer has been updated to use Tcl/Tk 9.0.3 instead of 8.6.17.
https://discuss.python.org/t/python-3-14-5-is-here-with-a-new-old-garbage-collector/107304
“This is the situation where you're most likely to see implicit string concatenation used: to break up a long string literal into smaller strings over multiple lines, putting parentheses around them to create an implicit line continuation.”
Read more 👉 https://pym.dev/implicit-string-concatenation/
Python Tip #129 (of 365):
Use None as a sentinel value
None is great for representing nothingness, but it can also act as a placeholder for "no real value yet".
It's common to use None to distinguish between "caller didn't pass an argument" and "caller passed a real value".
🧵 (1/3)
If I recall correctly, it was Akkana Peck @akkana who first introduced me to Python, probably around 1998 or 1997 (so something in the neighborhood of Python v1.5) while working together at Netscape (I had a different name back then). **That** turned out to be a life-changing event; so thanks, Akkana!
Python Tip #128 (of 365):
Chain method calls for readability's sake
When an object's methods return the same type of object, prefer to chain calls together instead of juggling extra variables.
String methods are the classic example of this.
Each one returns a new string, so they chain nicely:
normalized = message.strip().lower().replace(",", "")
Imagine if we made a "stripped" variable and a "lower_stripped" variable for those 2 intermediary steps.
🧵 (1/4)
Heizungs-Fernsteuerung per SMS
Ich bin Fernpendler. In meiner "Arbeits"-Wohnung benutze ich nur mobiles Internet. Um die Heizung bei Bedarf anschalten zu können, habe ich eine Steuerung gebaut, die auf SMS reagiert.
#Wettbewerb_Frühling_2026 #Automatisierung #SMS #Python #gammu #Linux
#Linux #Python
Diese USB-schaltbare Steckdosenleiste beim Pearl-Versand gekauft 2009 funktioniert immer noch. Und die Links auf meiner Webseite zu Sourceforge tun auch noch.
Das nenn ich mal #Nachhaltigkeit 👍 👍 👍
https://www.wormser-region.de/index5482.html
🐍🚀 Out now: Python 3.15 beta 1!
🧊 This is the feature freeze, and now it's *your* turn to test out all the amazing things we've been baking for the past 12 months!
💤 Lazy imports!
🧊 frozendict builtin!
💂 sentinel builtin!
📉 Tachyon profiler!
🖼️ Frame pointers everywhere!
🧳 Unpacking in comprehensions!
8️⃣ UTF-8 default encoding!
🆕 Startup config files!
⌨️ Loadsa typing!
🎨 More colour!
https://discuss.python.org/t/python-3-15-0-beta-1-is-here/107231
Please report bugs, we'll fix for the big October release.
Hey #Python library maintainers! 👋 I sometimes see pull requests from well-meaning users about bumping minimum versions of dependencies to "fix security vulnerabilities". Here's a resource you can link to about why this strategy doesn't work in practice:
https://sethmlarson.dev/library-version-specifiers-not-for-vulnerabilities
RE: https://mastodon.social/@7ASecurity/116521920390604616
💪 “urllib3's supply chain posture was described as exceptionally strong, with advanced compliance across SLSA Source, Build, and Provenance requirements. The project maintainers were helpful, responsive, and engaged throughout the audit, ensuring that 7ASecurity had the necessary access and information at all times”
Excellent work @illiav and @quentinpradet! 👏
RE: https://mastodon.social/@hugovk/116534312819614916
Just as importantly!
After two years, it's now time to ceremoniously hand over the `main` branch to @savannah!
`main` is now accepting new features for Python 3.16, and I bet it's going to be even better than 3.15.
https://peps.python.org/pep-0826/
#Python #Python315 #Python316
🐍🚀 Out now: Python 3.15 beta 1!
🧊 This is the feature freeze, and now it's *your* turn to test out all the amazing things we've been baking for the past 12 months!
💤 Lazy imports!
🧊 frozendict builtin!
💂 sentinel builtin!
📉 Tachyon profiler!
🖼️ Frame pointers everywhere!
🧳 Unpacking in comprehensions!
8️⃣ UTF-8 default encoding!
🆕 Startup config files!
⌨️ Loadsa typing!
🎨 More colour!https://discuss.python.org/t/python-3-15-0-beta-1-is-here/107231
Please report bugs, we'll fix for the big October release.
🐍🚀 Out now: Python 3.15 beta 1!
🧊 This is the feature freeze, and now it's *your* turn to test out all the amazing things we've been baking for the past 12 months!
💤 Lazy imports!
🧊 frozendict builtin!
💂 sentinel builtin!
📉 Tachyon profiler!
🖼️ Frame pointers everywhere!
🧳 Unpacking in comprehensions!
8️⃣ UTF-8 default encoding!
🆕 Startup config files!
⌨️ Loadsa typing!
🎨 More colour!
https://discuss.python.org/t/python-3-15-0-beta-1-is-here/107231
Please report bugs, we'll fix for the big October release.
Just released: PrettyTable 3.16 🚀
Just released: norwegianblue 0.21.0 🚀
Add support for OSC 8 hyperlinks in the terminal.
https://github.com/prettytable/prettytable/releases/tag/3.16.0
norwegianblue now uses this to create hyperlinks in the terminal instead of printing a wide column of links. Use command+click with iTerm.
Also create hyperlinks for Markdown, reStructuredText and HTML output.
https://github.com/hugovk/norwegianblue/releases/tag/0.21.0
Attached are before and after images.
Just released: termcolor 3.0.0 🚀
ANSI colour formatting for the terminal.
🎨 Add support for Python 3.14
🎨 Only apply FORCE_COLOR, NO_COLOR & ANSI_COLORS_DISABLED env vars when present & not an empty string
🎨 Replace literal types with strings
🎨 Replace deprecated classifier with licence expression (PEP 639)
🎨 Speedup: move typing imports into type-checking block
🎨 Remove deprecated __ALL__, use __all__ instead
Just released: Python 3.14.0a7 🚀
Just released: Python 3.13.3 🚀🚀
Just released: Python 3.12.10 🚀🚀🚀
Just released: Python 3.11.12 🚀🚀🚀🚀
Just released: Python 3.10.17 🚀🚀🚀🚀🚀
Just released: Python 3.9.22 🚀🚀🚀🚀🚀🚀
Last 3.14 alpha! Less than a month to get new features in before beta!
Last 3.12 bugfix release! Now in security fix only!
And security releases of 3.9-3.11.
Please upgrade 3.9-3.13!
Please test 3.14!
Just released: Pillow 11.2.1 🚀
There was meant to be a 11.2.0 on 1st April, but we put too much good stuff in the wheels and hit the @pypi.org project limit before it could all be uploaded. That was yanked and now deleted and 11.2.1 is back to normal size.
We'll try and put the good stuff back for 11.3.0 on 1st July but take up less space.
Just released: Python Docs Theme 2025.4 🚀
📚 Require Sphinx 7.3
📚 Add support for Python 3.14
📚 Drop support for Python 3.10-3.11
📚 Copy button for code samples
📚 PEP 639 licence metadata
📚 and more!
https://github.com/python/python-docs-theme/releases
Thanks to Tomas Roun for the copy button! Demo:
🙈 https://www.youtube.com/watch?v=2cxSP90gj8c [Vappu is May Day]
Just released! 🚀🚀🚀🚀
termcolor 3.1.0
Add true colour, cache system lookups
https://github.com/termcolor/termcolor/releases/tag/3.1.0
em-keyboard 5.1.0
Add Emoji 16.0: 🇨🇶
https://github.com/hugovk/em-keyboard/releases/tag/v5.1.0
Humanize 4.12.3
Fix regression in naturalsize, improve French translation
https://github.com/python-humanize/humanize/releases/tag/4.12.3
Python Docs Theme 2025.4.1
Fix copy button with multiple tracebacks
https://github.com/python/python-docs-theme/releases/tag/2025.4.1
#Python #release #termcolor #humanize #Sphinx #theme #EmKeyboard #PythonDocsTheme
Just released: Python 3.14.0 beta 1! 🚀🐍
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-0-beta-1-is-here/91117?u=hugovk
Just released: Python 3.14.0 beta 2! 🚀🐍
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
Do you maintain a Python package? Please test 3.14. If you find a bug now, we can fix it before October, which helps everyone. And you might find some places in your code to update as well, which helps you.
https://discuss.python.org/t/python-3-14-0-beta-2-is-here/93396?u=hugovk
Just released: Python 3.14.0 beta 3! 🚀🐍
🥧 All the good stuff of b2 but also:
🥧 Free-threaded Python is officially supported! (PEP 779)
🥧 Subinterpreters in the stdlib! (PEP 734)
Do you maintain a Python package? Please test 3.14.
If you find a bug now, we can fix it before October, which helps everyone. And you might find some places in your code to update as well, which helps you.
https://discuss.python.org/t/python-3-14-0-beta-3-is-here/95843?u=hugovk
#Python #CPython #Python314 #release #PEP779 #PEP734 #FreeThreaded #subinterpreters
Just released: linkotron 0.6.0!
🔗 Adds OSC 8 formatting so you can do make those clickable links in terminal emulators.
https://pypi.org/project/linkotron/
#Python #release #linkotron
Just released: Python 3.14.0 beta 4! 🚀🐍
🥧 Last beta!
🥧 Do you maintain a Python package? Please test and report bugs!
🥧 This includes creating pre-release wheels for 3.14, as it helps other projects to do their own testing.
https://discuss.python.org/t/python-3-14-0-beta-4-is-here/98092/1?u=hugovk
#Python #CPython #Python314 #release
Just released: Python 3.14.0 release candidate 1! 🚀🐍
🫖 T-strings!
🧵 Free-threading is officially supported!
🚇 Subinterpreters in the stdlib!
🗜️ Zstandard compression!
🎨 REPL syntax highlighting and tab autocomplete!
⚠️ Better error messages!
📦 Are you a package maintainer? Prepare for 3.14 and report bugs!
🛞 No ABI changes: upload 3.14 wheels to PyPI
🥧 And much, much more!
https://discuss.python.org/t/python-3-14-release-candidate-1-is-go/99754?u=hugovk
#Python #CPython #Python314 #release
Just released: Python 3.14.0 release candidate 2! 🚀🐍
🪄 This was planned for 2025-08-26, but we fixed a bug that required bumping the magic number stored in bytecode (.pyc) files
🪄 This means .pyc files created for rc1 will be recompiled for rc2
🪄 The ABI isn’t changing
🪄 Wheels built for rc1 should be fine for rc2, rc3 and 3.14.x
🤖 Did I mention Android binaries?
🏆 Bonus: We also released an early Python 3.13.7!
https://discuss.python.org/t/python-3-14-0rc2-and-3-13-7-are-go/102403
#Python #CPython #Python314 #Python313 #release
Just released: UltraJSON 5.11.0! 🚀
⌨️ Inline type stubs
🐍 Support for Python 3.14 & PyPy3.11
🛞 Windows ARM64 wheels (thanks @tonybaloney!)
💧Drop EOL Python 3.8 & PyPy3.8-PyPy3.10
➕ And more!
https://github.com/ultrajson/ultrajson/releases/tag/5.11.0
#Python #release #ujson #UltraJSON
Just released: Cherry Picker 2.6.0! 🚀
🌸 Fix bug when local branch does not exist (thanks, @webknjaz!)
🌸 Use PEP 639 licence expression and remove deprecated Trove classifier
https://github.com/python/cherry-picker/releases/tag/cherry-picker-v2.6.0
Just released: OSMViz 4.5.0! 🚀
An OpenStreetMap visualization toolkit for Python
🥧 Support for Python 3.14
🪪 Replace deprecated classifier with licence expression (PEP 639)
🔍 Remove GitHub attestation, PyPI attestation is enough
Just released: humanize 4.13.0! 🚀
🤖 Optimise `naturalsize` algorithm by using `math.log`
🤖 Fix `precisedelta` rounding
https://github.com/python-humanize/humanize/releases/tag/4.13.0
#Python #humanize #release
Just released! 🚀
After one sequential-only CI failure, two artifacts builds, one GitHub outage, two fixes for the Windows installer build, four Windows builds, and a NuGet outage:
🐍 Python 3.15 alpha 2!
🔬 PEP 799: A new high-frequency statistical sampling profiler
💬 PEP 686: Python now uses UTF-8 as the default encoding
🌊 PEP 782: A new PyBytesWriter C API to create a Python bytes object
⚠️ Better error messages
https://discuss.python.org/t/python-3-15-0a2/104948?u=hugovk
Just released! 🚀
🎶 pylast 7.0.0
🎤 A #Python interface to @lastfm and Libre.fm
🗑️ Remove `SCROBBLE_SOURCE_*` and `SCROBBLE_MODE_*` constants. Last used in 2017, you probably weren't using them
📻 Add `chosen_by_user` parameter to `scrobble`. Set to false if you don't have "direct" control over the source, like radio or a stream.
🐍 Add support for Python 3.15
📼 Test against recorded API instead of live
🦀 Replace pre-commit with prek
Thanks to @scy!
https://github.com/pylast/pylast/releases/tag/7.0.0
#release #LastFM
Just released! 🚀🐍
Python 3.14.1
Waiting for the .1 to upgrade? This one's especially for you!
🥧 Deferred type annotation evaluation!
🥧 T-strings!
🥧 Zstandard!
🥧 Syntax highlighting in the REPL!
🥧 Colour in unittest, argparse, json and calendar CLIs!
🥧 UUID v6-8!
🥧 And much more!
https://discuss.python.org/t/python-3-14-1-is-now-available/105163
Just released! 🚀🐍
Python 3.14.2 (and 3.13.11)
Waiting for the .2 to upgrade? This one's especially for you!
So soon? We found some regressions, so here’s an expedited pair of releases. They also come with bonus security fixes.
https://discuss.python.org/t/python-3-14-2-and-3-13-11-are-now-available/105214?u=hugovk
Just released! 🚀
Python Docs Sphinx Theme
This is the theme for the Python documentation (and others)
* Add support for green, red and yellow side borders for code examples
* Add Portuguese translation
* Add support for Python 3.15
https://github.com/python/python-docs-theme/releases/tag/2025.12
Just released! 🚀
🐍 Python 3.15 alpha 3!
https://discuss.python.org/t/python-3-15-0-alpha-3/105325?u=hugovk
🔬 PEP 799: A new high-frequency statistical sampling profiler and dedicated profiling package
💬 PEP 686: Python now uses UTF-8 as the default encoding
🌊 PEP 782: A new PyBytesWriter C API to create a Python bytes object
🎨 Colour code snippets in argparse help: https://bsky.app/profile/savannah.dev/post/3m7svdqdeqs2x
⚠️ Better error messages
#Python #Python315 #CPython #release #PEP799 #PEP686 #PEP782 #argparse
Just released! 🚀
🤖 Humanize 4.15.0
This does stuff like turning a number into a fuzzy human-readable duration ("3 minutes ago")
https://github.com/python-humanize/humanize/releases/tag/4.15.0
* Add locale support for decimal separator in `intword`
* Add support for Python 3.15
* `naturaldelta`: round the value to nearest unit that makes sense
* Fix plural form for `intword` and improve performance
* Replace `Exception` with more specific `FileNotFoundError`
* Replace pre-commit with prek
Just released! 🚀
stravavis 0.6.0: create visualisations of Strava activities
* add option to select visualisations/allow --bbox as file/support 3.13-3.14/drop 3.9
https://github.com/marcusvolz/strava_py/releases/tag/v0.6.0
termcolor 3.3.0: ANSI formatting for the terminal
* add italic/fix error handling
https://github.com/termcolor/termcolor/releases/tag/3.3.0
pylast 7.0.1: A Python interface to Last.fm
* fix type hints
Just released! 🚀
pypistats 1.12.0
CLI for PyPI download stats
support 3.15
drop 3.9
improve verbose output
declare type hints
replace dateutil+six dependencies with stdlib
replace httpx with urllib
replace pre-commit with prek
Just released! 🚀
norwegianblue 0.24.0
CLI to show end-of-life dates
show spinner when querying
support 3.15
replace dateutil+six dependencies with stdlib
replace httpx with urllib3
replace pre-commit with prek
RE: https://fosstodon.org/@gaborbernat/116529121485547878
pipx est un outil qui permet d'installer un paquet Python (souvent un outil de type ligne de commande) sur votre ordinateur de façon isolée, sans que ses dépendances interagissent avec d'autres outils systèmes Python. C'est aussi ce que permet la commande uv tool.
Depuis sa version 1.12.0, pipx permet d'ailleurs d'utiliser uv sous le capot : https://pipx.pypa.io/stable/explanation/comparisons/#pipx-vs-uv-tool
I added a `--redact` flag to gh-profiler, to make live demos and screenshots a little easier. I have no problem showing usernames for accounts that clearly burden maintainers, but I want to be careful about that.
I like this project for what it does, but it's also been a perfect small, self-contained project to really learn uv-based workflows.
I've locked the branch and started the builds! 🔒⚙️
https://discuss.python.org/t/python-3-15-0-beta-1-is-near/107193/2
#Python #Python315
OK @glyph challenge accepted. Here is python programming talk.
I have a script that uses "with Popen(...,stdout=PIPE)" to run a program and roughly run grep. Now I'd like to add a timeout, but I don't want to buffer the output (because it is unbounded), so run is out. Currently I am running /usr/bin/timeout from python, but this is, uh, unpythonic.
@glyph you might be interested in python-sql which is a protection against SQL injections. It aims to be lighter than full fledged ORMs. Our goal is also to make SQL queries #python objects that are composable and introspectable
We've been using it for years in #tryton so it covers quite a lot of the SQL standard. What's missing from my quick look to dbxs is the typing part.
Made a few more changes to the little download manager I'm tinkering with.
RE: https://wandering.shop/@LAcon/116528709912868061
I’m proud that my work (https://nomnom.fans/) is helping to make the #HugoAwards happen again this year. When you vote in the Hugo Awards, or download the packet, you're using software I wrote. It's open source -- a rarity in convention software, but in my opinion, so critical to the trust we must have in the process -- and made with #Python and #Django and many other software libraries that are also freely given to the developer community.
Python Tip #126 (of 365):
Prefer to return expressions instead of variables
If a variable name would make the meaning of the expression more understandable, ask yourself "does my function name convey the meaning well-enough already?"
If not, ask "why not?"
Sometimes "return some_variable" might improve readability, even if some_variable could be replaced by an expression. But usually I find an equivalent expression more readable.
@kattni's @NorthBayPython talk:
https://youtu.be/tFvqb3CabQ0
@ambv & the other one's latest core.py podcast:
https://open.spotify.com/episode/5pD08pb1Tt7Z7k2ZSIdih9
@savannah's Core Dispatch:
https://coredispatch.xyz/editions/3
The Language Summit coming to EuroPython:
https://discuss.python.org/t/python-language-summit-at-europython-2026-in-krakow/107194
And all the really cool stuff coming in 3.15, can't wait to get it out!
https://docs.python.org/3.15/whatsnew/3.15.html
Release week update!
Also moving release 3/3 this week, 3.14.5 final, by a couple of days to give some more time for testing of the RC 🚀
https://discuss.python.org/t/python-3-14-5-release-candidate/107185/2
Current plan:
✅ 3.14.5rc1 on Monday 4nd (+2 days)
⬜ 3.15.0b1 on Thursday 7th (+2 days)
⬜ 3.14.5 final on Sunday 10th (+2 days)
Installing #Spyder on
#NixOS, ugh... 😩
• must use spyder from unstable, in stable it depends on insecure qtwebengine-5
• it runs, but the interactive terminal needs spyder_kernels module
• adding python3Packages.spyder-kernels to the python env, doesn't help
• putting python3Packages.spyder{,-kernels} both into current Python env is a problem, how do I make a nixpkgs.overlays to pick certain Python packages from unstable?
😑....
I had a thought the other day while reading and modifying CurlFlow. The LLM that Jan was using (a 30B Qwen Coder thing) got things probably 90% there, but it made some decisions that might have "worked", but weren't optimum, even by my novice standards. For example, for importing, it just had line after line of:
import this
import that
With no error checking. So instead, I put this together.
Continued...
1/
Signups and topic submissions are now open for the Language Summit at EuroPython in Kraków!
https://ep2026.europython.eu/language-summit/
The Python Language Summit is an event for the developers of Python implementations (CPython, PyPy, MicroPython, GraalPython, IronPython, and so on) to share information, discuss our shared problems, and — hopefully — solve them.
https://discuss.python.org/t/python-language-summit-at-europython-2026-in-krakow/107194
I'm postponing Python 3.15 beta 1 to Thursday to get the last few things in. We're close!
https://discuss.python.org/t/python-3-15-0-beta-1-is-near/107193
#Python #cryptography library (yes, the one that criticizes everything and everyone) is now vibecoded. Our future is truly bright!
Noticed because apparently "Claude" wrote a test that OOM-ed my system. But hey, #RustLang protects against memory errors, so it's fine to vibecode your security critical components.
RE: https://mastodon.social/@posetteconf/116482697001262767
My talk at POSETTE 2026 will be in the livestream on June 17 📆
I’ll walk through how generated columns changed across PostgreSQL versions, using Django as a real case 🔍
Curious how people are actually using them in production, or not using them at all 🤔
Python 3.14.5 release candidate is out now! Please test!
https://blog.python.org/2026/05/python-3145rc1/
Next up, 3.15 beta 1 tomorrow.
#CopyFail (CVE-2026-31431) : Synthèse technique sur cette faille. Classifiée CVE-2026-31431 avec un score CVSS de 7.8/10, elle permet à n'importe quel processus tournant sur une machine #Linux de devenir #root, et ce, sur l'intégralité des #distributions majeures depuis 2017. Le proof-of-concept public fait 732 octets de #Python. En une commande, on devient root. C'est incroyable !
https://www.linuxtricks.fr/news/10-logiciels-libres/600-copy-fail-cve-2026-31431-synthese-technique-sur-cette-faille-linux/
⛄ One day until 3.15 feature freeze! ❄️
Four blockers, 10 broken buildbots and two PEPs still to merge? Business as usual on freeze eve, we'll get there!
Made some minor tweaks to CurlFlow today. Made the "Add New Download" dialog slightly wider because I didn't like how cramped it felt when pasting a URL. Also added the program version to the title bar.
The new pip version comes with experimental lockfile support *and* `--uploaded-prior-to` for dependency cooldowns, neat.
Second talk of the morning at DjangoCon Europe 2026 🇬🇷
Now listening to Vjeran Grozdanic from Sentry🎤
Talking about encrypting data in Django without complex migrations, with a drop-in field that can handle both old plain text and new encrypted data on the fly… very curious about this approach 🙂
I tinkered around and have thrown together a basic graphical download manager for #Linux if anybody wants to check it out.
AI Disclaimer: Most of the original work was done as an experiment with some free and locally hosted LLMs.
Exploit Linux local pour passer root : #copyFail (CVE-2026-31431)
La société Theori a publié un exploit (écrit avec #Python 3.10) pour le noyau #Linux x86-64 pour passer #root en local. Il utilise un #bug dans les sockets AF_ALG sur une opération AEAD qui existe depuis 2017 (commit).
https://linuxfr.org/users/vstinner/journaux/exploit-linux-local-pour-passer-root-copy-fail-cve-2026-31431
Tinkering around with making my own #Python frontend to curl to act as a simple download manager. I noticed uGet hadn't been updated in multiple years, and I never really used the "categories" feature of it myself, so I had the idea of making my own very basic alternative. It supports basic HTTP auth in the event a web folder is password protected.
This is the old cooling configuration of my Raspberry Pi5. A simple aluminum block cooled by a relatively good yet small fan. There are different ways to read the fan and temperatures of this SBC which may need some simple Python programming
📰 Issue 335: Redesigning DjangoProject.com
https://django-news.com/archive/issue-335-redesigning-djangoprojectcom/
Python Tip #121 (of 365):
If your command-line script has a couple functions, put remaining logic in a main function.
Python knows nothing about main functions but other Python developers do.
Once your script grows a function or 2:
1. put all remaining logic in a main function
2. write a if __name__ == "__main__" conditional guard that calls main()
3. consider extracting argument-parsing logic into its own function: I often call this parse_args
🧵 (1/3)
I have released version 1.15 of slixmpp, the python XMPP library.
Besides the continuation of @nicoco ’s quest to add every XEP under the sun, the most notable change is that building the rust module is now optional (i.e. in the absence of sufficient tools, slixmpp will happily be installed using the pure-python fallback for the JID module, which is kind of important for Mac OS or Winslop platforms).