Deprecations¶
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.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¶
- 
- The undocumented - ctypes.SetPointerType()function has been deprecated since Python 3.13.
 
- 
- The obsolete and rarely used - CGIHTTPRequestHandlerhas been deprecated since Python 3.13. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.
- The - --cgiflag to the python -m http.server command-line interface has been deprecated since Python 3.13.
 
- importlib:- __package__and- __cached__will cease to be set or taken into consideration by the import system (gh-97879).
- 
- The - getdefaultlocale()function has 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. Use- getlocale(),- setlocale(), and- getencoding()instead. (Contributed by Hugo van Kemenade in gh-111187.)
 
- 
- PurePath.is_reserved()has been deprecated since Python 3.13. Use- os.path.isreserved()to detect reserved paths on Windows.
 
- 
- 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.
 
- 
- 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.
 
- 
- The undocumented keyword argument syntax for creating - NamedTupleclasses (e.g.- Point = NamedTuple("Point", x=int, y=int)) has been deprecated since Python 3.13. Use the class-based syntax or the functional syntax instead.
- The - typing.no_type_check_decorator()decorator function has been deprecated since Python 3.13. After eight years in the- typingmodule, it has yet to be supported by any major type checker.
 
- wave:- The - getmark(),- setmark(), and- getmarkers()methods of the- Wave_readand- Wave_writeclasses have been deprecated since Python 3.13.
 
Pending Removal in Python 3.16¶
- 
- Bitwise inversion on boolean types, - ~Trueor- ~Falsehas been deprecated since Python 3.12, as it produces surprising and unintuitive results (- -2and- -1). Use- not xinstead for the logical negation of a Boolean. In the rare case that you need the bitwise inversion of the underlying integer, convert to- intexplicitly (- ~int(x)).
 
- 
- 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.
 
- 
- The - ExecErrorexception has been deprecated since Python 3.14. It has not been used by any function in- shutilsince Python 3.4, and is now an alias of- RuntimeError.
 
- 
- The - Class.get_methodsmethod has been deprecated since Python 3.14.
 
- sys:- The - _enablelegacywindowsfsencoding()function has been deprecated since Python 3.13. Use the- PYTHONLEGACYWINDOWSFSENCODINGenvironment variable instead.
 
- 
- The undocumented and unused - TarFile.tarfileattribute has been deprecated since Python 3.13.
 
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.
 
- logging: the- warn()method has been deprecated since Python 3.3, use- warning()instead.
- 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.
- The - PyImport_ImportModuleNoBlock(): Use- PyImport_ImportModule()instead.
- PyWeakref_GetObject()and- PyWeakref_GET_OBJECT(): Use- PyWeakref_GetRef()instead.
- Py_UNICODEtype and the- Py_UNICODE_WIDEmacro: 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_ChainExceptions1()instead.
- 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.