new feature: bump minimum Python version for the Python binding to 3.12
- 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
Assessment
This issue has not been assessed yet.