Python 3.9 reached its end-of-life phase on 2025-10-31 ([PEP 596](https://peps.python.org/pep-0596/#lifespan)). ## How to remove support ### February 2026 * [x] Update the version in `README.md`. * [x] Update various fields in `pyproject.toml`. (#15402) * [x] Remove 3.9 from CI and test scripts. * [x] Update stubtest allow lists. Also check whether items can be moved to the common allow lists. (#15403) * [x] Remove `requires_python >= 3.10` and `python_version >= 3.10` from `METADATA.toml` ### May 2026 * [ ] Remove 3.9 exclusive branches from stubs. * [ ] Re-enable ruff codes `UP035`, `UP036` in `pyproject.toml`. * [ ] Remove `RUF100` code from `# noqa` directives. * [ ] Revisit #15399. * [ ] Remove obsolete stdlib modules (see `VERSIONS`). * `_bootlocale` * `distutils.command.bdist_wininst` * `formatter` * `parser` * `symbol` * [ ] Replace `typing_extensions` imports. * `ParamSpec` * `TypeAlias` * `TypeGuard` * [ ] Remove `builtins.ellipsis` after type checkers have switched to `types.EllipsisType`. (See #7580) * [ ] Remove `_reader`/`_writer` workarounds in `stdlib/_csv.pyi`. (Please amend as necessary.)
Python 3.9 reached its end-of-life phase on 2025-10-31 (PEP 596).
How to remove support
February 2026
README.md.pyproject.toml. (Update project.requires-python to >=3.10 #15402)requires_python >= 3.10andpython_version >= 3.10fromMETADATA.tomlMay 2026
UP035,UP036inpyproject.toml.RUF100code from# noqadirectives.VERSIONS)._bootlocaledistutils.command.bdist_wininstformatterparsersymboltyping_extensionsimports.ParamSpecTypeAliasTypeGuardbuiltins.ellipsisafter type checkers have switched totypes.EllipsisType. (See Remove type checker-specific symbols from builtins.pyi and typing.pyi #7580)_reader/_writerworkarounds instdlib/_csv.pyi.(Please amend as necessary.)