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)
- 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 to importlib-resources: Migrating from Legacy (gh-106531)
Pending Removal in Python 3.14¶
- argparse: The type, choices, and metavar parameters of- argparse.BooleanOptionalActionare 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 a- DeprecationWarningto 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.Constantinstead. (Contributed by Serhiy Storchaka in gh-90953.)
- 
- The child watcher classes - MultiLoopChildWatcher,- FastChildWatcher,- AbstractChildWatcherand- SafeChildWatcherare 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()and- asyncio.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 a- DeprecationWarningif 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: Deprecated- ByteString. Prefer- Sequenceor- Buffer. For use in typing, prefer a union, like- bytes | bytearray, or- collections.abc.Buffer. (Contributed by Shantanu Jain in gh-91896.)
- email: Deprecated the isdst parameter in- email.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.abcdeprecated classes:- importlib.abc.ResourceReader
- importlib.abc.Traversable
- importlib.abc.TraversableResources
 - Use - importlib.resources.abcclasses instead:- (Contributed by Jason R. Coombs and Hugo van Kemenade in gh-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 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 the- get_context()or- set_start_method()APIs to explicitly specify when your code requires- 'fork'. See Contexts and start methods.
- pathlib:- is_relative_to()and- relative_to(): passing additional arguments is deprecated.
- pkgutil:- find_loader()and- get_loader()now raise- DeprecationWarning; use- importlib.util.find_spec()instead. (Contributed by Nikita Sobolev in gh-97850.)
- pty:- master_open(): use- pty.openpty().
- slave_open(): use- pty.openpty().
 
- 
- versionand- version_info.
- execute()and- executemany()if named placeholders are used and parameters is a sequence instead of a- dict.
- date and datetime adapter, date and timestamp converter: see the - sqlite3documentation for suggested replacement recipes.
 
- types.CodeType: Accessing- co_lnotabwas deprecated in PEP 626 since 3.10 and was planned to be removed in 3.12, but it only got a proper- DeprecationWarningin 3.12. May be removed in 3.14. (Contributed by Nikita Sobolev in gh-101866.)
- typing:- ByteString, deprecated since Python 3.9, now causes a- DeprecationWarningto be emitted when it is used.
- urllib:- urllib.parse.Quoteris 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.CGIHTTPRequestHandlerwill be removed along with its related- --cgiflag to- python -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. Use- locale.setlocale(),- locale.getencoding()and- locale.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, use- os.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 in gh-116349.)
- threading: Passing any arguments to- threading.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 from- threading.RLock()in Python 3.15. (Contributed by Nikita Sobolev in gh-102029.)
- 
- The undocumented keyword argument syntax for creating - NamedTupleclasses (- NT = NamedTuple("NT", x=int)) is deprecated, and will be disallowed in 3.15. Use the class-based syntax or the functional syntax instead.
- When using the functional syntax to create a - NamedTupleclass, failing to pass a value to the fields parameter (- NT = NamedTuple("NT")) is deprecated. Passing- Noneto the fields parameter (- NT = NamedTuple("NT", None)) is also deprecated. Both will be disallowed in Python 3.15. To create a- NamedTupleclass with 0 fields, use- class NT(NamedTuple): passor- NT = NamedTuple("NT", []).
 
