Deprecations
Pending removal in Python 3.17
datetime:~datetime.datetime.strptimecalls using a format string containing%e(day of month) without a year. This has been deprecated since Python 3.15. (Contributed by Stan Ulbrych in70647.)
collections.abc:-
collections.abc.ByteStringis scheduled for removal in Python 3.17.Use
isinstance(obj, collections.abc.Buffer)to test ifobjimplements thebuffer protocol <bufferobjects>at runtime. For use in type annotations, either use~collections.abc.Bufferor a union that explicitly specifies the types your code supports (e.g.,bytes | bytearray | memoryview).!ByteStringwas originally intended to be an abstract class that would serve as a supertype of bothbytesandbytearray. However, since the ABC never had any methods, knowing that an object was an instance of!ByteStringnever actually told you anything useful about the object. Other common buffer types such asmemoryviewwere also never understood as subtypes of!ByteString(either at runtime or by static type checkers).See
PEP 688 <688#current-options>for more details. (Contributed by Shantanu Jain in91896.)
-
encodings:- Passing non-ascii encoding names to
encodings.normalize_encodingis deprecated and scheduled for removal in Python 3.17. (Contributed by Stan Ulbrych in136702.)
- Passing non-ascii encoding names to
profile:- The
!profilemodule is deprecated and will be removed in Python 3.17. Useprofiling.tracinginstead, which provides a compatible API. See799for details. (Contributed by Pablo Galindo and László Kiss Kollár in138122.)
- The
webbrowser:!webbrowser.MacOSXOSAScriptis deprecated in favour of!webbrowser.MacOS. (137586)
typing:-
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 Python 3.17. Users should use documented introspection helpers liketyping.get_originandtyping.get_argsinstead of relying on private implementation details. -
typing.ByteString, deprecated since Python 3.9, is scheduled for removal in Python 3.17.Use
isinstance(obj, collections.abc.Buffer)to test ifobjimplements thebuffer protocol <bufferobjects>at runtime. For use in type annotations, either use~collections.abc.Bufferor a union that explicitly specifies the types your code supports (e.g.,bytes | bytearray | memoryview).!ByteStringwas originally intended to be an abstract class that would serve as a supertype of bothbytesandbytearray. However, since the ABC never had any methods, knowing that an object was an instance of!ByteStringnever actually told you anything useful about the object. Other common buffer types such asmemoryviewwere also never understood as subtypes of!ByteString(either at runtime or by static type checkers).See
PEP 688 <688#current-options>for more details. (Contributed by Shantanu Jain in91896.)
-
tkinter:- The
!tkinter.Variablemethods!trace_variable,!trace(an alias of!trace_variable),!trace_vdeleteand!trace_vinfo, deprecated since Python 3.14, are scheduled for removal in Python 3.17. Use!trace_add,!trace_removeand!trace_infoinstead. (Contributed by Serhiy Storchaka in120220.)
- The
Pending removal in Python 3.18
-
No longer accept a boolean value when a file descriptor is expected. (Contributed by Serhiy Storchaka in
82626.) -
decimal:- The non-standard and undocumented
~decimal.Decimalformat specifier'N', which is only supported in the!decimalmodule's C implementation, has been deprecated since Python 3.13. (Contributed by Serhiy Storchaka in89902.)
- The non-standard and undocumented
-
Deprecations defined by
829:importlines in{name}.pthfiles are silently ignored.
(Contributed by Barry Warsaw in
148641.)
Pending removal in Python 3.19
builtins:- Passing a complex number as the real or imag argument in the
complexconstructor is now deprecated; it should only be passed as a single positional argument. (Contributed by Serhiy Storchaka in109218.)
- Passing a complex number as the real or imag argument in the
ctypes:- Implicitly switching to the MSVC-compatible struct layout by setting
~ctypes.Structure._pack_but not~ctypes.Structure._layout_on non-Windows platforms.
- Implicitly switching to the MSVC-compatible struct layout by setting
hashlib:-
In hash function constructors such as
~hashlib.newor the direct hash-named constructors such as~hashlib.md5and~hashlib.sha256, their optional initial data parameter could also be passed a keyword argument nameddata=orstring=in various!hashlibimplementations.Support for the
stringkeyword argument name is now deprecated and slated for removal in Python 3.19.Before Python 3.13, the
stringkeyword parameter was not correctly supported depending on the backend implementation of hash functions. Prefer passing the initial data as a positional argument for maximum backwards compatibility.
-
http.cookies:http.cookies.Morsel.js_outputis deprecated and will be removed in Python 3.19.http.cookies.BaseCookie.js_outputis deprecated and will be removed in Python 3.19.
imaplib:-
Altering
IMAP4.file <imaplib.IMAP4.file>is now deprecated and slated for removal in Python 3.19. This property is now unused and changing its value does not automatically close the current file.Before Python 3.14, this property was used to implement the corresponding
read()andreadline()methods for~imaplib.IMAP4but this is no longer the case since then.
-
tkinter:tkinter.filedialog.askopenfileshas been deprecated since Python 3.16. Iterate over the names returned by~tkinter.filedialog.askopenfilenamesand open them one by one instead. (Contributed by Serhiy Storchaka in152638.)
Pending removal in Python 3.20
-
Calling the
__new__()method ofstruct.Structwithout the format argument is deprecated and will be removed in Python 3.20. Calling~object.__init__method on initialized~struct.Structobjects is deprecated and will be removed in Python 3.20.(Contributed by Sergey B Kirpichev and Serhiy Storchaka in
143715.) -
The
__version__,versionandVERSIONattributes have been deprecated in these standard library modules and will be removed in Python 3.20. Usesys.version_infoinstead.argparsecsvctypes!ctypes.macholibdecimal(usedecimal.SPEC_VERSIONinstead)http.serverimaplibipaddressjsonlogging(__date__also deprecated)optparsepickleplatformresocketservertabnannytarfiletkinter.fonttkinter.ttkwsgiref.simple_serverxml.etree.ElementTree!xml.sax.expatreaderxml.sax.handlerzlib
(Contributed by Hugo van Kemenade and Stan Ulbrych in
76007.) -
The
__author__,__credits__,__copyright__and__date__attributes have been deprecated in these standard library modules and will be removed in Python 3.20. Attribution is preserved in the source code and the version control history.bz2concurrent.futuresinspectiojsonloggingoptparseplatformpydoctarfiletkinter.ttktokenizeuuid
(Contributed by Stan Ulbrych in
159240.) -
Deprecations defined by
829:- Warnings are produced for
importlines found in{name}.pthfiles. {name}.pthfiles are no longer decoded in the locale encoding by default. They MUST be encoded inutf-8-sig.
(Contributed by Barry Warsaw in
148641.) - Warnings are produced for
-
ast:- Creating instances of abstract AST nodes (such as
ast.ASTor!ast.expr) is deprecated and will raise an error in Python 3.20.
- Creating instances of abstract AST nodes (such as
-
typing:-
It is deprecated to call
isinstanceandissubclasschecks on protocol classes that were not explicitly decorated with!runtime_checkablebut that inherit from a runtime-checkable protocol class. This will raise aTypeErrorin Python 3.20.(Contributed by Bartosz Sławecki in
132604.)
-
Pending removal in Python 3.21
-
abc- Soft-deprecated since Python 3.3
abc.abstractclassmethod,abc.abstractstaticmethod, andabc.abstractpropertynow raise aDeprecationWarning. These classes will be removed in Python 3.21, instead useabc.abstractmethodwithclassmethod,staticmethod, andpropertyrespectively.
- Soft-deprecated since Python 3.3
-
ast:- Classes
slice,Index,ExtSlice,Suite,Param,AugLoadandAugStore, will be removed in Python 3.21. These types are not generated by the parser or accepted by the code generator. - The
dimsproperty ofast.Tuplewill be removed in Python 3.21. Use theast.Tuple.eltsproperty instead.
- Classes
-
functools:- Using a return annotation to infer the dispatch type for
functools.singledispatchorfunctools.singledispatchmethodis deprecated since Python 3.16 and will raiseTypeErrorin Python 3.21. Annotate the dispatch parameter or pass the dispatch type explicitly instead. (Contributed by Bartosz Sławecki in143465.)
- Using a return annotation to infer the dispatch type for
-
struct:- Soft-deprecated since Python 3.15, using
'F'and'D'type codes are now deprecated. These codes will be removed in Python 3.21. Use instead two-letter forms'Zf'and'Zd'.
- Soft-deprecated since Python 3.15, using
-
tempfile:tempfile._TemporaryFileWrapperwill be removed in Python 3.21. Use the publictempfile.TemporaryFileWrapperinstead.
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.
- Passing the undocumented keyword argument prefix_chars to
~argparse.ArgumentParser.add_argument_groupis now deprecated. - The
argparse.FileTypetype converter is deprecated.
builtins:- 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. (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.
- Generators:
calendar:calendar.Januaryandcalendar.Februaryconstants are deprecated and replaced bycalendar.JANUARYandcalendar.FEBRUARY. (Contributed by Prince Roshan in103636.)codecs: useopeninstead ofcodecs.open. (133038)!codeobject.co_lnotab: use thecodeobject.co_linesmethod instead.datetime:~datetime.datetime.utcnow: usedatetime.datetime.now(tz=datetime.UTC).~datetime.datetime.utcfromtimestamp: usedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: Plural value must be an integer.importlib:~importlib.util.cache_from_sourcedebug_override parameter is deprecated: use the optimization parameter instead.
importlib.metadata:EntryPointstuple interface.- Implicit
Noneon return values.
logging: thewarn()method has been deprecated since Python 3.3, use~logging.warninginstead.mailbox: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.os: Callingos.register_at_forkin a multi-threaded process.os.path:os.path.commonprefixis deprecated, useos.path.commonpathfor path prefixes. Theos.path.commonprefixfunction is being deprecated due to having a misleading name and module. The function is not safe to use for path prefixes despite being included in a module about path manipulation, meaning it is easy to accidentally introduce path traversal vulnerabilities into Python programs by using this function.!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 in91760.)shutil:~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:~ssl.SSLContext.set_npn_protocolsand!selected_npn_protocolare 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
threadingmethods:!threading.Condition.notifyAll: use~threading.Condition.notify_all.!threading.Event.isSet: use~threading.Event.is_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.
typing.Text(92332).- The internal class
typing._UnionGenericAliasis no longer used to implementtyping.Union. To preserve compatibility with users using this private class, a compatibility shim will be provided until at least Python 3.17. (Contributed by Jelle Zijlstra in105499.) unittest.IsolatedAsyncioTestCase: it is deprecated to return a value that is notNonefrom a test case.urllib.parsedeprecated functions:~urllib.parse.urlparseinsteadsplitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()should not do partial writes.xml.etree.ElementTree: Testing the truth value of an~xml.etree.ElementTree.Elementis deprecated. In a future release it will always returnTrue. Prefer explicitlen(elem)orelem is not Nonetests instead.sys._clear_type_cacheis deprecated: usesys._clear_internal_cachesinstead.
Soft deprecations
There are no plans to remove soft deprecated APIs.
-
re.matchandre.Pattern.matchare nowsoft deprecatedin favor of the newre.prefixmatchandre.Pattern.prefixmatchAPIs, which have been added as alternate, more explicit names. These are intended to be used to alleviate confusion around what match means by following the Zen of Python's "Explicit is better than implicit" mantra. Most other language regular expression libraries use an API named match to mean what Python has always called search.We do not plan to remove the older
!matchname, as it has been used in code for over 30 years. Code supporting older versions of Python should continue to use!match, while new code should prefer!prefixmatch. Seeprefixmatch-vs-match.(Contributed by Gregory P. Smith in
86519and Hugo van Kemenade in148100.)
C API deprecations
Pending removal in Python 3.18
-
The following private functions are deprecated and planned for removal in Python 3.18:
!_PyBytes_Join: usePyBytes_Join.!_PyDict_GetItemStringWithError: usePyDict_GetItemStringRef.!_PyDict_Pop(): usePyDict_Pop.!_PyLong_Sign(): usePyLong_GetSign.!_PyLong_FromDigitsand!_PyLong_New: usePyLongWriter_Create.!_PyThreadState_UncheckedGet: usePyThreadState_GetUnchecked.!_PyUnicode_AsString: usePyUnicode_AsUTF8.!_PyUnicodeWriter_Init: replace_PyUnicodeWriter_Init(&writer)withwriter = PyUnicodeWriter_Create(0) <PyUnicodeWriter_Create>.!_PyUnicodeWriter_Finish: replace_PyUnicodeWriter_Finish(&writer)withPyUnicodeWriter_Finish(writer) <PyUnicodeWriter_Finish>.!_PyUnicodeWriter_Dealloc: replace_PyUnicodeWriter_Dealloc(&writer)withPyUnicodeWriter_Discard(writer) <PyUnicodeWriter_Discard>.!_PyUnicodeWriter_WriteChar: replace_PyUnicodeWriter_WriteChar(&writer, ch)withPyUnicodeWriter_WriteChar(writer, ch) <PyUnicodeWriter_WriteChar>.!_PyUnicodeWriter_WriteStr: replace_PyUnicodeWriter_WriteStr(&writer, str)withPyUnicodeWriter_WriteStr(writer, str) <PyUnicodeWriter_WriteStr>.!_PyUnicodeWriter_WriteSubstring: replace_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)withPyUnicodeWriter_WriteSubstring(writer, str, start, end) <PyUnicodeWriter_WriteSubstring>.!_PyUnicodeWriter_WriteASCIIString: replace_PyUnicodeWriter_WriteASCIIString(&writer, str, size)withPyUnicodeWriter_WriteASCII(writer, str, size) <PyUnicodeWriter_WriteASCII>.!_PyUnicodeWriter_WriteLatin1String: replace_PyUnicodeWriter_WriteLatin1String(&writer, str, size)by decoding the string withPyUnicode_DecodeLatin1, writing the result withPyUnicodeWriter_WriteStr, and releasing the result withPy_DECREF.!_PyUnicodeWriter_Prepare: (no replacement).!_PyUnicodeWriter_PrepareKind: (no replacement).!_Py_HashPointer: usePy_HashPointer.!_Py_fopen_obj: usePy_fopen.PyGen_New: (no replacement).PyGen_NewWithQualName: (no replacement).PyCoro_New: (no replacement).PyAsyncGen_New: (no replacement).
The pythoncapi-compat project can be used to get these new public functions on Python 3.13 and older. (Contributed by Victor Stinner in
128863.)
Pending removal in Python 3.19
456embedders support for the string hashing scheme definition.
Pending removal in Python 3.20
!_PyObject_CallMethodId,!_PyObject_GetAttrIdand!_PyUnicode_FromIdare deprecated since 3.15 and will be removed in 3.20. Instead, usePyUnicode_InternFromString()and cache the result in the module state, then callPyObject_CallMethodorPyObject_GetAttr. (Contributed by Victor Stinner in141049.)- The
cvalfield inPyComplexObject(128813). UsePyComplex_AsCComplexandPyComplex_FromCComplexto convert a Python complex number to/from the CPy_complexrepresentation. - Macros
!Py_MATH_PIland!Py_MATH_El.
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_GetRaisedExceptioninstead.PyErr_NormalizeException: UsePyErr_GetRaisedExceptioninstead.PyErr_Restore: UsePyErr_SetRaisedExceptioninstead.PyOS_AfterFork: UsePyOS_AfterFork_Childinstead.PySlice_GetIndicesEx: UsePySlice_UnpackandPySlice_AdjustIndicesinstead.PyUnicode_READY: Unneeded since Python 3.12!PyErr_Display: UsePyErr_DisplayExceptioninstead.!_PyErr_ChainExceptions: Use!_PyErr_ChainExceptions1instead.!PyBytesObject.ob_shashmember: callPyObject_Hashinstead.- Thread Local Storage (TLS) API:
PyThread_create_key: UsePyThread_tss_allocinstead.PyThread_delete_key: UsePyThread_tss_freeinstead.PyThread_set_key_value: UsePyThread_tss_setinstead.PyThread_get_key_value: UsePyThread_tss_getinstead.PyThread_delete_key_value: UsePyThread_tss_deleteinstead.PyThread_ReInitTLS: Unneeded since Python 3.7.
谢谢你的反馈!