Skip to content

Drop Python 3.10 support after its end-of-life #74

Description

@m96-chan

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.tomlrequires-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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions