For the duration of 2025, I’m thrilled to join the Sovereign Tech Fellowship for Maintainers! This is a pilot programme from the Sovereign Tech Agency to pay maintainers of critical open source technologies in the public interest. I’m one of six participants in this first cohort and I’ll be working on Python, with a focus on CPython, including as release manager for Python 3.14 (under development with full release due in October 2025, supported until 2030) and the next one (development ...| Blog on Hugo van Kemenade
PEPs # Here’s Barry Warsaw on the origin of PEPs, or Python Enhancement Proposals (edited from PyBay 2017): I like backronyms. For those who don’t know: a backronym is where you come up with the acronym first and then you come up with the thing that the acronym stands for. And I like funny sounding words, like FLUFL was one of those. When we were working for CNRI, they also ran the IETF conferences. The IETF is the Internet Engineering Task Force, and they’re the ones who come up with t...| Blog on Hugo van Kemenade
Following Jeff Triplett’s lead, here’s a list of my most used terminal commands. No.TotalCommandInfo 1.1239rgripgrep 2.1038caliased to pycharm 3.847gcaliased to git commit --verbose via Oh My ZshGit plugin 4.559gcoaliased to git checkout 5.518git 6.384./python.exePython built from source on macOS 7.365cd 8.359cataliased to bat -p 9.336gsaliased to scmpuff_status via scmpuff to give numeric shortcuts for files 10.326glaliased to git log via Oh My Zsh Git plugin 11.315gbaliased to git branc...| Blog on Hugo van Kemenade
GitHub Actions now supports experimental free-threaded CPython! There are three ways to add it to your test matrix: actions/setup-python: t suffix actions/setup-uv: t suffix actions/setup-python: freethreaded variable actions/setup-python: t suffix # Using actions/setup-python, you can add the t suffix for Python versions 3.13 and higher: 3.13t and 3.14t. This is my preferred method, we can clearly see which versions are free-threaded and it’s straightforward to test both regular and free-t...| Blog on Hugo van Kemenade
What? # PEP 639 defines a spec on how to document licences used in Python projects. Instead of using a Trove classifier such as “License :: OSI Approved :: BSD License”, which is imprecise (for example, which BSD licence?), the SPDX licence expression syntax is used. How? # pyproject.toml# Change pyproject.toml as follows. I usually use Hatchling as a build backend, and support was added in 1.27: [build-system] build-backend = "hatchling.build" requires = [ "hatch-vcs", - "hatchling", + "...| Blog on Hugo van Kemenade
Prologue # This was a Twitterthread from 15th January 2022 about my first CPython bug. Eight days from report to fix to merge, not bad! --- Delay # I helped delay the release of Python 3.11.0a4! But in a good way! 😇 Python 3.11 is due out in October, but they make early alpha, beta and release candidates available for people to help test Python itself and their own code before the big release. So I tested Pillow… Tests # The Pillow test suite passed with 3.11 ✅ Next I tried building th...| Blog on Hugo van Kemenade
You can get download numbers for PyPI packages (or projects) from a Google BigQuery dataset. You need a Google account and credentials, and Google gives 1 TiB of free quota per month. Each month, I have automation to fetch the download numbers for the 8,000 most popular packages over the past 30 days, and make it available as more accessible JSON and CSV files at Top PyPI Packages. This data is widely used for research in academia and industry. However, as more packages and releases are uploa...| Blog on Hugo van Kemenade
We can use uv to make linting and testing on GitHub Actions around 1.5 times as fast. Linting # When using pre-commit for linting: name:Linton:[push, pull_request, workflow_dispatch]env:FORCE_COLOR:1permissions:contents:readjobs:lint:runs-on:ubuntu-lateststeps:- uses:actions/checkout@v4with:persist-credentials:false- uses:actions/setup-python@v5with:python-version:"3.x"cache:pip- uses:pre-commit/action@v3.0.1 We can replace pre-commit/action with tox-dev/action-pre-commit-uv: - uses: actions/...| Blog on Hugo van Kemenade
🐍🏃The week before last was the annual Python Core Dev Sprint, graciously hosted by Meta in Bellevue, WA! The idea: bring a bunch of Python core team members, triagers, and special guests to the same room for a week. It’s hugely beneficial and productive, we held many in-depth discussions that just don’t happen when we’re all remote and async, and got to work on many different things together. The sprint roomDuring the week, I reviewed 39 PRs, created 15, merged 10, updated 4, and ...| Blog on Hugo van Kemenade
If you read just one, check Kati’s thorough recap! 22nd May 2024 Echos of the People API user guide by Ned Batchelder 24th May 2024 Wagtailers spread their wings at PyCon 2024 by Meagen Voss (@vossisboss) Flet at PyCon US 2024 by Feodor Fitsner 27th May 2024 PyCon US 2024: My First PyCon in US 🫶🏻 by Tomy Hsieh 28th May 2024 PyCon 2024 Reflection by Trey Hunner Weeknotes: PyCon US 2024 by Simon Willison 3 key takeaways from PyCon US 2024 by Luis Juncal & Yolanda Robla 30th May 2024 pyO...| Blog on Hugo van Kemenade
Calling all Python library maintainers! 🐍 The Python 3.13 beta is out! 🎉 PEP 719 defines the release schedule for Python 3.13.0: The first beta candidate came out on 8th May 2024 The first release candidate is set for 30th July 2024 And the full release is set for 1st October 2024 In his announcement, Thomas Wouters, release manager for Python 3.12 and 3.13, said: We strongly encourage maintainers of third-party Python projects to test with 3.13 during the beta phase and report issues f...| Blog on Hugo van Kemenade
Want to print out the PyCon US schedule? Paper doesn’t run out of batteries, is easy to scribble on, and stuff into a pocket (technical term: the affordances of paper). Here’s some custom CSS and JavaScript to make it nicely printable. Install the Styler browser extension View a PyCon schedule page such as https://us.pycon.org/2024/schedule/talks/ and click the Styler extension’s S icon Paste this CSS into the upper box: body.pycon-schedulediv.internal-page-header,body.pycon-schedulediv...| Blog on Hugo van Kemenade
Python 3.13 is due out in October 2024 and work is underway to implement experimental support for PEP 703 - Making the Global Interpreter Lock Optional in CPython. See also Free-threaded CPython in “What’s New in Python 3.13?” As the Steering Council noted in their acceptance of the PEP, to succeed it’s important to have community support. Projects will need to test their code with free-threaded (aka “nogil” but don’t call it that!) Python builds to help us find bugs in CPython,...| Blog on Hugo van Kemenade
On the Python Developer’s Guide and Pillow documentation we have some pages with tabs for different operating systems: It’s possible to add some JavaScript so that the matching tab is activated based on the visitor’s operating system. Here’s how! Sphinx Inline Tabs # First add the Sphinx Inline Tabs extension to your docs' requirements.txt: # requirements.txt sphinx-inline-tabs>=2023.4.21 JavaScript # Next, add activate_tab.js to your _static/ directory: // activate_tab.js // Based on...| Blog on Hugo van Kemenade
Here’s some tech style guides: Google developer documentation style guideWord list Microsoft Writing Style Guide Red Hat Technical Writing Style GuideRed Hat supplementary style guide for product documentation Bishop Fox Cybersecurity Style GuidePDF Apple Style Guide Python docs style guide Canonical Documentation Style GuideCanonical reStructuredText style guide And some other style guides: Guardian and Observer style guide Wikipedia Manual of Style Mailchimp Content Style GuideWriting for...| Blog on Hugo van Kemenade
Sometimes you have code you want to exclude from the test coverage report, because it doesn’t really make sense to test it. For example, maybe you want to exclude: if__name__=="__main__":main() The old advice was to add something like this to .coveragerc: [report]# Regexes for lines to exclude from considerationexclude_lines= # Have to re-enable the standard pragma: pragma: no cover# Don't complain if non-runnable code isn't run:if __name__== .__main__.: But since coverage.py 7.2.0 (2023-02...| Blog on Hugo van Kemenade
Python 3.7 was first released on 2018-06-27 and recently reached end-of-life on 2023-06-27 (PEP 537). This means it is no longer receiving security updates and you should upgrade to a newer version (at least 3.8, but preferably 3.11): Source: Python Developer's GuideHowever, if you look at download numbers from PyPI, 3.7 still accounts for a large share. 3.7 accounted for 25% of all downloads from PyPI in July 2023, compared with 27% for 3.8: Source: pypi-toolsBut why does such an old Python ...| Blog on Hugo van Kemenade
Calling all Python library maintainers! 🐍 The third and final Python 3.12 release candidate is out! 🎉 PEP 693 defines the release schedule for Python 3.12.0: The first release candidate came out on 6th August 2023 The second and final release candidate came out on 6th September 2023 The third and final release candidate came out on 19th September 2023 And the full release is set for 2nd October 2023 In his announcement, Thomas Wouters, release manager for Python 3.12 and 3.13, said: We ...| Blog on Hugo van Kemenade
GitHub Actions has a useful feature to trigger workflows on a cron schedule. For example: name:Teston:push:pull_request:schedule:- cron:"0 6 * * *"# daily at 6amjobs:test:runs-on:ubuntu-lateststeps:- uses:actions/checkout@v3 But if a contributor has enabled GitHub Actions on their fork (which I recommend: test your contributions before opening a PR), it also runs the cron on their fork. This not only uses up extra CI resources on the fork: It also sends a regular email to the contributor when...| Blog on Hugo van Kemenade
Want to print out the PyCon US 2023 schedule? Paper doesn’t run out of batteries, is easy to scribble on, and stuff into a pocket. Here’s some custom CSS and JavaScript to make it nicely printable. Install the Styler browser extension View a PyCon schedule page such as https://us.pycon.org/2023/schedule/talks/ and click the Styler extension’s S icon Paste this CSS into the upper box: body.pycon-scheduleaside.sidebar,body.pycon-schedulediv.badges,body.pycon-schedulebutton.menu-button.ope...| Blog on Hugo van Kemenade
What I built # I built a Mastodon bot that posts a a different bit of Pluto every six hours. Category Submission # Wacky Wildcard App Link # https://botsin.space/@bitsofpluto Screenshots # https://botsin.space/@bitsofpluto/109854013035140138 --- https://botsin.space/@bitsofpluto/109878078918934666 --- https://botsin.space/@bitsofpluto/109882325572738354 --- https://botsin.space/@bitsofpluto/109872416513104327 --- https://botsin.space/@bitsofpluto/109869584884331747 --- https://botsin.space/@b...| Blog on Hugo van Kemenade
Why? # Often Python core developers think about deprecating and removing old bits of the language. But first it’s a good idea to get an idea of how much the old bits are used. Searching the 5,000 most-popular projects on PyPI is a helpful proxy to gauge community use. How? # Core developer Victor Stinner has written a couple of useful scripts that live in his misc repo. Setup # First, clone the repo somewhere, doesn’t matter where: mkdir -p ~/github cd ~/github/ git clone https://github.c...| Blog on Hugo van Kemenade
Calling all Python library maintainers! 🐍 Python 3.11 is in beta! 🎉 PEP 664 defines the release schedule for Python 3.11.0: The second beta came out on 31st May 2022 The first release candidate is set for 1st August 2022 And the full release is set for 3rd October 2022 In his announcement, Pablo Galindo Salgado, release manager for Python 3.10 and 3.11, said: We strongly encourage maintainers of third-party Python projects to test with 3.11 during the beta phase and report issues found ...| Blog on Hugo van Kemenade
Top PyPI Packages is a website that creates a monthly dump of the 5,000 most-downloaded packages from the Python Package Index (PyPI). It provides a human-readable list and a machine-readable JSON file for programmatic use. How it’s used # The generated data is important for the Python community: it has been cited by many academic papers, covering research on topics such as software supply-chain attacks, genetic algorithms, neural type hints and technical debt. Websites also use the data fo...| Blog on Hugo van Kemenade
Or, a variation on the Norway problem # Short version: put quotes around version numbers in YAML. The Norway problem # The Norway problem is when you put this in YAML: countries:- GB- IE- FR- DE- NO But get this out: >>>importyaml>>>withopen("countries.yml")asf:...yaml.safe_load(f)...{'countries':['GB','IE','FR','DE',False]} :scream: The Norway fix # Use quotes: countries:- "GB"- "IE"- "FR"- "DE"- "NO" >>>withopen("countries.yml")asf:...yaml.safe_load(f)...{'countries':['GB','IE','FR','DE','N...| Blog on Hugo van Kemenade
January 2016 — December 2019 # To celebrate the end of life of Python 2 on 1st January 2020, here’s some statistics showing how much different Python versions have been used over four years. Here’s the pip installs for all packages from the Python Package Index (PyPI), between January 2016 and December 2019: pip# The package installer six# Python 2 and 3 compatibility library NumPy# Scientific computing library pytest# Testing framework pandas# Data analysis toolkit Coverage.py# Code co...| Blog on Hugo van Kemenade
January 2016 — October 2019 # To celebrate the release of Python 3.8.0 on 14th October 2019, and with less than two months left for Python 2, here’s some statistics showing how much different Python versions have been used over nearly four years. Here’s the pip installs for all packages from the Python Package Index (PyPI), between January 2016 and October 2019: pip# The package installer six# Python 2 and 3 compatibility library NumPy# Scientific computing library pytest# Testing frame...| Blog on Hugo van Kemenade
January 2016 — March 2019 # To celebrate the release of Python 3.7.3 on 25th March 2019, and with under nine months left for Python 2, here’s some statistics showing how much different Python versions have been used over the past three years. Here’s the pip installs for all packages from the Python Package Index (PyPI), between January 2016 and March 2019: pip# The package installer six# Python 2 and 3 compatibility library NumPy# Scientific computing library pytest# Testing framework C...| Blog on Hugo van Kemenade
January 2016 — December 2018 # To celebrate the release of Python 3.7.2 on Christmas Eve 2018, and with under a year left for Python 2, here’s some statistics showing how much different Python versions have been used over the past three years. Here’s the pip installs for all packages from the Python Package Index (PyPI), between January 2016 and December 2018: For the NumPy scientific computing library: For the pytest testing framework: For the Pillow imaging library: For the Django web...| Blog on Hugo van Kemenade
Three bots have been collecting words from Twitter for the past year. Short version: In 2018, people on Twitter talked about the words stan, toxic, peoplekind, councel, beclowned, caucasity, kakistocracy, catastrofuck, shithole, bombogenesis, chucklefuck, trumpfuckery, clackwanker, wankpuffin, dipshittery, fucksicle, and fuckwangled. Long version: They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word...| Blog on Hugo van Kemenade
January 2016 — October 2018 # To celebrate the release of Python 3.7.1 on 20th October 2018, here’s some statistics showing how much different Python versions have been used over the past two and five-sixths years. Here’s the pip installs for all packages from the Python Package Index (PyPI), between January 2016 and October 2018: pip installs from PyPI over time, by Python versionFor the NumPy scientific computing library: Numpy's pip installs from PyPI over time, by Python versionFor ...| Blog on Hugo van Kemenade
January 2016 — June 2018 # To celebrate the release of Python 3.7 on 27th June 2018, here’s some statistics showing how much different Python versions have been used over the past two and a half years. Here’s the pip installs for all packages from the Python Package Index (PyPI), between January 2016 and June 2018: pip installs from PyPI over time, by Python versionAnd for the Pillow imaging library: Pillow's pip installs from PyPI over time, by Python versionHow # Statistics were colle...| Blog on Hugo van Kemenade
Three bots have been collecting words from Twitter for the past year. Short version: In 2017, people on Twitter talked about the words broflake, caucacity, cockwomble, covfefe, dotard, douchecanoe, dracarys, shitgibbon, shooketh, twatwaffle, and woke. Long version: They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word" @favibot -- "X is my new favorite/favouriteword" Combining and comparing the logs ...| Blog on Hugo van Kemenade
Three bots have been collecting words from Twitter for the past year. They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word" @favibot -- "X is my new favorite/favourite/fave word" Combining and comparing the logs of all three, let's see the top words of 2016. Bold means a word wasn't in that chart in 2015. Combined output Total in 2016: 168,241 mines (4,060) bae (3,369) no (2,582) forever (2,143) lit (2,005...| Blog on Hugo van Kemenade
Here’s some quick charts of some of the words nominated for American Dialect Society 2015 Words of the Year PDF), data taken from a corpus of words talked about on Twitter (read more about them here), as collected by a trio of bots. Notable troughs are generally when the bots were offline. squad fuckboy af lit fleek From my 2015 nominations: # Lit, fleek: see above. fam slay And for my 2013 nominations see here.| Blog on Hugo van Kemenade
Three bots have been collecting words from Twitter for the past year. They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word" @favibot -- "X is my new favorite/favourite/fave word" Combining and comparing the logs of all three, let's see the top words of 2015. Bold means a word wasn't in that chart in 2014. Combined output 2015 total: 219,918 bae (9,513) mines (4,282) no (4,239) love (2,353) moist (2,345) lit...| Blog on Hugo van Kemenade
David-Antoine Williams writes: What is the difference between a catch-all and a catch-phrase? Both are compounds formed as Verb+Noun, but in catch-all, the noun is the direct object of the verb, whereas in catch-phrase it is the subject. That is, a catch-all is something that catches all things, whereas a catch-phrase is not something that catches phrases – it is a phrase that catches something. Get it? Recently there has been some discussion of catch-all type compounds, which Brianne Hughe...| Blog on Hugo van Kemenade
Strong Language, the swearing blog, recently wrote about Clusterboinks and clusterfornications: The children of clusterfuck. Three of my Twitter bots have been collecting words from Twitter since 2013. They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word" @favibot -- "X is my new favorite/favourite/fave word" Here's the clusterfuck variants they've found: clustercoitus clustercuss clusterduck clusterfarf cl...| Blog on Hugo van Kemenade
EngLangBlog offered some man-words and asked for more. Three bots have been collecting words from Twitter since 2013. They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word" @favibot -- "X is my new favorite/favourite/fave word" In alphabetical order, here's all the words they've found starting with man: man man's manaconda manage manageable management manager managerial managering managerish managership man...| Blog on Hugo van Kemenade
Three bots have been collecting words from Twitter for the past year. They've looked for certain sentences and extracted the X. @lovihatibot -- "I love/hate the word X" @nixibot -- "X is not/isn't/ain't a word" @favibot -- "X is my new favorite/favourite/fave word" Combining and comparing the logs of all three, let's see what the top words of 2014 are. Combined output 2014 total: 333,449 bae (25,689) thot (7,787) no (6,888) mines (5,038) love (3,662) moist (3,305) impossible (3,092) ain't (2,...| Blog on Hugo van Kemenade
I wrote a Python script that searches Twitter for tweets containing “[X] is my new favourite word”. It then takes all those new favourite words, logs them, lowercases them, and adds them to a list of words on Wordnik. And, from this week, it also tweets them and makes word clouds. It also does the same for “[X] is my new favorite word” and “[X] is my new fave word” so you can see some geographic variation. It’s been going six months since 24th February 2013, runs nearly every da...| Blog on Hugo van Kemenade
According to Mabishu: After a lot of requests from Linux users, Spotify developers have integrated D-Bus support in version 0.4.8.282. So, what this means is simply and awesome! Now Linux developers could use this programmatic interface to interact with Spotify from other apps. In other words, now is quite simple to send «play», «pause», «move next/previous song» events to Spotify and with this get Spotify fully integrate into our desktop. To toggle playing and pausing from the termina...| Blog on Hugo van Kemenade
KErrNone0 KErrNotFound-1Unable to find the specified object KErrGeneral-2General (unspecified) error KErrCancel-3The operation was cancelled KErrNoMemory-4Not enough memory KErrNotSupported-5The operation requested is not supported KErrArgument-6Bad request KErrTotalLossOfPrecision-7Total loss of precision KErrBadHandle-8Bad object KErrOverflow-9Overflow KErrUnderflow-10Underflow KErrAlreadyExists-11Already exists KErrPathNotFound-12Unable to find the specified folder KErrDied-13Closed KErrIn...| Blog on Hugo van Kemenade
Another amazing application for S60 phones! (But not S60 3rd Ed.) Like all the best applications it has a hard-coded exchange rate and a rubbish UI! Booze It! is the perfect tool for those who like the odd drink or two. It has two modes: Home and Away. Away blurb # Ever been in a foreign pub drinking half a litre of beer (sometimes in a pint glass) and wondering what it would cost in proper money? Well, it’s easy enough to convert from euros to pounds, either in your head or with your phone...| Blog on Hugo van Kemenade
These settings work for sending on the Nokia 6680, but not receiving… I used to be able to receive as well, but at least sending works and means I can use the “Send as email” option in things like Lifeblog, and use Opera or the phone’s built-in Web app to check received email at gmail.com.| Blog on Hugo van Kemenade
And here’s a freeware big clock for your Series 60 phone :)| Blog on Hugo van Kemenade
2025| Hugo van Kemenade