Deprecations¶
Pending removal in Python 3.15¶
The import system:
Setting
__cached__
on a module whilefailing to set__spec__.cached
is deprecated. In Python 3.15,__cached__
will cease to be set ortake into consideration by the import system or standard library. (gh-97879)Setting
__package__
on a module whilefailing to set__spec__.parent
is deprecated. In Python 3.15,__package__
will cease to be set ortake into consideration by the import system or standard library. (gh-97879)
The undocumented
ctypes.SetPointerType()
functionhas been deprecated since Python 3.13.
The obsolete and rarely used
CGIHTTPRequestHandler
has been deprecated since Python 3.13.No direct replacement exists.Anything is better than CGI to interfacea web server with a request handler.The
--cgi
flag to thepython -m http.servercommand-line interface has been deprecated since Python 3.13.
load_module()
method: useexec_module()
instead.
The
getdefaultlocale()
functionhas been deprecated since Python 3.11.Its removal was originally planned for Python 3.13 (gh-90817),but has been postponed to Python 3.15.Usegetlocale()
,setlocale()
,andgetencoding()
instead.(Contributed by Hugo van Kemenade ingh-111187.)
PurePath.is_reserved()
has been deprecated since Python 3.13.Useos.path.isreserved()
to detect reserved paths on Windows.
platform.java_ver()
has been deprecated since Python 3.13.This function is only useful for Jython support, has a confusing API,and is largely untested.
Thecheck_home argument of
sysconfig.is_python_build()
has beendeprecated since Python 3.12.
RLock()
will take no arguments in Python 3.15.Passing any arguments has been deprecated since Python 3.14,as the Python version does not permit any arguments,but the C version allows any number of positional or keyword arguments,ignoring every argument.
types.CodeType
: Accessingco_lnotab
wasdeprecated inPEP 626since 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 ingh-101866.)
The undocumented keyword argument syntax for creating
NamedTuple
classes(for example,Point=NamedTuple("Point",x=int,y=int)
)has been deprecated since Python 3.13.Use the class-based syntax or the functional syntax instead.When using the functional syntax of
TypedDict
s, failingto pass a value to thefields parameter (TD=TypedDict("TD")
) orpassingNone
(TD=TypedDict("TD",None)
) has been deprecatedsince Python 3.13.UseclassTD(TypedDict):pass
orTD=TypedDict("TD",{})
to create a TypedDict with zero field.The
typing.no_type_check_decorator()
decorator functionhas been deprecated since Python 3.13.After eight years in thetyping
module,it has yet to be supported by any major type checker.
sre_compile
,sre_constants
andsre_parse
modules.wave
:The
getmark()
,setmark()
andgetmarkers()
methods oftheWave_read
andWave_write
classeshave been deprecated since Python 3.13.
load_module()
has been deprecated sincePython 3.10. Useexec_module()
instead.(Contributed by Jiahao Li ingh-125746.)
Pending removal in Python 3.16¶
The import system:
Setting
__loader__
on a module whilefailing to set__spec__.loader
is deprecated. In Python 3.16,__loader__
will cease to be set ortaken into consideration by the import system or the standard library.
The
'u'
format code (wchar_t
)has been deprecated in documentation since Python 3.3and at runtime since Python 3.13.Use the'w'
format code (Py_UCS4
)for Unicode characters instead.
asyncio.iscoroutinefunction()
is deprecatedand will be removed in Python 3.16;useinspect.iscoroutinefunction()
instead.(Contributed by Jiahao Li and Kumar Aditya ingh-122875.)asyncio
policy 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.Runner
withloop_factory to use the desired event loop implementation.For example, to use
asyncio.SelectorEventLoop
on Windows:importasyncioasyncdefmain():...asyncio.run(main(),loop_factory=asyncio.SelectorEventLoop)
(Contributed by Kumar Aditya ingh-127949.)
Bitwise inversion on boolean types,
~True
or~False
has been deprecated since Python 3.12,as it produces surprising and unintuitive results (-2
and-1
).Usenotx
instead for the logical negation of a Boolean.In the rare case that you need the bitwise inversion ofthe underlying integer, convert toint
explicitly (~int(x)
).
Calling the Python implementation of
functools.reduce()
withfunctionorsequence as keyword arguments has been deprecated since Python 3.14.
Support for custom logging handlers with thestrm argument is deprecatedand scheduled for removal in Python 3.16. Define handlers with thestreamargument instead. (Contributed by Mariusz Felisiak ingh-115032.)
Valid extensions start with a ‘.’ or are empty for
mimetypes.MimeTypes.add_type()
.Undotted extensions are deprecated and willraise aValueError
in Python 3.16.(Contributed by Hugo van Kemenade ingh-75223.)
The
ExecError
exceptionhas been deprecated since Python 3.14.It has not been used by any function inshutil
since Python 3.4,and is now an alias ofRuntimeError
.
The
Class.get_methods
methodhas been deprecated since Python 3.14.
sys
:The
_enablelegacywindowsfsencoding()
functionhas been deprecated since Python 3.13.Use thePYTHONLEGACYWINDOWSFSENCODING
environment variable instead.
The
sysconfig.expand_makefile_vars()
functionhas been deprecated since Python 3.14.Use thevars
argument ofsysconfig.get_paths()
instead.
The undocumented and unused
TarFile.tarfile
attributehas been deprecated since Python 3.13.
Pending removal in Python 3.17¶
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 Python3.17. Users should use documented introspection helpers liketyping.get_origin()
andtyping.get_args()
instead of relying on private implementation details.
Pending removal in Python 3.19¶
In hash function constructors such as
new()
or thedirect hash-named constructors such asmd5()
andsha256()
, their optional initial data parameter couldalso be passed a keyword argument nameddata=
orstring=
invarioushashlib
implementations.Support for the
string
keyword argument name is now deprecatedand slated for removal in Python 3.19.Before Python 3.13, the
string
keyword parameter was not correctlysupported depending on the backend implementation of hash functions.Prefer passing the initial data as a positional argument for maximumbackwards compatibility.
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 exclusivegroups are deprecated.
Passing the undocumented keyword argumentprefix_chars to
add_argument_group()
is nowdeprecated.The
argparse.FileType
type converter is 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
0inx
,1orx
,0if1else2
. It allows confusing andambiguous expressions like[0x1forxiny]
(which can be interpreted as[0x1forxiny]
or[0x1forxiny]
). A syntax warning is raisedif the numeric literal is immediately followed by one of keywordsand
,else
,for
,if
,in
,is
andor
. In a future release itwill 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 thereal orimag argument in the
complex()
constructor is now deprecated; it should only be passedas a single positional argument.(Contributed by Serhiy Storchaka ingh-109218.)
calendar
:calendar.January
andcalendar.February
constants aredeprecated and replaced bycalendar.JANUARY
andcalendar.FEBRUARY
.(Contributed by Prince Roshan ingh-103636.)codecs
: useopen()
instead ofcodecs.open()
. (gh-133038)codeobject.co_lnotab
: use thecodeobject.co_lines()
methodinstead.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 isdeprecated: use theoptimization parameter instead.
EntryPoints
tuple interface.Implicit
None
on return values.
logging
: thewarn()
method has been deprecatedsince Python 3.3, usewarning()
instead.mailbox
: Use of StringIO input and text mode is deprecated, useBytesIO and binary mode instead.os
: Callingos.register_at_fork()
in multi-threaded process.pydoc.ErrorDuringImport
: A tuple value forexc_info parameter isdeprecated, use an exception instance.re
: More strict rules are now applied for numerical group referencesand group names in regular expressions. Only sequence of ASCII digits is nowaccepted as a numerical reference. The group name in bytes patterns andreplacement strings can now only contain ASCII letters and digits andunderscore.(Contributed by Serhiy Storchaka ingh-91760.)shutil
:rmtree()
’sonerror parameter is deprecated inPython 3.12; use theonexc parameter instead.ssl
options and protocols:ssl.SSLContext
without protocol argument is deprecated.ssl.SSLContext
:set_npn_protocols()
andselected_npn_protocol()
are deprecated: use ALPNinstead.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
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()
.
The internal class
typing._UnionGenericAlias
is no longer used to implementtyping.Union
. To preserve compatibility with users using this privateclass, a compatibility shim will be provided until at least Python 3.17. (Contributed byJelle Zijlstra ingh-105499.)unittest.IsolatedAsyncioTestCase
: it is deprecated to return a valuethat is notNone
from a test case.urllib.parse
deprecated functions:urlparse()
insteadsplitattr()
splithost()
splitnport()
splitpasswd()
splitport()
splitquery()
splittag()
splittype()
splituser()
splitvalue()
to_bytes()
wsgiref
:SimpleHandler.stdout.write()
should not do partialwrites.xml.etree.ElementTree
: Testing the truth value of anElement
is deprecated. In a future release itwill always returnTrue
. Prefer explicitlen(elem)
orelemisnotNone
tests instead.sys._clear_type_cache()
is deprecated:usesys._clear_internal_caches()
instead.
C API deprecations¶
Pending removal in Python 3.15¶
The
PyImport_ImportModuleNoBlock()
:UsePyImport_ImportModule()
instead.PyWeakref_GetObject()
andPyWeakref_GET_OBJECT()
:UsePyWeakref_GetRef()
instead. Thepythoncapi-compat project can be used to getPyWeakref_GetRef()
on Python 3.12 and older.Py_UNICODE
type and thePy_UNICODE_WIDE
macro:Usewchar_t
instead.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
.Python initialization functions, deprecated in Python 3.13:
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
) ifvirtual environments need to be handled.Py_GetExecPrefix()
:UsePyConfig_Get("base_exec_prefix")
(sys.base_exec_prefix
) instead. UsePyConfig_Get("exec_prefix")
(sys.exec_prefix
) ifvirtual environments need tobe handled.Py_GetProgramFullPath()
:UsePyConfig_Get("executable")
(sys.executable
) instead.Py_GetProgramName()
:UsePyConfig_Get("executable")
(sys.executable
) instead.Py_GetPythonHome()
:UsePyConfig_Get("home")
or thePYTHONHOME
environment variable instead.
Thepythoncapi-compat project can be used to get
PyConfig_Get()
on Python 3.13 and older.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.PySys_ResetWarnOptions()
:Clearsys.warnoptions
andwarnings.filters
instead.
The
Py_InitializeFromConfig()
API should be used withPyConfig
instead.Global configuration variables:
Py_DebugFlag
:UsePyConfig.parser_debug
orPyConfig_Get("parser_debug")
instead.Py_VerboseFlag
:UsePyConfig.verbose
orPyConfig_Get("verbose")
instead.Py_QuietFlag
:UsePyConfig.quiet
orPyConfig_Get("quiet")
instead.Py_InteractiveFlag
:UsePyConfig.interactive
orPyConfig_Get("interactive")
instead.Py_InspectFlag
:UsePyConfig.inspect
orPyConfig_Get("inspect")
instead.Py_OptimizeFlag
:UsePyConfig.optimization_level
orPyConfig_Get("optimization_level")
instead.Py_NoSiteFlag
:UsePyConfig.site_import
orPyConfig_Get("site_import")
instead.Py_BytesWarningFlag
:UsePyConfig.bytes_warning
orPyConfig_Get("bytes_warning")
instead.Py_FrozenFlag
:UsePyConfig.pathconfig_warnings
orPyConfig_Get("pathconfig_warnings")
instead.Py_IgnoreEnvironmentFlag
:UsePyConfig.use_environment
orPyConfig_Get("use_environment")
instead.Py_DontWriteBytecodeFlag
:UsePyConfig.write_bytecode
orPyConfig_Get("write_bytecode")
instead.Py_NoUserSiteDirectory
:UsePyConfig.user_site_directory
orPyConfig_Get("user_site_directory")
instead.Py_UnbufferedStdioFlag
:UsePyConfig.buffered_stdio
orPyConfig_Get("buffered_stdio")
instead.Py_HashRandomizationFlag
:UsePyConfig.use_hash_seed
andPyConfig.hash_seed
orPyConfig_Get("hash_seed")
instead.Py_IsolatedFlag
:UsePyConfig.isolated
orPyConfig_Get("isolated")
instead.Py_LegacyWindowsFSEncodingFlag
:UsePyPreConfig.legacy_windows_fs_encoding
orPyConfig_Get("legacy_windows_fs_encoding")
instead.Py_LegacyWindowsStdioFlag
:UsePyConfig.legacy_windows_stdio
orPyConfig_Get("legacy_windows_stdio")
instead.Py_FileSystemDefaultEncoding
,Py_HasFileSystemDefaultEncoding
:UsePyConfig.filesystem_encoding
orPyConfig_Get("filesystem_encoding")
instead.Py_FileSystemDefaultEncodeErrors
:UsePyConfig.filesystem_errors
orPyConfig_Get("filesystem_errors")
instead.Py_UTF8Mode
:UsePyPreConfig.utf8_mode
orPyConfig_Get("utf8_mode")
instead.(seePy_PreInitialize()
)
The
Py_InitializeFromConfig()
API should be used withPyConfig
to set these options. OrPyConfig_Get()
can beused to get these options at runtime.
Pending removal in Python 3.18¶
Deprecated private functions (gh-128863):
_PyBytes_Join()
: usePyBytes_Join()
._PyDict_GetItemStringWithError()
: usePyDict_GetItemStringRef()
._PyDict_Pop()
:PyDict_Pop()
._PyLong_Sign()
: usePyLong_GetSign()
._PyLong_FromDigits()
and_PyLong_New()
:usePyLongWriter_Create()
._PyThreadState_UncheckedGet()
: usePyThreadState_GetUnchecked()
._PyUnicode_AsString()
: usePyUnicode_AsUTF8()
._PyUnicodeWriter_Init()
:replace_PyUnicodeWriter_Init(&writer)
withwriter=PyUnicodeWriter_Create(0)
._PyUnicodeWriter_Finish()
:replace_PyUnicodeWriter_Finish(&writer)
withPyUnicodeWriter_Finish(writer)
._PyUnicodeWriter_Dealloc()
:replace_PyUnicodeWriter_Dealloc(&writer)
withPyUnicodeWriter_Discard(writer)
._PyUnicodeWriter_WriteChar()
:replace_PyUnicodeWriter_WriteChar(&writer,ch)
withPyUnicodeWriter_WriteChar(writer,ch)
._PyUnicodeWriter_WriteStr()
:replace_PyUnicodeWriter_WriteStr(&writer,str)
withPyUnicodeWriter_WriteStr(writer,str)
._PyUnicodeWriter_WriteSubstring()
:replace_PyUnicodeWriter_WriteSubstring(&writer,str,start,end)
withPyUnicodeWriter_WriteSubstring(writer,str,start,end)
._PyUnicodeWriter_WriteASCIIString()
:replace_PyUnicodeWriter_WriteASCIIString(&writer,str)
withPyUnicodeWriter_WriteUTF8(writer,str)
._PyUnicodeWriter_WriteLatin1String()
:replace_PyUnicodeWriter_WriteLatin1String(&writer,str)
withPyUnicodeWriter_WriteUTF8(writer,str)
._PyUnicodeWriter_Prepare()
: (no replacement)._PyUnicodeWriter_PrepareKind()
: (no replacement)._Py_HashPointer()
: usePy_HashPointer()
._Py_fopen_obj()
: usePy_fopen()
.
Thepythoncapi-compat project can be used to get thesenew public functions on Python 3.13 and older.
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_READY()
:Unneeded since Python 3.12PyErr_Display()
:UsePyErr_DisplayException()
instead._PyErr_ChainExceptions()
:Use_PyErr_ChainExceptions1()
instead.PyBytesObject.ob_shash
member:callPyObject_Hash()
instead.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.