What’s new in Python 3.15¶
- Editor:
- TBD 
This article explains the new features in Python 3.15, compared to 3.14.
For full details, see the 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.
Summary — release highlights¶
New features¶
Other language changes¶
- Several error messages incorrectly using the term “argument” have been corrected. (Contributed by Stan Ulbrych in gh-133382.) 
New modules¶
- None yet. 
Improved modules¶
ssl¶
- Indicate through - ssl.HAS_PSK_TLS13whether the- sslmodule supports “External PSKs” in TLSv1.3, as described in RFC 9258. (Contributed by Will Childs-Klein in gh-133624.)
Optimizations¶
module_name¶
- TODO 
Deprecated¶
- module_name: TODO 
Removed¶
http.server¶
- Removed the - CGIHTTPRequestHandlerclass and the- --cgiflag from the python -m http.server command-line interface. They were deprecated in Python 3.13. (Contributed by Bénédikt Tran in gh-133810.)
platform¶
- Removed the - platform.java_ver()function, which was deprecated since Python 3.13. (Contributed by Alexey Makridenko in gh-133604.)
sysconfig¶
- Removed the check_home parameter of - sysconfig.is_python_build(). (Contributed by Filipe Laíns in gh-92897.)
threading¶
typing¶
- The undocumented keyword argument syntax for creating - NamedTupleclasses (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")or- TD = TypedDict("TD", None)to construct a- TypedDicttype with zero field is no longer supported. Use- class TD(TypedDict): passor- TD = TypedDict("TD", {})instead. (Contributed by Bénédikt Tran in gh-133823.)
wave¶
- Removed the - getmark(),- setmark()and- getmarkers()methods of the- Wave_readand- Wave_writeclasses, which were deprecated since Python 3.13. (Contributed by Bénédikt Tran in gh-133873.)
Porting to Python 3.15¶
This section lists previously described changes and other bugfixes that may require changes to your code.
Build changes¶
C API changes¶
New features¶
- TODO 
Porting to Python 3.15¶
- sqlite3.ConnectionAPIs has been cleaned up.- All parameters of - sqlite3.connect()except database are now keyword-only.
- The first three parameters of methods - create_function()and- create_aggregate()are now positional-only.
- The first parameter of methods - set_authorizer(),- set_progress_handler()and- set_trace_callback()is now positional-only.
 - (Contributed by Serhiy Storchaka in gh-133595.) 
Deprecated C APIs¶
- TODO 
Removed C APIs¶
- Remove deprecated - PyUnicodefunctions:- PyUnicode_AsDecodedObject(): Use- PyCodec_Decode()instead.
- PyUnicode_AsDecodedUnicode(): Use- PyCodec_Decode()instead; Note that some codecs (for example, “base64”) may return a type other than- str, such as- bytes.
- PyUnicode_AsEncodedObject(): Use- PyCodec_Encode()instead.
- PyUnicode_AsEncodedUnicode(): Use- PyCodec_Encode()instead; Note that some codecs (for example, “base64”) may return a type other than- bytes, such as- str.
 - (Contributed by Stan Ulbrych in gh-133612) 
- PyImport_ImportModuleNoBlock(): deprecated alias of- PyImport_ImportModule(). (Contributed by Bénédikt Tran in gh-133644.)
The following functions are removed in favor of PyConfig_Get().
The pythoncapi-compat project can be used to get PyConfig_Get()
on Python 3.13 and older.
- Python initialization functions: - Py_GetExecPrefix(): use- PyConfig_Get("base_exec_prefix")(- sys.base_exec_prefix) instead. Use- PyConfig_Get("exec_prefix")(- sys.exec_prefix) if virtual environments need to be handled.
- Py_GetPath(): use- PyConfig_Get("module_search_paths")(- sys.path) instead.
- Py_GetPrefix(): use- PyConfig_Get("base_prefix")(- sys.base_prefix) instead. Use- PyConfig_Get("prefix")(- sys.prefix) if virtual environments need to be handled.
- Py_GetProgramFullPath(): use- PyConfig_Get("executable")(- sys.executable) instead.
- Py_GetProgramName(): use- PyConfig_Get("executable")(- sys.executable) instead.
- Py_GetPythonHome(): use- PyConfig_Get("home")or the- PYTHONHOMEenvironment variable instead.
 - (Contributed by Bénédikt Tran in gh-133644.)