Deprecations¶
Pending Removal in Python 3.13¶
Modules (seePEP 594):
Other modules:
lib2to3, and the2to3 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)classmethoddescriptor chaining (gh-89519)importlib.resourcesdeprecated methods:contents()is_resource()open_binary()open_text()path()read_binary()read_text()
Use
importlib.resources.files()instead. Refer toimportlib-resources: Migrating from Legacy (gh-106531)
Pending Removal in Python 3.14¶
argparse: Thetype,choices, andmetavar parametersofargparse.BooleanOptionalActionare deprecatedand will be removed in 3.14.(Contributed by Nikita Sobolev ingh-92248.)ast: The following features have been deprecated in documentationsince Python 3.8, now cause aDeprecationWarningto be emitted atruntime when they are accessed or used, and will be removed in Python 3.14:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Use
ast.Constantinstead.(Contributed by Serhiy Storchaka ingh-90953.)The child watcher classes
MultiLoopChildWatcher,FastChildWatcher,AbstractChildWatcherandSafeChildWatcherare deprecated andwill be removed in Python 3.14.(Contributed by Kumar Aditya ingh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()andasyncio.AbstractEventLoopPolicy.get_child_watcher()are deprecatedand will be removed in Python 3.14.(Contributed by Kumar Aditya ingh-94597.)The
get_event_loop()method of thedefault event loop policy now emits aDeprecationWarningif thereis no current event loop set and it decides to create one.(Contributed by Serhiy Storchaka and Guido van Rossum ingh-100160.)
collections.abc: DeprecatedByteString.PreferSequenceorBuffer.For use in typing, prefer a union, likebytes|bytearray,orcollections.abc.Buffer.(Contributed by Shantanu Jain ingh-91896.)email: Deprecated theisdst parameter inemail.utils.localtime().(Contributed by Alan Williams ingh-72346.)importlib:__package__and__cached__will cease to be set ortaken into consideration by the import system (gh-97879).importlib.abcdeprecated classes:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Use
importlib.resources.abcclasses instead:(Contributed by Jason R. Coombs and Hugo van Kemenade ingh-93963.)
itertoolshad 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 codevolume and maintenance burden.(Contributed by Raymond Hettinger ingh-101588.)multiprocessing: The default start method will change to a safer one onLinux, BSDs, and other non-macOS POSIX platforms where'fork'is currentlythe default (gh-84559). Adding a runtime warning about this was deemed toodisruptive as the majority of code is not expected to care. Use theget_context()orset_start_method()APIs to explicitly specify whenyour coderequires'fork'. SeeContexts and start methods.pathlib:is_relative_to()andrelative_to(): passing additional arguments isdeprecated.pkgutil:find_loader()andget_loader()now raiseDeprecationWarning;useimportlib.util.find_spec()instead.(Contributed by Nikita Sobolev ingh-97850.)pty:master_open(): usepty.openpty().slave_open(): usepty.openpty().
versionandversion_info.execute()andexecutemany()ifnamed placeholders are used andparameters is a sequence instead of adict.
typing:ByteString, deprecated since Python 3.9,now causes aDeprecationWarningto be emitted when it is used.urllib:urllib.parse.Quoteris deprecated: it was not intended to be apublic API.(Contributed by Gregory P. Smith ingh-88168.)
Pending Removal in Python 3.15¶
http.server.CGIHTTPRequestHandlerwill be removed along with itsrelated--cgiflag topython-mhttp.server. It was obsolete andrarely used. No direct replacement exists.Anything is better than CGIto interface a web server with a request handler.load_module()method: useexec_module()instead.
locale:locale.getdefaultlocale()was deprecated in Python 3.11and 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 ingh-111187.)pathlib:pathlib.PurePath.is_reserved()is deprecated and scheduled forremoval in Python 3.15. From Python 3.13 onwards, useos.path.isreservedto 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 ingh-116349.)Thecheck_home argument of
sysconfig.is_python_build()has beendeprecated since Python 3.12.
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 ingh-102029.)The undocumented keyword argument syntax for creating
NamedTupleclasses(NT=NamedTuple("NT",x=int)) is deprecated, and will be disallowed in3.15. Use the class-based syntax or the functional syntax instead.
types.CodeType: Accessingco_lnotabwasdeprecated inPEP 626since 3.10 and was planned to be removed in 3.12,but it only got a properDeprecationWarningin 3.12.May be removed in 3.15.(Contributed by Nikita Sobolev ingh-101866.)
When using the functional syntax to create a
NamedTupleclass, failing topass a value to thefields parameter (NT=NamedTuple("NT")) isdeprecated. PassingNoneto thefields parameter(NT=NamedTuple("NT",None)) is also deprecated. Both will bedisallowed in Python 3.15. To create aNamedTupleclass with 0 fields, useclassNT(NamedTuple):passorNT=NamedTuple("NT",[]).
typing.TypedDict: When using the functional syntax to create aTypedDictclass, failing to pass a value to thefields parameter (TD=TypedDict("TD")) is deprecated. PassingNoneto thefields parameter(TD=TypedDict("TD",None)) is also deprecated. Both will be disallowedin Python 3.15. To create aTypedDictclass with 0 fields, useclassTD(TypedDict):passorTD=TypedDict("TD",{}).wave: Deprecate thegetmark(),setmark()andgetmarkers()methods of thewave.Wave_readandwave.Wave_writeclasses.They will be removed in Python 3.15.(Contributed by Victor Stinner ingh-105096.)
Pending Removal in Python 3.16¶
The import system:
Setting
__loader__on a module whilefailing to set__spec__.loaderis deprecated. In Python 3.16,__loader__will cease to be set ortaken 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 ingh-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 exclusivegroups 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
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,isandor. 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.Januaryandcalendar.Februaryconstants aredeprecated and replaced bycalendar.JANUARYandcalendar.FEBRUARY.(Contributed by Prince Roshan ingh-103636.)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.
EntryPointstuple interface.Implicit
Noneon return values.
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.)sre_compile,sre_constantsandsre_parsemodules.shutil:rmtree()’sonerror parameter is deprecated inPython 3.12; use theonexc parameter instead.ssloptions and protocols:ssl.SSLContextwithout 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_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().
unittest.IsolatedAsyncioTestCase: it is deprecated to return a valuethat is notNonefrom a test case.urllib.parsedeprecated functions:urlparse()insteadsplitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
urllib.request:URLopenerandFancyURLopenerstyle of invoking requests isdeprecated. Use newerurlopen()functions and methods.wsgiref:SimpleHandler.stdout.write()should not do partialwrites.xml.etree.ElementTree: Testing the truth value of anElementis deprecated. In a future release itwill always returnTrue. Prefer explicitlen(elem)orelemisnotNonetests instead.zipimport.zipimporter.load_module()is deprecated:useexec_module()instead.
C API Deprecations¶
Pending Removal in Python 3.14¶
The
ma_version_tagfield inPyDictObjectfor extension modules(PEP 699;gh-101193).Creating
immutabletypeswith mutablebases (gh-95388).Functions to configure Python’s initialization, deprecated in Python 3.11:
PySys_SetArgvEx():SetPyConfig.argvinstead.PySys_SetArgv():SetPyConfig.argvinstead.Py_SetProgramName():SetPyConfig.program_nameinstead.Py_SetPythonHome():SetPyConfig.homeinstead.
The
Py_InitializeFromConfig()API should be used withPyConfiginstead.Global configuration variables:
Py_DebugFlag:UsePyConfig.parser_debuginstead.Py_VerboseFlag:UsePyConfig.verboseinstead.Py_QuietFlag:UsePyConfig.quietinstead.Py_InteractiveFlag:UsePyConfig.interactiveinstead.Py_InspectFlag:UsePyConfig.inspectinstead.Py_OptimizeFlag:UsePyConfig.optimization_levelinstead.Py_NoSiteFlag:UsePyConfig.site_importinstead.Py_BytesWarningFlag:UsePyConfig.bytes_warninginstead.Py_FrozenFlag:UsePyConfig.pathconfig_warningsinstead.Py_IgnoreEnvironmentFlag:UsePyConfig.use_environmentinstead.Py_DontWriteBytecodeFlag:UsePyConfig.write_bytecodeinstead.Py_NoUserSiteDirectory:UsePyConfig.user_site_directoryinstead.Py_UnbufferedStdioFlag:UsePyConfig.buffered_stdioinstead.Py_HashRandomizationFlag:UsePyConfig.use_hash_seedandPyConfig.hash_seedinstead.Py_IsolatedFlag:UsePyConfig.isolatedinstead.Py_LegacyWindowsFSEncodingFlag:UsePyPreConfig.legacy_windows_fs_encodinginstead.Py_LegacyWindowsStdioFlag:UsePyConfig.legacy_windows_stdioinstead.Py_FileSystemDefaultEncoding:UsePyConfig.filesystem_encodinginstead.Py_HasFileSystemDefaultEncoding:UsePyConfig.filesystem_encodinginstead.Py_FileSystemDefaultEncodeErrors:UsePyConfig.filesystem_errorsinstead.Py_UTF8Mode:UsePyPreConfig.utf8_modeinstead.(seePy_PreInitialize())
The
Py_InitializeFromConfig()API should be used withPyConfiginstead.
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_UNICODEtype and thePy_UNICODE_WIDEmacro:Usewchar_tinstead.Python initialization functions:
PySys_ResetWarnOptions():Clearsys.warnoptionsandwarnings.filtersinstead.Py_GetExecPrefix():Getsys.exec_prefixinstead.Py_GetPath():Getsys.pathinstead.Py_GetPrefix():Getsys.prefixinstead.Py_GetProgramFullPath():Getsys.executableinstead.Py_GetProgramName():Getsys.executableinstead.Py_GetPythonHome():GetPyConfig.homeor thePYTHONHOMEenvironment 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_shashmember:callPyObject_Hash()instead.PyDictObject.ma_version_tagmember.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.