- typing.TypedDict: When using the functional syntax to create a- TypedDictclass, failing to pass a value to the fields parameter (- TD = TypedDict("TD")) is deprecated. Passing- Noneto the fields parameter (- TD = TypedDict("TD", None)) is also deprecated. Both will be disallowed in Python 3.15. To create a- TypedDictclass with 0 fields, use- class TD(TypedDict): passor- TD = TypedDict("TD", {}).
- wave: Deprecate the- getmark(),- setmark()and- getmarkers()methods of the- wave.Wave_readand- wave.Wave_writeclasses. They will be removed in Python 3.15. (Contributed by Victor Stinner in gh-105096.)
Pending Removal in Python 3.16¶
- array:- array.array- 'u'type (- wchar_t): use the- 'w'type instead (- Py_UCS4).
- builtins:- ~bool, bitwise inversion on bool.
- symtable: Deprecate- symtable.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)and- athrow(type, exc, tb)signature is deprecated: use- throw(exc)and- athrow(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 keywords- and,- else,- for,- if,- in,- isand- or. 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 of- int.
- Support for - __float__()method returning a strict subclass of- float: these methods will be required to return an instance of- float.
- Support for - __complex__()method returning a strict subclass of- complex: these methods will be required to return an instance of- complex.
- 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.Januaryand- calendar.Februaryconstants are deprecated and replaced by- calendar.JANUARYand- calendar.FEBRUARY. (Contributed by Prince Roshan in gh-103636.)
- codeobject.co_lnotab: use the- codeobject.co_lines()method instead.
- 
- utcnow(): use- datetime.datetime.now(tz=datetime.UTC).
- utcfromtimestamp(): use- datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
 
- gettext: Plural value must be an integer.
- 
- load_module()method: use- exec_module()instead.
- cache_from_source()debug_override parameter is deprecated: use the optimization parameter instead.
 
- 
- EntryPointstuple interface.
- Implicit - Noneon return values.
 
- mailbox: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.
- os: Calling- os.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_constantsand- sre_parsemodules.
- 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()and- selected_npn_protocol()are deprecated: use ALPN instead.
- ssl.OP_NO_SSL*options
- ssl.OP_NO_TLS*options
- ssl.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.
- threadingmethods:- threading.Condition.notifyAll(): use- notify_all().
- threading.Event.isSet(): use- is_set().
- threading.Thread.isDaemon(),- threading.Thread.setDaemon(): use- threading.Thread.daemonattribute.
- threading.Thread.getName(),- threading.Thread.setName(): use- threading.Thread.nameattribute.
- threading.currentThread(): use- threading.current_thread().
- threading.activeCount(): use- threading.active_count().
 
- unittest.IsolatedAsyncioTestCase: it is deprecated to return a value that is not- Nonefrom a test case.
- urllib.parsedeprecated functions:- urlparse()instead- splitattr()
- splithost()
- splitnport()
- splitpasswd()
- splitport()
- splitquery()
- splittag()
- splittype()
- splituser()
- splitvalue()
- to_bytes()
 
- urllib.request:- URLopenerand- FancyURLopenerstyle of invoking requests is deprecated. Use newer- urlopen()functions and methods.
- wsgiref:- SimpleHandler.stdout.write()should not do partial writes.
- xml.etree.ElementTree: Testing the truth value of an- Elementis deprecated. In a future release it will always return- True. Prefer explicit- len(elem)or- elem is not Nonetests instead.
- zipimport.zipimporter.load_module()is deprecated: use- exec_module()instead.
C API Deprecations¶
Pending Removal in Python 3.14¶
- The - ma_version_tagfield in- PyDictObjectfor extension modules (PEP 699; gh-101193).
- Creating - immutable typeswith mutable bases (gh-95388).
- Functions to configure Python’s initialization, deprecated in Python 3.11: - PySys_SetArgvEx(): set- PyConfig.argvinstead.
- PySys_SetArgv(): set- PyConfig.argvinstead.
- Py_SetProgramName(): set- PyConfig.program_nameinstead.
- Py_SetPythonHome(): set- PyConfig.homeinstead.
 - The - Py_InitializeFromConfig()API should be used with- PyConfiginstead.
- Global configuration variables: - Py_DebugFlag: use- PyConfig.parser_debuginstead.
- Py_VerboseFlag: use- PyConfig.verboseinstead.
- Py_QuietFlag: use- PyConfig.quietinstead.
- Py_InteractiveFlag: use- PyConfig.interactiveinstead.
- Py_InspectFlag: use- PyConfig.inspectinstead.
- Py_OptimizeFlag: use- PyConfig.optimization_levelinstead.
- Py_NoSiteFlag: use- PyConfig.site_importinstead.
- Py_BytesWarningFlag: use- PyConfig.bytes_warninginstead.
- Py_FrozenFlag: use- PyConfig.pathconfig_warningsinstead.
- Py_IgnoreEnvironmentFlag: use- PyConfig.use_environmentinstead.
- Py_DontWriteBytecodeFlag: use- PyConfig.write_bytecodeinstead.
- Py_NoUserSiteDirectory: use- PyConfig.user_site_directoryinstead.
- Py_UnbufferedStdioFlag: use- PyConfig.buffered_stdioinstead.
- Py_HashRandomizationFlag: use- PyConfig.use_hash_seedand- PyConfig.hash_seedinstead.
- Py_IsolatedFlag: use- PyConfig.isolatedinstead.
- Py_LegacyWindowsFSEncodingFlag: use- PyPreConfig.legacy_windows_fs_encodinginstead.
- Py_LegacyWindowsStdioFlag: use- PyConfig.legacy_windows_stdioinstead.
- Py_FileSystemDefaultEncoding: use- PyConfig.filesystem_encodinginstead.
- Py_HasFileSystemDefaultEncoding: use- PyConfig.filesystem_encodinginstead.
- Py_FileSystemDefaultEncodeErrors: use- PyConfig.filesystem_errorsinstead.
- Py_UTF8Mode: use- PyPreConfig.utf8_modeinstead. (see- Py_PreInitialize())
 - The - Py_InitializeFromConfig()API should be used with- PyConfiginstead.
Pending Removal in Python 3.15¶
- The bundled copy of - libmpdecimal.
- PyImport_ImportModuleNoBlock(): use- PyImport_ImportModule()instead.
- PyWeakref_GET_OBJECT(): use- PyWeakref_GetRef()instead.
- PyWeakref_GetObject(): use- PyWeakref_GetRef()instead.
- Py_UNICODE_WIDEtype: use- wchar_tinstead.
- Py_UNICODEtype: use- wchar_tinstead.
- Python initialization functions: - PySys_ResetWarnOptions(): clear- sys.warnoptionsand- warnings.filtersinstead.
- Py_GetExecPrefix(): get- sys.exec_prefixinstead.
- Py_GetPath(): get- sys.pathinstead.
- Py_GetPrefix(): get- sys.prefixinstead.
- Py_GetProgramFullPath(): get- sys.executableinstead.
- Py_GetProgramName(): get- sys.executableinstead.
- Py_GetPythonHome(): get- PyConfig.homeor the- PYTHONHOMEenvironment 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(): use- PyErr_GetRaisedException()instead.
- PyErr_NormalizeException(): use- PyErr_GetRaisedException()instead.
- PyErr_Restore(): use- PyErr_SetRaisedException()instead.
- PyModule_GetFilename(): use- PyModule_GetFilenameObject()instead.
- PyOS_AfterFork(): use- PyOS_AfterFork_Child()instead.
- PySlice_GetIndicesEx(): use- PySlice_Unpack()and- PySlice_AdjustIndices()instead.
- PyUnicode_AsDecodedObject(): use- PyCodec_Decode()instead.
- PyUnicode_AsDecodedUnicode(): use- PyCodec_Decode()instead.
- PyUnicode_AsEncodedObject(): use- PyCodec_Encode()instead.
- PyUnicode_AsEncodedUnicode(): use- PyCodec_Encode()instead.
- PyUnicode_READY(): unneeded since Python 3.12
- PyErr_Display(): use- PyErr_DisplayException()instead.
- _PyErr_ChainExceptions(): use- _PyErr_ChainExceptions1instead.
- PyBytesObject.ob_shashmember: call- PyObject_Hash()instead.
- PyDictObject.ma_version_tagmember.
- Thread Local Storage (TLS) API: - PyThread_create_key(): use- PyThread_tss_alloc()instead.
- PyThread_delete_key(): use- PyThread_tss_free()instead.
- PyThread_set_key_value(): use- PyThread_tss_set()instead.
- PyThread_get_key_value(): use- PyThread_tss_get()instead.
- PyThread_delete_key_value(): use- PyThread_tss_delete()instead.
- PyThread_ReInitTLS(): unneeded since Python 3.7.