apache / apache/opendal

new feature: bump minimum Python version for the Python binding to 3.12

Open
#7,816 7 comments 1 reaction 1 assignee Claimed by @chitralverma View on GitHub
bindings/python breaking-changes enhancement releases-note/feat
Dominant language
Rust
Stars
5.4k
Forks
825
Avg merge
1d 14m
Merged PRs (30d)
127

Description

## Feature Description

Raise the minimum supported Python version for the `opendal` Python binding from 3.10 to at least 3.12. Concretely:

- `bindings/python/pyproject.toml`: `requires-python = ">=3.10"` → `">=3.12"`
- Drop the dedicated cp310 wheel build leg and make the `abi3` (currently `abi3-py311`) wheel the single non-free-threaded artifact, bumped to `abi3-py312`. (Free-threaded builds, which landed in Python 3.13, stay as-is:
`3.13t`, `3.14t`.)
- Update CI to stop testing on 3.10/3.11, thereby dropping support for them.

## Problem and Solution

**Problem**

Python release/EOL timeline (from https://endoflife.date/python):

| Version | Released | EOL |
| ------- | -------- | --- |
| 3.9 | 2020-10 | 2025-10-31 (past) |
| 3.10 | 2021-10 | 2026-10-31 |
| 3.11 | 2022-10 | 2027-10-31 |
| 3.12 | 2023-10 | 2028-10-31 |
| 3.13 | 2024-10 | 2029-10-31 |

The binding's declared floor (`>=3.10`) targets versions that are at or near end of life, and keeping 3.10 carries concrete maintenance overhead:

- The abi3 floor is already `pyo3/abi3-py311` (`bindings/python/Cargo.toml`), with the standing [comment](https://github.com/apache/opendal/blob/a83e4ed1e3dd19fdc16f61306db33f402ca88412/bindings/python/Cargo.toml#L185). 3.10 therefore needs a **separate, non-abi3 wheel** in `release_python.yml` (`-i python3.10`) in addition to the abi3-py311 wheel — an extra build/release leg solely for the oldest interpreter.

**Solution**

Bump to `>=3.12` and consolidate the wheel matrix:

- One abi3 wheel (`abi3-py312`) covering 3.12+, plus the existing free-threaded builds (3.13t, 3.14t).
- Remove the cp310 build leg and the "drop cp310" FIXME.
- Update `requires-python`, CI test interpreters (currently `python3.10` in `test_behavior_binding_python.yml` and `python3.11` in `ci_bindings_python.yml`), and any `Programming Language :: Python` metadata.

Benefits:

- Fewer wheels to build/test/publish per release; simpler matrix.
- Drops interpreters that are at or near EOL.
- Lets the binding use 3.12-era language/stdlib features without guards.

## Additional Context

This surfaced while investigating the Python binding's stub generation, but it is independent of that work and warrants its own change.

## Are you willing to contribute?

Yes, I can raise a PR for this.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.