Deprecations¶
Pending Removal in Python 3.15¶
http.server.CGIHTTPRequestHandlerwill be removed along with its related--cgiflag 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. 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
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. PassingNoneto the fields parameter (NT = NamedTuple("NT", None)) is also deprecated. Both will be disallowed in Python 3.15. To create aNamedTupleclass with 0 fields, useclass NT(NamedTuple): passorNT = NamedTuple("NT", []).
typing.TypedDict: When using the functional syntax to create aTypedDictclass, failing to pass a value to the fields parameter (TD = TypedDict("TD")) is deprecated. PassingNoneto the fields parameter (TD = TypedDict("TD", None)) is also deprecated. Both will be disallowed in Python 3.15. To create aTypedDictclass with 0 fields, useclass TD(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 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: Deprecatesymtable.Class.get_methods()due to the lack of interest. (Contributed by Bénédikt Tran in gh-119698.)shutil: Deprecateshutil.ExecError, which hasn’t been raised by anyshutilfunction since Python 3.4. It’s now an alias forRuntimeError.
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,isandor. 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.Januaryandcalendar.Februaryconstants are deprecated and replaced bycalendar.JANUARYandcalendar.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.
-
EntryPointstuple interface.Implicit
Noneon return values.
logging: thewarn()method has been deprecated since Python 3.3, usewarning()instead.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_constantsandsre_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()andselected_npn_protocol()are deprecated: use ALPN instead.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
sysconfig.is_python_build()check_home parameter is deprecated and ignored.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 value that 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 is deprecated. Use newerurlopen()functions and methods.wsgiref:SimpleHandler.stdout.write()should not do partial writes.xml.etree.ElementTree: Testing the truth value of anElementis deprecated. In a future release it will always returnTrue. Prefer explicitlen(elem)orelem is not Nonetests instead.zipimport.zipimporter.load_module()is deprecated: useexec_module()instead.
C API Deprecations¶
Pending Removal in Python 3.15¶
The bundled copy of
libmpdecimal.PyImport_ImportModuleNoBlock(): usePyImport_ImportModule()instead.PyWeakref_GET_OBJECT(): usePyWeakref_GetRef()instead.PyWeakref_GetObject(): usePyWeakref_GetRef()instead.Py_UNICODE_WIDEtype: usewchar_tinstead.Py_UNICODEtype: 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_ChainExceptions1instead.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.