Deprecations¶
Pending Removal in Python 3.13¶
Modules (see PEP 594):
Other modules:
lib2to3
, and the 2to3 program (gh-84540)
APIs:
configparser.LegacyInterpolation
(gh-90765)locale.resetlocale()
(gh-90817)turtle.RawTurtle.settiltangle()
(gh-50096)unittest.findTestCases()
(gh-50096)unittest.getTestCaseNames()
(gh-50096)unittest.makeSuite()
(gh-50096)unittest.TestProgram.usageExit()
(gh-67048)webbrowser.MacOSX
(gh-86421)classmethod
descriptor chaining (gh-89519)importlib.resources
deprecated methods:contents()
is_resource()
open_binary()
open_text()
path()
read_binary()
read_text()
Use
importlib.resources.files()
instead. Refer to importlib-resources: Migrating from Legacy (gh-106531)
Pending Removal in Python 3.14¶
argparse
: The type, choices, and metavar parameters ofargparse.BooleanOptionalAction
are deprecated and will be removed in 3.14. (Contributed by Nikita Sobolev in gh-92248.)ast
: The following features have been deprecated in documentation since Python 3.8, now cause aDeprecationWarning
to be emitted at runtime when they are accessed or used, and will be removed in Python 3.14:ast.Num
ast.Str
ast.Bytes
ast.NameConstant
ast.Ellipsis
Use
ast.Constant
instead. (Contributed by Serhiy Storchaka in gh-90953.)-
The child watcher classes
MultiLoopChildWatcher
,FastChildWatcher
,AbstractChildWatcher
andSafeChildWatcher
are deprecated and will be removed in Python 3.14. (Contributed by Kumar Aditya in gh-94597.)asyncio.set_child_watcher()
,asyncio.get_child_watcher()
,asyncio.AbstractEventLoopPolicy.set_child_watcher()
andasyncio.AbstractEventLoopPolicy.get_child_watcher()
are deprecated and will be removed in Python 3.14. (Contributed by Kumar Aditya in gh-94597.)The
get_event_loop()
method of the default event loop policy now emits aDeprecationWarning
if there is no current event loop set and it decides to create one. (Contributed by Serhiy Storchaka and Guido van Rossum in gh-100160.)
collections.abc
: DeprecatedByteString
. PreferSequence
orBuffer
. For use in typing, prefer a union, likebytes | bytearray
, orcollections.abc.Buffer
. (Contributed by Shantanu Jain in gh-91896.)email
: Deprecated the isdst parameter inemail.utils.localtime()
. (Contributed by Alan Williams in gh-72346.)importlib
:__package__
and__cached__
will cease to be set or taken into consideration by the import system (gh-97879).importlib.abc
deprecated classes:importlib.abc.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
Use
importlib.resources.abc
classes instead:(Contributed by Jason R. Coombs and Hugo van Kemenade in gh-93963.)
itertools
had undocumented, inefficient, historically buggy, and inconsistent support for copy, deepcopy, and pickle operations. This will be removed in 3.14 for a significant reduction in code volume and maintenance burden. (Contributed by Raymond Hettinger in gh-101588.)multiprocessing
: The default start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where'fork'
is currently the default (gh-84559). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use theget_context()
orset_start_method()
APIs to explicitly specify when your code requires'fork'
. See Contexts and start methods.pathlib
:is_relative_to()
andrelative_to()
: passing additional arguments is deprecated.pkgutil
:find_loader()
andget_loader()
now raiseDeprecationWarning
; useimportlib.util.find_spec()
instead. (Contributed by Nikita Sobolev in gh-97850.)pty
:master_open()
: usepty.openpty()
.slave_open()
: usepty.openpty()
.
-
version
andversion_info
.execute()
andexecutemany()
if named placeholders are used and parameters is a sequence instead of adict
.
typing
:ByteString
, deprecated since Python 3.9, now causes aDeprecationWarning
to be emitted when it is used.urllib
:urllib.parse.Quoter
is deprecated: it was not intended to be a public API. (Contributed by Gregory P. Smith in gh-88168.)
Pending Removal in Python 3.15¶
http.server.CGIHTTPRequestHandler
will be removed along with its related--cgi
flag topython -m http.server
. It was obsolete and rarely used. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.locale
:locale.getdefaultlocale()
was deprecated in Python 3.11 and originally planned for removal in Python 3.13 (gh-90817), but removal has been postponed to Python 3.15. Uselocale.setlocale()
,locale.getencoding()
andlocale.getlocale()
instead. (Contributed by Hugo van Kemenade in gh-111187.)pathlib
:pathlib.PurePath.is_reserved()
is deprecated and scheduled for removal in Python 3.15. From Python 3.13 onwards, useos.path.isreserved
to detect reserved paths on Windows.platform
:java_ver()
is deprecated and will be removed in 3.15. It was largely untested, had a confusing API, and was only useful for Jython support. (Contributed by Nikita Sobolev in gh-116349.)threading
: Passing any arguments tothreading.RLock()
is now deprecated. C version allows any numbers of args and kwargs, but they are just ignored. Python version does not allow any arguments. All arguments will be removed fromthreading.RLock()
in Python 3.15. (Contributed by Nikita Sobolev in gh-102029.)-
The undocumented keyword argument syntax for creating
NamedTuple
classes (NT = NamedTuple("NT", x=int)
) is deprecated, and will be disallowed in 3.15. Use the class-based syntax or the functional syntax instead.
-
types.CodeType
: Accessingco_lnotab
was deprecated in PEP 626 since 3.10 and was planned to be removed in 3.12, but it only got a properDeprecationWarning
in 3.12. May be removed in 3.15. (Contributed by Nikita Sobolev in gh-101866.)
-
When using the functional syntax to create a
NamedTuple
class, failing to pass a value to the fields parameter (NT = NamedTuple("NT")
) is deprecated. PassingNone
to the fields parameter (NT = NamedTuple("NT", None)
) is also deprecated. Both will be disallowed in Python 3.15. To create aNamedTuple
class with 0 fields, useclass NT(NamedTuple): pass
orNT = NamedTuple("NT", [])
.
typing.TypedDict
: When using the functional syntax to create aTypedDict
class, failing to pass a value to the fields parameter (TD = TypedDict("TD")
) is deprecated. PassingNone
to the fields parameter (TD = TypedDict("TD", None)
) is also deprecated. Both will be disallowed in Python 3.15. To create aTypedDict
class with 0 fields, useclass TD(TypedDict): pass
orTD = TypedDict("TD", {})
.wave
: Deprecate thegetmark()
,setmark()
andgetmarkers()
methods of thewave.Wave_read
andwave.Wave_write
classes. They will be removed in Python 3.15. (Contributed by Victor Stinner in gh-105096.)
Pending Removal in Python 3.16¶
The import system:
Setting
__loader__
on a module while failing to set__spec__.loader
is deprecated. In Python 3.16,__loader__
will cease to be set or taken into consideration by the import system or the standard library.
array
:array.array
'u'
type (wchar_t
): use the'w'
type instead (Py_UCS4
).builtins
:~bool
, bitwise inversion on bool.symtable
: Deprecatesymtable.Class.get_methods()
due to the lack of interest. (Contributed by Bénédikt Tran in gh-119698.)
Pending Removal in Future Versions¶
The following APIs will be removed in the future, although there is currently no date scheduled for their removal.
argparse
: Nesting argument groups and nesting mutually exclusive groups are deprecated.-
bool(NotImplemented)
.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
,is
andor
. 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.January
andcalendar.February
constants are deprecated and replaced bycalendar.JANUARY
andcalendar.FEBRUARY
. (Contributed by Prince Roshan in gh-103636.)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.-
load_module()
method: useexec_module()
instead.cache_from_source()
debug_override parameter is deprecated: use the optimization parameter instead.
-
EntryPoints
tuple interface.Implicit
None
on return values.
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.)sre_compile
,sre_constants
andsre_parse
modules.shutil
:rmtree()
’s onerror parameter is deprecated in Python 3.12; use the onexc parameter instead.ssl
options and protocols:ssl.SSLContext
without 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_SSLv3
ssl.PROTOCOL_TLS
ssl.PROTOCOL_TLSv1
ssl.PROTOCOL_TLSv1_1
ssl.PROTOCOL_TLSv1_2
ssl.TLSVersion.SSLv3
ssl.TLSVersion.TLSv1
ssl.TLSVersion.TLSv1_1
sysconfig.is_python_build()
check_home parameter is deprecated and ignored.threading
methods:threading.Condition.notifyAll()
: usenotify_all()
.threading.Event.isSet()
: useis_set()
.threading.Thread.isDaemon()
,threading.Thread.setDaemon()
: usethreading.Thread.daemon
attribute.threading.Thread.getName()
,threading.Thread.setName()
: usethreading.Thread.name
attribute.threading.currentThread()
: usethreading.current_thread()
.threading.activeCount()
: usethreading.active_count()
.
unittest.IsolatedAsyncioTestCase
: it is deprecated to return a value that is notNone
from a test case.urllib.parse
deprecated functions:urlparse()
insteadsplitattr()
splithost()
splitnport()
splitpasswd()
splitport()
splitquery()
splittag()
splittype()
splituser()
splitvalue()
to_bytes()
urllib.request
:URLopener
andFancyURLopener
style of invoking requests is deprecated. Use newerurlopen()
functions and methods.wsgiref
:SimpleHandler.stdout.write()
should not do partial writes.xml.etree.ElementTree
: Testing the truth value of anElement
is deprecated. In a future release it will always returnTrue
. Prefer explicitlen(elem)
orelem is not None
tests instead.zipimport.zipimporter.load_module()
is deprecated: useexec_module()
instead.
C API Deprecations¶
Pending Removal in Python 3.14¶
The
ma_version_tag
field inPyDictObject
for extension modules (PEP 699; gh-101193).Creating
immutable types
with mutable bases (gh-95388).Functions to configure Python’s initialization, deprecated in Python 3.11:
PySys_SetArgvEx()
: SetPyConfig.argv
instead.PySys_SetArgv()
: SetPyConfig.argv
instead.Py_SetProgramName()
: SetPyConfig.program_name
instead.Py_SetPythonHome()
: SetPyConfig.home
instead.
The
Py_InitializeFromConfig()
API should be used withPyConfig
instead.Global configuration variables:
Py_DebugFlag
: UsePyConfig.parser_debug
instead.Py_VerboseFlag
: UsePyConfig.verbose
instead.Py_QuietFlag
: UsePyConfig.quiet
instead.Py_InteractiveFlag
: UsePyConfig.interactive
instead.Py_InspectFlag
: UsePyConfig.inspect
instead.Py_OptimizeFlag
: UsePyConfig.optimization_level
instead.Py_NoSiteFlag
: UsePyConfig.site_import
instead.Py_BytesWarningFlag
: UsePyConfig.bytes_warning
instead.Py_FrozenFlag
: UsePyConfig.pathconfig_warnings
instead.Py_IgnoreEnvironmentFlag
: UsePyConfig.use_environment
instead.Py_DontWriteBytecodeFlag
: UsePyConfig.write_bytecode
instead.Py_NoUserSiteDirectory
: UsePyConfig.user_site_directory
instead.Py_UnbufferedStdioFlag
: UsePyConfig.buffered_stdio
instead.Py_HashRandomizationFlag
: UsePyConfig.use_hash_seed
andPyConfig.hash_seed
instead.Py_IsolatedFlag
: UsePyConfig.isolated
instead.Py_LegacyWindowsFSEncodingFlag
: UsePyPreConfig.legacy_windows_fs_encoding
instead.Py_LegacyWindowsStdioFlag
: UsePyConfig.legacy_windows_stdio
instead.Py_FileSystemDefaultEncoding
: UsePyConfig.filesystem_encoding
instead.Py_HasFileSystemDefaultEncoding
: UsePyConfig.filesystem_encoding
instead.Py_FileSystemDefaultEncodeErrors
: UsePyConfig.filesystem_errors
instead.Py_UTF8Mode
: UsePyPreConfig.utf8_mode
instead. (seePy_PreInitialize()
)
The
Py_InitializeFromConfig()
API should be used withPyConfig
instead.
Pending Removal in Python 3.15¶
The bundled copy of
libmpdecimal
.The
PyImport_ImportModuleNoBlock()
: UsePyImport_ImportModule()
instead.PyWeakref_GetObject()
andPyWeakref_GET_OBJECT()
: UsePyWeakref_GetRef()
instead.Py_UNICODE
type and thePy_UNICODE_WIDE
macro: Usewchar_t
instead.Python initialization functions:
PySys_ResetWarnOptions()
: Clearsys.warnoptions
andwarnings.filters
instead.Py_GetExecPrefix()
: Getsys.exec_prefix
instead.Py_GetPath()
: Getsys.path
instead.Py_GetPrefix()
: Getsys.prefix
instead.Py_GetProgramFullPath()
: Getsys.executable
instead.Py_GetProgramName()
: Getsys.executable
instead.Py_GetPythonHome()
: GetPyConfig.home
or thePYTHONHOME
environment variable instead.
Pending Removal in Future Versions¶
The following APIs are deprecated and will be removed, although there is currently no date scheduled for their removal.
Py_TPFLAGS_HAVE_FINALIZE
: Unneeded since Python 3.8.PyErr_Fetch()
: UsePyErr_GetRaisedException()
instead.PyErr_NormalizeException()
: UsePyErr_GetRaisedException()
instead.PyErr_Restore()
: UsePyErr_SetRaisedException()
instead.PyModule_GetFilename()
: UsePyModule_GetFilenameObject()
instead.PyOS_AfterFork()
: UsePyOS_AfterFork_Child()
instead.PySlice_GetIndicesEx()
: UsePySlice_Unpack()
andPySlice_AdjustIndices()
instead.PyUnicode_AsDecodedObject()
: UsePyCodec_Decode()
instead.PyUnicode_AsDecodedUnicode()
: UsePyCodec_Decode()
instead.PyUnicode_AsEncodedObject()
: UsePyCodec_Encode()
instead.PyUnicode_AsEncodedUnicode()
: UsePyCodec_Encode()
instead.PyUnicode_READY()
: Unneeded since Python 3.12PyErr_Display()
: UsePyErr_DisplayException()
instead._PyErr_ChainExceptions()
: Use_PyErr_ChainExceptions1()
instead.PyBytesObject.ob_shash
member: callPyObject_Hash()
instead.PyDictObject.ma_version_tag
member.Thread Local Storage (TLS) API:
PyThread_create_key()
: UsePyThread_tss_alloc()
instead.PyThread_delete_key()
: UsePyThread_tss_free()
instead.PyThread_set_key_value()
: UsePyThread_tss_set()
instead.PyThread_get_key_value()
: UsePyThread_tss_get()
instead.PyThread_delete_key_value()
: UsePyThread_tss_delete()
instead.PyThread_ReInitTLS()
: Unneeded since Python 3.7.