| Editor: | TBD |
|---|
This article explains the new features in Python 3.15, compared to 3.14.
For full details, see the :ref:`changelog <changelog>`.
Note
Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.15 moves towards release, so it's worth checking back even after reading earlier versions.
- Several error messages incorrectly using the term "argument" have been corrected. (Contributed by Stan Ulbrych in :gh:`133382`.)
- None yet.
- Added new :meth:`!reorganize` methods to :mod:`dbm.dumb` and :mod:`dbm.sqlite3` which allow to recover unused free space previously occupied by deleted entries. (Contributed by Andrea Oliveri in :gh:`134004`.)
- Add the
'm'flag for :func:`dbm.gnu.open` which allows to disable the use of :manpage:`mmap(2)`. This may harm performance, but improve crash tolerance. (Contributed by Serhiy Storchaka in :gh:`66234`.)
- Improved the styling of HTML diff pages generated by the :class:`difflib.HtmlDiff` class, and migrated the output to the HTML5 standard. (Contributed by Jiahao Li in :gh:`134580`.)
- Add :func:`math.isnormal` and :func:`math.issubnormal` functions. (Contributed by Sergey B Kirpichev in :gh:`132908`.)
- The strict parameter to :func:`os.path.realpath` accepts a new value, :data:`os.path.ALLOW_MISSING`. If used, errors other than :exc:`FileNotFoundError` will be re-raised; the resulting path can be missing but it will be free of symlinks. (Contributed by Petr Viktorin for :cve:`2025-4517`.)
- Added new :meth:`!reorganize` method to :mod:`shelve` used to recover unused free space previously occupied by deleted entries. (Contributed by Andrea Oliveri in :gh:`134004`.)
- Support SQL keyword completion in the :mod:`sqlite3` command-line interface. (Contributed by Long Tan in :gh:`133393`.)
- Indicate through :data:`ssl.HAS_PSK_TLS13` whether the :mod:`ssl` module supports "External PSKs" in TLSv1.3, as described in RFC 9258. (Contributed by Will Childs-Klein in :gh:`133624`.)
- :func:`~tarfile.data_filter` now normalizes symbolic link targets in order to avoid path traversal attacks. (Contributed by Petr Viktorin in :gh:`127987` and :cve:`2025-4138`.)
- :func:`~tarfile.TarFile.extractall` now skips fixing up directory attributes when a directory was removed or replaced by another kind of file. (Contributed by Petr Viktorin in :gh:`127987` and :cve:`2024-12718`.)
- :func:`~tarfile.TarFile.extract` and :func:`~tarfile.TarFile.extractall` now (re-)apply the extraction filter when substituting a link (hard or symbolic) with a copy of another archive member, and when fixing up directory attributes. The former raises a new exception, :exc:`~tarfile.LinkFallbackError`. (Contributed by Petr Viktorin for :cve:`2025-4330` and :cve:`2024-12718`.)
- :func:`~tarfile.TarFile.extract` and :func:`~tarfile.TarFile.extractall` no longer extract rejected members when :func:`~tarfile.TarFile.errorlevel` is zero. (Contributed by Matt Prodani and Petr Viktorin in :gh:`112887` and :cve:`2025-4435`.)
Add new
show_linesandrecent_firstkeyword only arguments to the :mod:`traceback` functions.The
show_linesargument controls whether source code lines are displayed. It is default toTrue.The
recent_firstargument controls whether the most recent frames are displayed first or last in the traceback. It affects wheher the exception is displayed at the top or bottom of the traceback. It is default toFalse. (Contributed by Inada Naoki in :gh:`135751`)
- Allow combining two Adler-32 checksums via :func:`~zlib.adler32_combine`. (Contributed by Callum Attryde and Bénédikt Tran in :gh:`134635`.)
- Allow combining two CRC-32 checksums via :func:`~zlib.crc32_combine`. (Contributed by Bénédikt Tran in :gh:`134635`.)
- TODO
In hash function constructors such as :func:`~hashlib.new` or the direct hash-named constructors such as :func:`~hashlib.md5` and :func:`~hashlib.sha256`, their optional initial data parameter could also be passed a keyword argument named
data=orstring=in various :mod:`hashlib` implementations.Support for the
stringkeyword argument name is now deprecated and is slated for removal in Python 3.19. Prefer passing the initial data as a positional argument for maximum backwards compatibility.(Contributed by Bénédikt Tran in :gh:`134978`.)
- Removed the undocumented function :func:`!ctypes.SetPointerType`, which has been deprecated since Python 3.13. (Contributed by Bénédikt Tran in :gh:`133866`.)
- Removed the :class:`!CGIHTTPRequestHandler` class
and the
--cgiflag from the :program:`python -m http.server` command-line interface. They were deprecated in Python 3.13. (Contributed by Bénédikt Tran in :gh:`133810`.)
- Removed the :func:`!platform.java_ver` function, which was deprecated since Python 3.13. (Contributed by Alexey Makridenko in :gh:`133604`.)
- Removed the check_home parameter of :func:`sysconfig.is_python_build`. (Contributed by Filipe Laíns in :gh:`92897`.)
- Remove support for arbitrary positional or keyword arguments in the C implementation of :class:`~threading.RLock` objects. This was deprecated in Python 3.14. (Contributed by Bénédikt Tran in :gh:`134087`.)
- The undocumented keyword argument syntax for creating
:class:`~typing.NamedTuple` classes (for example,
Point = NamedTuple("Point", x=int, y=int)) is no longer supported. Use the class-based syntax or the functional syntax instead. (Contributed by Bénédikt Tran in :gh:`133817`.) - Using
TD = TypedDict("TD")orTD = TypedDict("TD", None)to construct a :class:`~typing.TypedDict` type with zero field is no longer supported. Useclass TD(TypedDict): passorTD = TypedDict("TD", {})instead. (Contributed by Bénédikt Tran in :gh:`133823`.)
- Removed the
getmark(),setmark()andgetmarkers()methods of the :class:`~wave.Wave_read` and :class:`~wave.Wave_write` classes, which were deprecated since Python 3.13. (Contributed by Bénédikt Tran in :gh:`133873`.)
This section lists previously described changes and other bugfixes that may require changes to your code.
- Add :c:func:`PySys_GetAttr`, :c:func:`PySys_GetAttrString`, :c:func:`PySys_GetOptionalAttr`, and :c:func:`PySys_GetOptionalAttrString` functions as replacements for :c:func:`PySys_GetObject`. (Contributed by Serhiy Storchaka in :gh:`108512`.)
- Add :c:type:`PyUnstable_Unicode_GET_CACHED_HASH` to get the cached hash of a string. See the documentation for caveats. (Contributed by Petr Viktorin in :gh:`131510`)
:class:`sqlite3.Connection` APIs has been cleaned up.
- All parameters of :func:`sqlite3.connect` except database are now keyword-only.
- The first three parameters of methods :meth:`~sqlite3.Connection.create_function` and :meth:`~sqlite3.Connection.create_aggregate` are now positional-only.
- The first parameter of methods :meth:`~sqlite3.Connection.set_authorizer`, :meth:`~sqlite3.Connection.set_progress_handler` and :meth:`~sqlite3.Connection.set_trace_callback` is now positional-only.
(Contributed by Serhiy Storchaka in :gh:`133595`.)
- TODO
Remove deprecated
PyUnicodefunctions:- :c:func:`!PyUnicode_AsDecodedObject`: Use :c:func:`PyCodec_Decode` instead.
- :c:func:`!PyUnicode_AsDecodedUnicode`: Use :c:func:`PyCodec_Decode` instead; Note that some codecs (for example, "base64") may return a type other than :class:`str`, such as :class:`bytes`.
- :c:func:`!PyUnicode_AsEncodedObject`: Use :c:func:`PyCodec_Encode` instead.
- :c:func:`!PyUnicode_AsEncodedUnicode`: Use :c:func:`PyCodec_Encode` instead; Note that some codecs (for example, "base64") may return a type other than :class:`bytes`, such as :class:`str`.
(Contributed by Stan Ulbrych in :gh:`133612`)
:c:func:`!PyImport_ImportModuleNoBlock`: deprecated alias of :c:func:`PyImport_ImportModule`. (Contributed by Bénédikt Tran in :gh:`133644`.)
The following functions are removed in favor of :c:func:`PyConfig_Get`. The pythoncapi-compat project can be used to get :c:func:`!PyConfig_Get` on Python 3.13 and older.
Python initialization functions:
- :c:func:`!Py_GetExecPrefix`: use :c:func:`PyConfig_Get("base_exec_prefix") <PyConfig_Get>` (:data:`sys.base_exec_prefix`) instead. Use :c:func:`PyConfig_Get("exec_prefix") <PyConfig_Get>` (:data:`sys.exec_prefix`) if :ref:`virtual environments <venv-def>` need to be handled.
- :c:func:`!Py_GetPath`: use :c:func:`PyConfig_Get("module_search_paths") <PyConfig_Get>` (:data:`sys.path`) instead.
- :c:func:`!Py_GetPrefix`: use :c:func:`PyConfig_Get("base_prefix") <PyConfig_Get>` (:data:`sys.base_prefix`) instead. Use :c:func:`PyConfig_Get("prefix") <PyConfig_Get>` (:data:`sys.prefix`) if :ref:`virtual environments <venv-def>` need to be handled.
- :c:func:`!Py_GetProgramFullPath`: use :c:func:`PyConfig_Get("executable") <PyConfig_Get>` (:data:`sys.executable`) instead.
- :c:func:`!Py_GetProgramName`: use :c:func:`PyConfig_Get("executable") <PyConfig_Get>` (:data:`sys.executable`) instead.
- :c:func:`!Py_GetPythonHome`: use :c:func:`PyConfig_Get("home") <PyConfig_Get>` or the :envvar:`PYTHONHOME` environment variable instead.
(Contributed by Bénédikt Tran in :gh:`133644`.)