Python 3.12.0a2 is out. So now may be a great time to get your projects to start testing against 3.12.
Note about alpha releases of Python
This is from the same link as above: “During the alpha phase, features may be added up until the start of the beta phase (2023-05-08) and, if necessary, may be modified or deleted up until the release candidate phase (2023-07-31). Please keep in mind that this is a preview release and its use is not recommended for production environments.”
So. Keep that in mind.
But for my Python package projects, like pytest-check, for instance, I want to know ASAP if something is amiss with running on Python 3.12, so I’m going for it.
If you decide to update now
What does that mean?
Many of my projects utilize tox for local testing and GitHub Actions for CI testing. And I’d like to proactively test against 3.12 now, before it’s stressful.
Even though 3.12 is at the Alpha2 phase, it’s not planned on being released until Oct 2, 2023, it’s not too early to set up your testing and be ready.
My steps:
1. Download Python 3.12
Now 3.12a2, but I’ll try to keep track of alpha and beta releases and update accordingly. Download 3 .12a2 here.
2. Try running Python 3.12a2 with py
I love having py, the Python launcher, installed on my Mac. It let’s me run Python 3.12 with a py --3.12
.
3. Update tox.ini for Python 3.12
I’ve already got a envlist
that looks something like this:
envlist = py37, py38, py39, py310, py311, coverage, flake8
I just expand it with py312
:
envlist = py37, py38, py39, py310, py311, py312, coverage, flake8
Then run tox
and see the pytest goodness:
...
py37: commands succeeded
...
py310: commands succeeded
py311: commands succeeded
py312: commands succeeded
coverage: commands succeeded
flake8: commands succeeded
congratulations :)
4. Update GitHub Actions to test with Python 3.12
My test matrix in .github/workflows/main.yml
are usually pretty simple:
...
runs-on: ubuntu-latest
strategy:
matrix:
python: ["3.7", "3.8", "3.9", "3.10", "3.11"]
...
I just extended the list with 3.12-dev
:
...
runs-on: ubuntu-latest
strategy:
matrix:
python: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12-dev"]
...
5. Push to GitHub
Now commit & push and watch the fun.
Example code
I’ve just made these changes to the pytest-check pytest plugin. See PR 106
What if 3.12 fails, but I don’t want my pipeline to stop?
There’s a section of the GitHub Actions docs on handling failures.
If we want to set py3.12-dev to allow failures, we can use continue-on-error
. I’ve tried this and set it up kinda like the GH docs example.
Note that the term “experimental” doesn’t matter, I don’t think. We could have used “foo” or “let-this-one-fail”. But “experimental” does seem appropriate, so I kept it.
jobs:
build:
runs-on: ubuntu-latest
continue-on-error: ${{ matrix.experimental }}
strategy:
matrix:
python: ["3.7", "3.8", "3.9", "3.10", "3.11"]
experimental: [false]
include:
- python: "3.12-dev"
experimental: true
This can be seen in PR 107.
Thanks
- Thanks @btskinn and @hugovk for the question and solution about allowing 3.12-dev workflows to fail.
- Thanks Brett Cannon for python-launcher, that allows me to use
py
on my Mac. - Thanks to whoever is making sure py3.12-dev works on GitHub Actions. Super awesome.
- And of course thank you to everyone working on Python 3.12.