Tracking issue. Do not act on this before Python 3.10 actually reaches end-of-life.
Timing
Per the CPython version status page, as of 2026-09-05:
| Version |
Status |
End of life |
| 3.9 |
end-of-life |
2025-10-31 |
| 3.10 |
security |
2026-10 (scheduled) |
| 3.11 |
security |
2027-10 |
| 3.12 |
security |
2028-10 |
| 3.13 |
bugfix |
2029-10 |
| 3.14 |
bugfix |
2030-10 |
3.10 is still in its security phase and is not EOL yet. The devguide shows the date in italics, meaning it is scheduled and can move, so confirm the actual date before starting rather than assuming a specific day in October.
What to change when the time comes
Drop 3.10:
pyproject.toml — requires-python = ">=3.10" → ">=3.11"
pyproject.toml — remove the Programming Language :: Python :: 3.10 classifier
.github/workflows/ci.yml — two matrices (build-wheels, test-python), both at python-version: ["3.10", ...]
.github/workflows/release.yml — one matrix
.github/workflows/test-release.yml — one matrix
This is a breaking change for anyone still on 3.10, so it wants a version bump beyond a patch release (currently 3.0.2).
Also fix at the same time: linter targets are stale today
Independent of the 3.10 decision, both linters are configured against a Python version that is already end-of-life:
requires-python = ">=3.10"
[tool.black]
target-version = ["py39", "py310", "py311", "py312"] # py39 is EOL; py313/py314 missing
[tool.ruff]
target-version = "py39" # py39 is EOL (2025-10-31)
So the project is linted for 3.9 while requiring 3.10+, and black is not told about the 3.13/3.14 the project ships wheels for. These should be aligned with whatever requires-python ends up being.
Note that raising the ruff target enables additional pyupgrade rules, which will surface new lint errors that need fixing in the same change. That is why this was deliberately left out of the CI-unblocking work in #71 and #73 — it is a behavioural change to linting, not a fix.
Tracking issue. Do not act on this before Python 3.10 actually reaches end-of-life.
Timing
Per the CPython version status page, as of 2026-09-05:
3.10 is still in its security phase and is not EOL yet. The devguide shows the date in italics, meaning it is scheduled and can move, so confirm the actual date before starting rather than assuming a specific day in October.
What to change when the time comes
Drop 3.10:
pyproject.toml—requires-python = ">=3.10"→">=3.11"pyproject.toml— remove theProgramming Language :: Python :: 3.10classifier.github/workflows/ci.yml— two matrices (build-wheels,test-python), both atpython-version: ["3.10", ...].github/workflows/release.yml— one matrix.github/workflows/test-release.yml— one matrixThis is a breaking change for anyone still on 3.10, so it wants a version bump beyond a patch release (currently 3.0.2).
Also fix at the same time: linter targets are stale today
Independent of the 3.10 decision, both linters are configured against a Python version that is already end-of-life:
So the project is linted for 3.9 while requiring 3.10+, and black is not told about the 3.13/3.14 the project ships wheels for. These should be aligned with whatever
requires-pythonends up being.Note that raising the ruff target enables additional pyupgrade rules, which will surface new lint errors that need fixing in the same change. That is why this was deliberately left out of the CI-unblocking work in #71 and #73 — it is a behavioural change to linting, not a fix.