What’s new in Python 3.15¶
- Editor:
Hugo van Kemenade
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¶
PEP 799: High frequency statistical sampling profiler¶
A new statistical sampling profiler has been added to the new profiling module as
profiling.sampling. This profiler enables low-overhead performance analysis of
running Python processes without requiring code modification or process restart.
Unlike deterministic profilers (cProfile and profile) that instrument
every function call, the sampling profiler periodically captures stack traces from
running processes. This approach provides virtually zero overhead while achieving
sampling rates of up to 1,000,000 Hz, making it the fastest sampling profiler
available for Python (at the time of its contribution) and ideal for debugging
performance issues in production environments.
Key features include:
Zero-overhead profiling: Attach to any running Python process without affecting its performance
No code modification required: Profile existing applications without restart
Real-time statistics: Monitor sampling quality during data collection
Multiple output formats: Generate both detailed statistics and flamegraph data
Thread-aware profiling: Option to profile all threads or just the main thread
Profile process 1234 for 10 seconds with default settings:
python -m profiling.sampling 1234
Profile with custom interval and duration, save to file:
python -m profiling.sampling -i 50 -d 30 -o profile.stats 1234
Generate collapsed stacks for flamegraph:
python -m profiling.sampling --collapsed 1234
Profile all threads and sort by total time:
python -m profiling.sampling -a --sort-tottime 1234
The profiler generates statistical estimates of where time is spent:
Real-time sampling stats: Mean: 100261.5Hz (9.97µs) Min: 86333.4Hz (11.58µs) Max: 118807.2Hz (8.42µs) Samples: 400001
Captured 498841 samples in 5.00 seconds
Sample rate: 99768.04 samples/sec
Error rate: 0.72%
Profile Stats:
nsamples sample% tottime (s) cumul% cumtime (s) filename:lineno(function)
43/418858 0.0 0.000 87.9 4.189 case.py:667(TestCase.run)
3293/418812 0.7 0.033 87.9 4.188 case.py:613(TestCase._callTestMethod)
158562/158562 33.3 1.586 33.3 1.586 test_compile.py:725(TestSpecifics.test_compiler_recursion_limit.<locals>.check_limit)
129553/129553 27.2 1.296 27.2 1.296 ast.py:46(parse)
0/128129 0.0 0.000 26.9 1.281 test_ast.py:884(AST_Tests.test_ast_recursion_limit.<locals>.check_limit)
7/67446 0.0 0.000 14.2 0.674 test_compile.py:729(TestSpecifics.test_compiler_recursion_limit)
6/60380 0.0 0.000 12.7 0.604 test_ast.py:888(AST_Tests.test_ast_recursion_limit)
3/50020 0.0 0.000 10.5 0.500 test_compile.py:727(TestSpecifics.test_compiler_recursion_limit)
1/38011 0.0 0.000 8.0 0.380 test_ast.py:886(AST_Tests.test_ast_recursion_limit)
1/25076 0.0 0.000 5.3 0.251 test_compile.py:728(TestSpecifics.test_compiler_recursion_limit)
22361/22362 4.7 0.224 4.7 0.224 test_compile.py:1368(TestSpecifics.test_big_dict_literal)
4/18008 0.0 0.000 3.8 0.180 test_ast.py:889(AST_Tests.test_ast_recursion_limit)
11/17696 0.0 0.000 3.7 0.177 subprocess.py:1038(Popen.__init__)
16968/16968 3.6 0.170 3.6 0.170 subprocess.py:1900(Popen._execute_child)
2/16941 0.0 0.000 3.6 0.169 test_compile.py:730(TestSpecifics.test_compiler_recursion_limit)
Legend:
nsamples: Direct/Cumulative samples (direct executing / on call stack)
sample%: Percentage of total samples this function was directly executing
tottime: Estimated total time spent directly in this function
cumul%: Percentage of total samples when this function was on the call stack
cumtime: Estimated cumulative time (including time in called functions)
filename:lineno(function): Function location and name
Summary of Interesting Functions:
Functions with Highest Direct/Cumulative Ratio (Hot Spots):
1.000 direct/cumulative ratio, 33.3% direct samples: test_compile.py:(TestSpecifics.test_compiler_recursion_limit.<locals>.check_limit)
1.000 direct/cumulative ratio, 27.2% direct samples: ast.py:(parse)
1.000 direct/cumulative ratio, 3.6% direct samples: subprocess.py:(Popen._execute_child)
Functions with Highest Call Frequency (Indirect Calls):
418815 indirect calls, 87.9% total stack presence: case.py:(TestCase.run)
415519 indirect calls, 87.9% total stack presence: case.py:(TestCase._callTestMethod)
159470 indirect calls, 33.5% total stack presence: test_compile.py:(TestSpecifics.test_compiler_recursion_limit)
Functions with Highest Call Magnification (Cumulative/Direct):
12267.9x call magnification, 159470 indirect calls from 13 direct: test_compile.py:(TestSpecifics.test_compiler_recursion_limit)
10581.7x call magnification, 116388 indirect calls from 11 direct: test_ast.py:(AST_Tests.test_ast_recursion_limit)
9740.9x call magnification, 418815 indirect calls from 43 direct: case.py:(TestCase.run)
The profiler automatically identifies performance bottlenecks through statistical analysis, highlighting functions with high CPU usage and call frequency patterns.
This capability is particularly valuable for debugging performance issues in production systems where traditional profiling approaches would be too intrusive.
See also
PEP 799 for further details.
(Contributed by Pablo Galindo and László Kiss Kollár in gh-135953.)
Improved error messages¶
The interpreter now provides more helpful suggestions in
AttributeErrorexceptions when accessing an attribute on an object that does not exist, but a similar attribute is available through one of its members.For example, if the object has an attribute that itself exposes the requested name, the error message will suggest accessing it via that inner attribute:
@dataclass class Circle: radius: float @property def area(self) -> float: return pi * self.radius**2 class Container: def __init__(self, inner: Circle) -> None: self.inner = inner circle = Circle(radius=4.0) container = Container(circle) print(container.area)
Running this code now produces a clearer suggestion:
Traceback (most recent call last): File "/home/pablogsal/github/python/main/lel.py", line 42, in <module> print(container.area) ^^^^^^^^^^^^^^ AttributeError: 'Container' object has no attribute 'area'. Did you mean: 'inner.area'?
Other language changes¶
Python now uses UTF-8 as the default encoding, independent of the system’s environment. This means that I/O operations without an explicit encoding, for example,
open('flying-circus.txt'), will use UTF-8. UTF-8 is a widely-supported Unicode character encoding that has become a de facto standard for representing text, including nearly every webpage on the internet, many common file formats, programming languages, and more.This only applies when no
encodingargument is given. For best compatibility between versions of Python, ensure that an explicitencodingargument is always provided. The opt-in encoding warning can be used to identify code that may be affected by this change. The specialencoding='locale'argument uses the current locale encoding, and has been supported since Python 3.10.To retain the previous behaviour, Python’s UTF-8 mode may be disabled with the
PYTHONUTF8=0environment variable or the-X utf8=0command-line option.See also
PEP 686 for further details.
(Contributed by Adam Turner in gh-133711; PEP 686 written by Inada Naoki.)
Several error messages incorrectly using the term “argument” have been corrected. (Contributed by Stan Ulbrych in gh-133382.)
The interpreter now tries to provide a suggestion when
delattr()fails due to a missing attribute. When an attribute name that closely resembles an existing attribute is used, the interpreter will suggest the correct attribute name in the error message. For example:>>> class A: ... pass >>> a = A() >>> a.abcde = 1 >>> del a.abcdf Traceback (most recent call last): ... AttributeError: 'A' object has no attribute 'abcdf'. Did you mean: 'abcde'?
(Contributed by Nikita Sobolev and Pranjal Prajapati in gh-136588.)
Unraisable exceptions are now highlighted with color by default. This can be controlled by environment variables. (Contributed by Peter Bierma in gh-134170.)
The
__repr__()ofImportErrorandModuleNotFoundErrornow shows “name” and “path” asname=<name>andpath=<path>if they were given as keyword arguments at construction time. (Contributed by Serhiy Storchaka, Oleg Iarygin, and Yoav Nir in gh-74185.)The
__dict__and__weakref__descriptors now use a single descriptor instance per interpreter, shared across all types that need them. This speeds up class creation, and helps avoid reference cycles. (Contributed by Petr Viktorin in gh-135228.)The
-Woption and thePYTHONWARNINGSenvironment variable can now specify regular expressions instead of literal strings to match the warning message and the module name, if the corresponding field starts and ends with a forward slash (/). (Contributed by Serhiy Storchaka in gh-134716.)Functions that take timestamp or timeout arguments now accept any real numbers (such as
DecimalandFraction), not only integers or floats, although this does not improve precision. (Contributed by Serhiy Storchaka in gh-67795.)
New modules¶
None yet.
Improved modules¶
calendar¶
Calendar pages generated by the
calendar.HTMLCalendarclass now support dark mode and have been migrated to the HTML5 standard for improved accessibility. (Contributed by Jiahao Li and Hugo van Kemenade in gh-137634.)
collections¶
collections.abc¶
collections.abc.ByteStringhas been removed fromcollections.abc.__all__.collections.abc.ByteStringhas been deprecated since Python 3.12, and is scheduled for removal in Python 3.17.The following statements now cause
DeprecationWarnings to be emitted at runtime:from collections.abc import ByteStringimport collections.abc; collections.abc.ByteString.
DeprecationWarnings were already emitted ifcollections.abc.ByteStringwas subclassed or used as the second argument toisinstance()orissubclass(), but warnings were not previously emitted if it was merely imported or accessed from thecollections.abcmodule.
dbm¶
Added new
reorganize()methods todbm.dumbanddbm.sqlite3which allow to recover unused free space previously occupied by deleted entries. (Contributed by Andrea Oliveri in gh-134004.)
difflib¶
Introduced the optional color parameter to
difflib.unified_diff(), enabling color output similar to git diff. This can be controlled by environment variables. (Contributed by Douglas Thor in gh-133725.)Improved the styling of HTML diff pages generated by the
difflib.HtmlDiffclass, and migrated the output to the HTML5 standard. (Contributed by Jiahao Li in gh-134580.)
hashlib¶
Ensure that hash functions guaranteed to be always available exist as attributes of
hashlibeven if they will not work at runtime due to missing backend implementations. For instance,hashlib.md5will no longer raiseAttributeErrorif OpenSSL is not available and Python has been built without MD5 support. (Contributed by Bénédikt Tran in gh-136929.)
http.client¶
A new max_response_headers keyword-only parameter has been added to
HTTPConnectionandHTTPSConnectionconstructors. This parameter overrides the default maximum number of allowed response headers. (Contributed by Alexander Enrique Urieles Nieto in gh-131724.)
locale¶
setlocale()now supports language codes with@-modifiers.@-modifiers are no longer silently removed ingetlocale(), but included in the language code. (Contributed by Serhiy Storchaka in gh-137729.)
math¶
Add
math.isnormal()andmath.issubnormal()functions. (Contributed by Sergey B Kirpichev in gh-132908.)Add
math.fmax(),math.fmin()andmath.signbit()functions. (Contributed by Bénédikt Tran in gh-135853.)
mmap¶
os¶
Add
os.statx()on Linux kernel versions 4.11 and later with glibc versions 2.28 and later. (Contributed by Jeffrey Bosboom in gh-83714.)
os.path¶
Add support of the all-but-last mode in
realpath(). (Contributed by Serhiy Storchaka in gh-71189.)The strict parameter to
os.path.realpath()accepts a new value,os.path.ALLOW_MISSING. If used, errors other thanFileNotFoundErrorwill be re-raised; the resulting path can be missing but it will be free of symlinks. (Contributed by Petr Viktorin for CVE 2025-4517.)
resource¶
Add new constants:
RLIMIT_NTHR,RLIMIT_UMTXP,RLIMIT_THREADS,RLIM_SAVED_CUR, andRLIM_SAVED_MAX. (Contributed by Serhiy Storchaka in gh-137512.)
shelve¶
socket¶
Add constants for the ISO-TP CAN protocol. (Contributed by Patrick Menschel and Stefan Tatschner in gh-86819.)
sqlite3¶
The command-line interface has several new features:
SQL keyword completion on <tab>. (Contributed by Long Tan in gh-133393.)
Prompts, error messages, and help text are now colored. This is enabled by default, see Controlling color for details. (Contributed by Stan Ulbrych and Łukasz Langa in gh-133461.)
ssl¶
Indicate through
ssl.HAS_PSK_TLS13whether thesslmodule supports “External PSKs” in TLSv1.3, as described in RFC 9258. (Contributed by Will Childs-Klein in gh-133624.)Added new methods for managing groups used for SSL key agreement
ssl.SSLContext.set_groups()sets the groups allowed for doing key agreement, extending the previousssl.SSLContext.set_ecdh_curve()method. This new API provides the ability to list multiple groups and supports fixed-field and post-quantum groups in addition to ECDH curves. This method can also be used to control what key shares are sent in the TLS handshake.ssl.SSLSocket.group()returns the group selected for doing key agreement on the current connection after the TLS handshake completes. This call requires OpenSSL 3.2 or later.ssl.SSLContext.get_groups()returns a list of all available key agreement groups compatible with the minimum and maximum TLS versions currently set in the context. This call requires OpenSSL 3.5 or later.
(Contributed by Ron Frederick in gh-136306.)
Added a new method
ssl.SSLContext.set_ciphersuites()for setting TLS 1.3 ciphers. For TLS 1.2 or earlier,ssl.SSLContext.set_ciphers()should continue to be used. Both calls can be made on the same context and the selected cipher suite will depend on the TLS version negotiated when a connection is made. (Contributed by Ron Frederick in gh-137197.)Added new methods for managing signature algorithms:
ssl.get_sigalgs()returns a list of all available TLS signature algorithms. This call requires OpenSSL 3.4 or later.ssl.SSLContext.set_client_sigalgs()sets the signature algorithms allowed for certificate-based client authentication.ssl.SSLContext.set_server_sigalgs()sets the signature algorithms allowed for the server to complete the TLS handshake.ssl.SSLSocket.client_sigalg()returns the signature algorithm selected for client authentication on the current connection. This call requires OpenSSL 3.5 or later.ssl.SSLSocket.server_sigalg()returns the signature algorithm selected for the server to complete the TLS handshake on the current connection. This call requires OpenSSL 3.5 or later.
(Contributed by Ron Frederick in gh-138252.)
sys¶
Add
sys.abi_infonamespace to improve access to ABI information. (Contributed by Klaus Zimmermann in gh-137476.)
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.)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.)extract()andextractall()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,LinkFallbackError. (Contributed by Petr Viktorin for CVE 2025-4330 and CVE 2024-12718.)extract()andextractall()no longer extract rejected members whenerrorlevel()is zero. (Contributed by Matt Prodani and Petr Viktorin in gh-112887 and CVE 2025-4435.)extract()andextractall()now replace slashes by backslashes in symlink targets on Windows to prevent creation of corrupted links. (Contributed by Christoph Walcher in gh-57911.)
timeit¶
The command-line interface now colorizes error tracebacks by default. This can be controlled with environment variables. (Contributed by Yi Hong in gh-139374.)
types¶
Expose the write-through
locals()proxy type astypes.FrameLocalsProxyType. This represents the type of theframe.f_localsattribute, as described in PEP 667.
unittest¶
unittest.TestCase.assertLogs()will now accept a formatter to control how messages are formatted. (Contributed by Garry Cairns in gh-134567.)
xml.parsers.expat¶
Add
SetAllocTrackerActivationThreshold()andSetAllocTrackerMaximumAmplification()to xmlparser objects to tune protections against disproportional amounts of dynamic memory usage from within an Expat parser. (Contributed by Bénédikt Tran in gh-90949.)Add
SetBillionLaughsAttackProtectionActivationThreshold()andSetBillionLaughsAttackProtectionMaximumAmplification()to xmlparser objects to tune protections against billion laughs attacks. (Contributed by Bénédikt Tran in gh-90949.)
zlib¶
Allow combining two Adler-32 checksums via
adler32_combine(). (Contributed by Callum Attryde and Bénédikt Tran in gh-134635.)Allow combining two CRC-32 checksums via
crc32_combine(). (Contributed by Bénédikt Tran in gh-134635.)
Optimizations¶
module_name¶
TODO
Removed¶
ctypes¶
Removed the undocumented function
ctypes.SetPointerType(), which has been deprecated since Python 3.13. (Contributed by Bénédikt Tran in gh-133866.)
glob¶
Removed the undocumented
glob.glob0()andglob.glob1()functions, which have been deprecated since Python 3.13. Useglob.glob()and pass a directory to its root_dir argument instead. (Contributed by Barney Gale in gh-137466.)
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.)
importlib.resources¶
Removed deprecated
packageparameter fromimportlib.resources.files()function. (Contributed by Semyon Moroz in gh-138044)
mimetypes¶
pathlib¶
Removed deprecated
pathlib.PurePath.is_reserved(). Useos.path.isreserved()to detect reserved paths on Windows. (Contributed by Nikita Sobolev in gh-133875.)
platform¶
Removed the
platform.java_ver()function, which was deprecated since Python 3.13. (Contributed by Alexey Makridenko in gh-133604.)
sre_*¶
Removed
sre_compile,sre_constantsandsre_parsemodules. (Contributed by Stan Ulbrych in gh-135994.)
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")orTD = TypedDict("TD", None)to construct aTypedDicttype with zero field is no longer supported. Useclass TD(TypedDict): passorTD = TypedDict("TD", {})instead. (Contributed by Bénédikt Tran in gh-133823.)Code like
class ExtraTypeVars(P1[S], Protocol[T, T2]): ...now raises aTypeError, becauseSis not listed inProtocolparameters. (Contributed by Nikita Sobolev in gh-137191.)Code like
class B2(A[T2], Protocol[T1, T2]): ...now correctly handles type parameters order: it is(T1, T2), not(T2, T1)as it was incorrectly inferred in runtime before. (Contributed by Nikita Sobolev in gh-137191.)typing.ByteStringhas been removed fromtyping.__all__.typing.ByteStringhas been deprecated since Python 3.9, and is scheduled for removal in Python 3.17.The following statements now cause
DeprecationWarnings to be emitted at runtime:from typing import ByteStringimport typing; typing.ByteString.
DeprecationWarnings were already emitted iftyping.ByteStringwas subclassed or used as the second argument toisinstance()orissubclass(), but warnings were not previously emitted if it was merely imported or accessed from thetypingmodule.Deprecated
typing.no_type_check_decorator()has been removed. (Contributed by Nikita Sobolev in gh-133601.)
unicodedata¶
The Unicode database has been updated to Unicode 17.0.0.
wave¶
Removed the
getmark(),setmark()andgetmarkers()methods of theWave_readandWave_writeclasses, which were deprecated since Python 3.13. (Contributed by Bénédikt Tran in gh-133873.)
zipimport¶
Remove deprecated
zipimport.zipimporter.load_module(). Usezipimport.zipimporter.exec_module()instead. (Contributed by Jiahao Li in gh-133656.)
Deprecated¶
New deprecations¶
CLI:
Deprecate
-band-bbcommand-line options and schedule them to become no-op in Python 3.17. These were primarily helpers for the Python 2 -> 3 transition. Starting with Python 3.17, noBytesWarningwill be raised for these cases; use a type checker instead.(Contributed by Nikita Sobolev in gh-136355.)
-
In hash function constructors such as
new()or the direct hash-named constructors such asmd5()andsha256(), their optional initial data parameter could also be passed a keyword argument nameddata=orstring=in varioushashlibimplementations.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.)
__version__The
__version__attribute has been deprecated in these standard library modules and will be removed in Python 3.20. Usesys.version_infoinstead.ctypes.macholiblogging(__date__also deprecated)
(Contributed by Hugo van Kemenade and Stan Ulbrych in gh-76007.)
Pending removal in Python 3.16¶
The import system:
Setting
__loader__on a module while failing to set__spec__.loaderis deprecated. In Python 3.16,__loader__will cease to be set or taken into consideration by the import system or the standard library.
-
The
'u'format code (wchar_t) has been deprecated in documentation since Python 3.3 and at runtime since Python 3.13. Use the'w'format code (Py_UCS4) for Unicode characters instead.
-
asyncio.iscoroutinefunction()is deprecated and will be removed in Python 3.16; useinspect.iscoroutinefunction()instead. (Contributed by Jiahao Li and Kumar Aditya in gh-122875.)asynciopolicy system is deprecated and will be removed in Python 3.16. In particular, the following classes and functions are deprecated:Users should use
asyncio.run()orasyncio.Runnerwith loop_factory to use the desired event loop implementation.For example, to use
asyncio.SelectorEventLoopon Windows:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Contributed by Kumar Aditya in gh-127949.)
-
Bitwise inversion on boolean types,
~Trueor~Falsehas been deprecated since Python 3.12, as it produces surprising and unintuitive results (-2and-1). Usenot xinstead for the logical negation of a Boolean. In the rare case that you need the bitwise inversion of the underlying integer, convert tointexplicitly (~int(x)).
-
Calling the Python implementation of
functools.reduce()with function or sequence as keyword arguments has been deprecated since Python 3.14.
-
Support for custom logging handlers with the strm argument is deprecated and scheduled for removal in Python 3.16. Define handlers with the stream argument instead. (Contributed by Mariusz Felisiak in gh-115032.)
-
Valid extensions start with a ‘.’ or are empty for
mimetypes.MimeTypes.add_type(). Undotted extensions are deprecated and will raise aValueErrorin Python 3.16. (Contributed by Hugo van Kemenade in gh-75223.)
-
The
ExecErrorexception has been deprecated since Python 3.14. It has not been used by any function inshutilsince Python 3.4, and is now an alias ofRuntimeError.
-
The
Class.get_methodsmethod has been deprecated since Python 3.14.
sys:The
_enablelegacywindowsfsencoding()function has been deprecated since Python 3.13. Use thePYTHONLEGACYWINDOWSFSENCODINGenvironment variable instead.
-
The
sysconfig.expand_makefile_vars()function has been deprecated since Python 3.14. Use thevarsargument ofsysconfig.get_paths()instead.
-
The undocumented and unused
TarFile.tarfileattribute has been deprecated since Python 3.13.
Pending removal in Python 3.17¶
-
collections.abc.ByteStringis scheduled for removal in Python 3.17.Use
isinstance(obj, collections.abc.Buffer)to test ifobjimplements the buffer protocol at runtime. For use in type annotations, either useBufferor a union that explicitly specifies the types your code supports (e.g.,bytes | bytearray | memoryview).ByteStringwas originally intended to be an abstract class that would serve as a supertype of bothbytesandbytearray. However, since the ABC never had any methods, knowing that an object was an instance ofByteStringnever actually told you anything useful about the object. Other common buffer types such asmemoryviewwere also never understood as subtypes ofByteString(either at runtime or by static type checkers).See PEP 688 for more details. (Contributed by Shantanu Jain in gh-91896.)
-
Before Python 3.14, old-style unions were implemented using the private class
typing._UnionGenericAlias. This class is no longer needed for the implementation, but it has been retained for backward compatibility, with removal scheduled for Python 3.17. Users should use documented introspection helpers liketyping.get_origin()andtyping.get_args()instead of relying on private implementation details.typing.ByteString, deprecated since Python 3.9, is scheduled for removal in Python 3.17.Use
isinstance(obj, collections.abc.Buffer)to test ifobjimplements the buffer protocol at runtime. For use in type annotations, either useBufferor a union that explicitly specifies the types your code supports (e.g.,bytes | bytearray | memoryview).ByteStringwas originally intended to be an abstract class that would serve as a supertype of bothbytesandbytearray. However, since the ABC never had any methods, knowing that an object was an instance ofByteStringnever actually told you anything useful about the object. Other common buffer types such asmemoryviewwere also never understood as subtypes ofByteString(either at runtime or by static type checkers).See PEP 688 for more details. (Contributed by Shantanu Jain in gh-91896.)
Pending removal in Python 3.19¶
-
In hash function constructors such as
new()or the direct hash-named constructors such asmd5()andsha256(), their optional initial data parameter could also be passed a keyword argument nameddata=orstring=in varioushashlibimplementations.Support for the
stringkeyword argument name is now deprecated and slated for removal in Python 3.19.Before Python 3.13, the
stringkeyword parameter was not correctly supported depending on the backend implementation of hash functions. Prefer passing the initial data as a positional argument for maximum backwards compatibility.
Pending removal in Python 3.20¶
The
__version__attribute has been deprecated in these standard library modules and will be removed in Python 3.20. Usesys.version_infoinstead.ctypes.macholiblogging(__date__also deprecated)
(Contributed by Hugo van Kemenade and Stan Ulbrych in gh-76007.)
Pending removal in future versions¶
The following APIs will be removed in the future, although there is currently no date scheduled for their removal.
-
Nesting argument groups and nesting mutually exclusive groups are deprecated.
Passing the undocumented keyword argument prefix_chars to
add_argument_group()is now deprecated.The
argparse.FileTypetype converter is deprecated.
-
Generators:
throw(type, exc, tb)andathrow(type, exc, tb)signature is deprecated: usethrow(exc)andathrow(exc)instead, the single argument signature.Currently Python accepts numeric literals immediately followed by keywords, for example
0in x,1or x,0if 1else 2. It allows confusing and ambiguous expressions like[0x1for x in y](which can be interpreted as[0x1 for x in y]or[0x1f or x in y]). A syntax warning is raised if the numeric literal is immediately followed by one of keywordsand,else,for,if,in,isandor. In a future release it will be changed to a syntax error. (gh-87999)Support for
__index__()and__int__()method returning non-int type: these methods will be required to return an instance of a strict subclass ofint.Support for
__float__()method returning a strict subclass offloat: these methods will be required to return an instance offloat.Support for
__complex__()method returning a strict subclass ofcomplex: these methods will be required to return an instance ofcomplex.Delegation of
int()to__trunc__()method.Passing a complex number as the real or imag argument in the
complex()constructor is now deprecated; it should only be passed as a single positional argument. (Contributed by Serhiy Storchaka in gh-109218.)
calendar:calendar.Januaryandcalendar.Februaryconstants are deprecated and replaced bycalendar.JANUARYandcalendar.FEBRUARY. (Contributed by Prince Roshan in gh-103636.)codecs: useopen()instead ofcodecs.open(). (gh-133038)codeobject.co_lnotab: use thecodeobject.co_lines()method instead.-
utcnow(): usedatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): usedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: Plural value must be an integer.-
cache_from_source()debug_override parameter is deprecated: use the optimization parameter instead.
-
EntryPointstuple interface.Implicit
Noneon return values.
logging: thewarn()method has been deprecated since Python 3.3, usewarning()instead.mailbox: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.os: Callingos.register_at_fork()in multi-threaded process.pydoc.ErrorDuringImport: A tuple value for exc_info parameter is deprecated, use an exception instance.re: More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in gh-91760.)shutil:rmtree()’s onerror parameter is deprecated in Python 3.12; use the onexc parameter instead.ssloptions and protocols:ssl.SSLContextwithout protocol argument is deprecated.ssl.SSLContext:set_npn_protocols()andselected_npn_protocol()are deprecated: use ALPN instead.ssl.OP_NO_SSL*optionsssl.OP_NO_TLS*optionsssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threadingmethods:threading.Condition.notifyAll(): usenotify_all().threading.Event.isSet(): useis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): usethreading.Thread.daemonattribute.threading.Thread.getName(),threading.Thread.setName(): usethreading.Thread.nameattribute.threading.currentThread(): usethreading.current_thread().threading.activeCount(): usethreading.active_count().
The internal class
typing._UnionGenericAliasis no longer used to implementtyping.Union. To preserve compatibility with users using this private class, a compatibility shim will be provided until at least Python 3.17. (Contributed by Jelle Zijlstra in gh-105499.)unittest.IsolatedAsyncioTestCase: it is deprecated to return a value that is notNonefrom a test case.urllib.parsedeprecated functions:urlparse()insteadsplitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()should not do partial writes.xml.etree.ElementTree: Testing the truth value of anElementis deprecated. In a future release it will always returnTrue. Prefer explicitlen(elem)orelem is not Nonetests instead.sys._clear_type_cache()is deprecated: usesys._clear_internal_caches()instead.
C API changes¶
New features¶
Add
PySys_GetAttr(),PySys_GetAttrString(),PySys_GetOptionalAttr(), andPySys_GetOptionalAttrString()functions as replacements forPySys_GetObject(). (Contributed by Serhiy Storchaka in gh-108512.)Add
PyUnstable_Unicode_GET_CACHED_HASHto get the cached hash of a string. See the documentation for caveats. (Contributed by Petr Viktorin in gh-131510.)Add API for checking an extension module’s ABI compatibility:
Py_mod_abi,PyABIInfo_Check(),PyABIInfo_VARandPy_mod_abi. (Contributed by Petr Viktorin in gh-137210.)
Implement PEP 782, the PyBytesWriter API. Add functions:
(Contributed by Victor Stinner in gh-129813.)
Add
PyTuple_FromArray()to create atuplefrom an array. (Contributed by Victor Stinner in gh-111489.)
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()andcreate_aggregate()are now positional-only.The first parameter of methods
set_authorizer(),set_progress_handler()andset_trace_callback()is now positional-only.
(Contributed by Serhiy Storchaka in gh-133595.)
Private functions promoted to public C APIs:
The pythoncapi-compat project can be used to get most of these new functions on Python 3.14 and older.
resource.RLIM_INFINITYis now always positive. Passing a negative integer value that corresponded to its old value (such as-1or-3, depending on platform) toresource.setrlimit()andresource.prlimit()is now deprecated. (Contributed by Serhiy Storchaka in gh-137044.)resize()has been removed on platforms that don’t support the underlying syscall, instead of raising aSystemError.
Removed C APIs¶
Remove deprecated
PyUnicodefunctions:PyUnicode_AsDecodedObject(): UsePyCodec_Decode()instead.PyUnicode_AsDecodedUnicode(): UsePyCodec_Decode()instead; Note that some codecs (for example, “base64”) may return a type other thanstr, such asbytes.PyUnicode_AsEncodedObject(): UsePyCodec_Encode()instead.PyUnicode_AsEncodedUnicode(): UsePyCodec_Encode()instead; Note that some codecs (for example, “base64”) may return a type other thanbytes, such asstr.
(Contributed by Stan Ulbrych in gh-133612.)
PyImport_ImportModuleNoBlock(): deprecated alias ofPyImport_ImportModule(). (Contributed by Bénédikt Tran in gh-133644.)PyWeakref_GetObject()andPyWeakref_GET_OBJECT: usePyWeakref_GetRef()instead. The pythoncapi-compat project can be used to getPyWeakref_GetRef()on Python 3.12 and older. (Contributed by Bénédikt Tran in gh-133644.)Remove deprecated
PySys_ResetWarnOptions(). Clearsys.warnoptionsandwarnings.filtersinstead.(Contributed by Nikita Sobolev in gh-138886.)
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(): usePyConfig_Get("base_exec_prefix")(sys.base_exec_prefix) instead. UsePyConfig_Get("exec_prefix")(sys.exec_prefix) if virtual environments need to be handled.Py_GetPath(): usePyConfig_Get("module_search_paths")(sys.path) instead.Py_GetPrefix(): usePyConfig_Get("base_prefix")(sys.base_prefix) instead. UsePyConfig_Get("prefix")(sys.prefix) if virtual environments need to be handled.Py_GetProgramFullPath(): usePyConfig_Get("executable")(sys.executable) instead.Py_GetProgramName(): usePyConfig_Get("executable")(sys.executable) instead.Py_GetPythonHome(): usePyConfig_Get("home")or thePYTHONHOMEenvironment variable instead.
(Contributed by Bénédikt Tran in gh-133644.)
Deprecated C APIs¶
For unsigned integer formats in
PyArg_ParseTuple(), accepting Python integers with value that is larger than the maximal value for the C type or less than the minimal value for the corresponding signed integer type of the same size is now deprecated. (Contributed by Serhiy Storchaka in gh-132629.)PyBytes_FromStringAndSize(NULL, len)and_PyBytes_Resize()are soft deprecated, use thePyBytesWriterAPI instead. (Contributed by Victor Stinner in gh-129813.)Deprecate
cvalfield of thePyComplexObjecttype. UsePyComplex_AsCComplex()andPyComplex_FromCComplex()to convert a Python complex number to/from the CPy_complexrepresentation. (Contributed by Sergey B Kirpichev in gh-128813.)Functions
_Py_c_sum(),_Py_c_diff(),_Py_c_neg(),_Py_c_prod(),_Py_c_quot(),_Py_c_pow()and_Py_c_abs()are soft deprecated. (Contributed by Sergey B Kirpichev in gh-128813.)bytes_warningis deprecated since 3.15 and will be removed in 3.17. (Contributed by Nikita Sobolev in gh-136355.)
Build changes¶
Removed implicit fallback to the bundled copy of the
libmpdeclibrary. Now this should be explicitly enabled with--with-system-libmpdecset tonoor with--without-system-libmpdec. (Contributed by Sergey B Kirpichev in gh-115119.)
Porting to Python 3.15¶
This section lists previously described changes and other bugfixes that may require changes to your code.