弃用¶
计划在 Python 3.17 中移除¶
-
使用不带年份的包含
%e(月份日期序号) 的格式字符串的strptime()调用自 Python 3.15 起已被弃用。 (由 Stan Ulbrych 在 gh-70647 中贡献。)
-
collections.abc.ByteString计划在 Python 3.17 中移除。使用
isinstance(obj, collections.abc.Buffer)来测试obj是否在运行时实现了 缓冲区协议。要用于类型标注,则使用Buffer或是显式指明你的代码所支持类型的并集 (例如bytes | bytearray | memoryview)。ByteString原本是想作为bytes和bytearray的超类型的抽象基类提供。 不过,由于该 ABC 从未有任何方法,知道一个对象是ByteString的实例并不能真正告诉你有关该对象的任何有用信息。其他常见缓冲区类型如memoryview同样不能被当作是ByteString的子类型(无论是在运行时还是对于静态类型检查器)。
-
将非 ascii encoding 名称传给
encodings.normalize_encoding()的做法已被弃用并计划在 Python 3.17 中移除。 (由 Stan Ulbrych 在 gh-136702 中贡献。)
-
webbrowser.MacOSXOSAScript已被弃用并改用webbrowser.MacOS。 (gh-137586)
-
在 Python 3.14 之前,旧式的联合是通过私有类
typing._UnionGenericAlias实现的。实现已不再需要该类,但为向后兼容性保留了该类,并计划在 Python 3.17 中删除。用户应使用记录在案的内省助手函数,如typing.get_origin()和typing.get_args(),而不是依赖于私有的实现细节。typing.ByteString自 Python 3.9 起已被弃用,计划在 Python 3.17 中移除。使用
isinstance(obj, collections.abc.Buffer)来测试obj是否在运行时实现了 缓冲区协议。要用于类型标注,则使用Buffer或是显式指明你的代码所支持类型的并集 (例如bytes | bytearray | memoryview)。ByteString原本是想作为bytes和bytearray的超类型的抽象基类提供。 不过,由于该 ABC 从未有任何方法,知道一个对象是ByteString的实例并不能真正告诉你有关该对象的任何有用信息。其他常见缓冲区类型如memoryview同样不能被当作是ByteString的子类型(无论是在运行时还是对于静态类型检查器)。
-
tkinter.Variable的方法trace_variable(),trace()(trace_variable()的别名),trace_vdelete()和trace_vinfo(),自 Python 3.14 起已被弃用,计划在 Python 3.17 中移除。 请改用trace_add(),trace_remove()和trace_info()。 (由 Serhiy Storchaka 在 gh-120220 中贡献。)
计划在 Python 3.18 中移除¶
计划在 Python 3.19 中移除¶
-
http.cookies.Morsel.js_output()已被弃用并将在 Python 3.19 中移除。http.cookies.BaseCookie.js_output()已被弃用并将在 Python 3.19 中移除。
-
修改
IMAP4.file的做法现已被弃用并计划在 Python 3.19 中移除。 该属性现已不再使用并且修改其值不会自动关闭当前文件。在 Python 3.14 之前,该属性被用于为
IMAP4实现相应的read()和readline()方法但在此之后情况已发生改变。
-
tkinter.filedialog.askopenfiles()has been deprecated since Python 3.16. Iterate over the names returned byaskopenfilenames()and open them one by one instead. (Contributed by Serhiy Storchaka in gh-152638.)
计划在 Python 3.20 中移除¶
调用
struct.Struct的__new__()方法不带 format 参数的做法已被弃用并将在 Python 3.20 中移除。 在已初始化的Struct对象上调用__init__()方法的做法已被弃用并将在 Python 3.20 中移除。(由 Sergey B Kirpichev 和 Serhiy Storchaka 在 gh-143715 中贡献。).)
在这些标准库模块中的
__version__,version和VERSION属性已被弃用并将在 Python 3.20 中移除。 请改用sys.version_info。ctypes.macholiblogging(__date__也已被弃用)xml.sax.expatreader
(由 Hugo van Kemenade 和 Stan Ulbrych 在 gh-76007 中贡献。)
由 PEP 829 定义的弃用:
为在
name.pth文件中找到的import行产生警告。name.pth文件将不再以默认语言区域编码格式解码。 它们 必须 使用utf-8-sig编码。
(由 Barry Warsaw 在 gh-148641 中贡献。)
ast:创建抽象 AST 节点 (如
ast.AST或ast.expr) 的做法已被弃用并将在 Python 3.20 中引发错误。
Pending removal in Python 3.21¶
-
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.abstractmethod()withclassmethod(),staticmethod(), andpropertyrespectively.
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.
-
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'.
-
tempfile._TemporaryFileWrapperwill be removed in Python 3.21. Use the publictempfile.TemporaryFileWrapperinstead.
计划在未来版本中移除¶
以下 API 将会被移除,尽管具体时间还未确定。
-
嵌套参数组和嵌套互斥组已被弃用。
将未写入文档的关键字参数 prefix_chars 传递给
add_argument_group()的做法现在已被弃用。argparse.FileType类型转换器已弃用。
-
生成器:
throw(type, exc, tb)和athrow(type, exc, tb)签名已被弃用:请改用throw(exc)和athrow(exc),即单参数签名。目前 Python 接受数字类字面值后面紧跟关键字的写法,例如
0in x,1or x,0if 1else 2。它允许像[0x1for x in y]这样令人困惑且有歧义的表达式 (它可以被解读为[0x1 for x in y]或者[0x1f or x in y])。如果数字类字面值后面紧跟关键字and,else,for,if,in,is和or中的一个将会引发语法警告。在未来的版本中它将改为语法错误。 (gh-87999)对
__index__()和__int__()方法返回非 int 类型的支持:将要求这些方法必须返回int的子类的实例。对
__float__()方法返回float的子类的支持:将要求这些方法必须返回float的实例。对
__complex__()方法返回complex的子类的支持:将要求这些方法必须返回complex的实例。传入一个复数作为
complex()构造器中的 real 或 imag 参数的做法现在已被弃用;它应当仅作为单个位置参数被传入。(由 Serhiy Storchaka 在 gh-109218 中贡献。)
calendar:calendar.January和calendar.February常量已被弃用并由calendar.JANUARY和calendar.FEBRUARY替代。 (由 Prince Roshan 在 gh-103636 中贡献。)codecs: 请使用open()代替codecs.open()。 (gh-133038)codeobject.co_lnotab: 改用codeobject.co_lines()方法。-
utcnow(): 使用datetime.datetime.now(tz=datetime.UTC)。utcfromtimestamp(): 使用datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)。
gettext: 复数值必须是一个整数。-
cache_from_source()debug_override 形参已被弃用:改用 optimization 形参。
-
EntryPoints元组接口。返回值中隐式的
None。
mailbox: 对 StringIO 输入和文本模式的使用已被弃用,改用 BytesIO 和二进制模式。os: 在多线程的进程中调用os.register_at_fork()。os.path:os.path.commonprefix()已弃用,对于路径前缀请使用os.path.commonpath()。os.path.commonprefix()函数被弃用是由于其误导性的名称和模块。 使用该函数获取路径前缀是不安全的,尽管它被包括在一个用于操作路径的模块中,使用此函数很容易意外地将路径遍历安全漏洞引入 Python 程序中。pydoc.ErrorDuringImport: 使用元组值作为 exc_info 形参的做法已被弃用,应使用异常实例。re: 现在对于正则表达式中的数字分组引用和分组名称将应用更严格的规则。现在只接受 ASCII 数字序列作为数字引用。字节串模式和替换字符串中的分组名称现在只能包含 ASCII 字母和数字以及下划线。 (由 Serhiy Storchaka 在 gh-91760 中贡献。)shutil:rmtree()的 onerror 形参在 Python 3.12 中已被弃用;请改用 onexc 形参。ssl选项和协议:ssl.SSLContext不带 protocol 参数的做法已被弃用。ssl.SSLContext:set_npn_protocols()和selected_npn_protocol()已被弃用:请改用 ALPN。ssl.OP_NO_SSL*选项ssl.OP_NO_TLS*选项ssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threading的方法:threading.Condition.notifyAll(): 使用notify_all().threading.Event.isSet(): 使用is_set()。threading.Thread.isDaemon(),threading.Thread.setDaemon(): 使用threading.Thread.daemon属性。threading.Thread.getName(),threading.Thread.setName(): 使用threading.Thread.name属性。threading.currentThread(): 使用threading.current_thread()。threading.activeCount(): 使用threading.active_count()。
内部类
typing._UnionGenericAlias不再用于实现typing.Union。为了保持使用该私有类的用户的兼容性,将至少在 Python 3.17 之前提供兼容性垫片。 (由 Jelle Zijlstra 在 gh-105499 中贡献。)unittest.IsolatedAsyncioTestCase: 从测试用例返回不为None的值的做法已被弃用。urllib.parse函数已被弃用:改用urlparse()splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()不应执行部分写入。xml.etree.ElementTree: 对Element的真值测试已被弃用。在未来的发布版中它将始终返回True。建议改用显式的len(elem)或elem is not None测试。sys._clear_type_cache()已弃用,请改用sys._clear_internal_caches()。
软弃用¶
尚无计划移除 soft deprecated API。
现在
re.match()和re.Pattern.match()已被设为 soft deprecated 而应改用新的re.prefixmatch()和re.Pattern.prefixmatch()API,它们作为替代性的、更明白的显式名称被添加进来。 这样做的目的是为了遵循 Python 之禅的 "明白胜于隐晦" 原则以消除对 match 具体含义理解所造成的混淆。 大多数其他语言的正则表达式库都使用名为 match 的 API 来表示to mean what Python 一直以来所称为的 search。我们 没有 计划移除旧的
match()名称,因为它已在代码中使用超过 30。 支持较旧 Python 的代码应当继续使用match(),而新的代码应当首选prefixmatch()。 参见 prefixmatch() vs. match()。(由 Gregory P. Smith 在 gh-86519 以及 Hugo van Kemenade 在 gh-148100 中贡献。)
C API 的弃用项¶
计划在 Python 3.18 中移除¶
以下私有函数已被弃用,并计划在 Python 3.18 中移除:
_PyBytes_Join(): 使用PyBytes_Join()。_PyDict_GetItemStringWithError(): 使用PyDict_GetItemStringRef()._PyDict_Pop(): 使用PyDict_Pop()。_PyLong_Sign(): 使用PyLong_GetSign()。_PyLong_FromDigits()和_PyLong_New(): 使用PyLongWriter_Create()._PyThreadState_UncheckedGet(): 使用PyThreadState_GetUnchecked()._PyUnicode_AsString(): 使用PyUnicode_AsUTF8()。_PyUnicodeWriter_Init(): 将_PyUnicodeWriter_Init(&writer)替换为writer = PyUnicodeWriter_Create(0)._PyUnicodeWriter_Finish(): 将_PyUnicodeWriter_Finish(&writer)替换为PyUnicodeWriter_Finish(writer)。_PyUnicodeWriter_Dealloc(): 将_PyUnicodeWriter_Dealloc(&writer)替换为PyUnicodeWriter_Discard(writer)。_PyUnicodeWriter_WriteChar(): 将_PyUnicodeWriter_WriteChar(&writer, ch)替换为PyUnicodeWriter_WriteChar(writer, ch)._PyUnicodeWriter_WriteStr(): 将_PyUnicodeWriter_WriteStr(&writer, str)替换为PyUnicodeWriter_WriteStr(writer, str)._PyUnicodeWriter_WriteSubstring(): 将_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)替换为PyUnicodeWriter_WriteSubstring(writer, str, start, end)._PyUnicodeWriter_WriteASCIIString(): 请将_PyUnicodeWriter_WriteASCIIString(&writer, str)替换为PyUnicodeWriter_WriteASCII(writer, str)._PyUnicodeWriter_WriteLatin1String(): 将_PyUnicodeWriter_WriteLatin1String(&writer, str)替换为PyUnicodeWriter_WriteUTF8(writer, str)._PyUnicodeWriter_Prepare(): (无替代)。_PyUnicodeWriter_PrepareKind(): (无替代)。_Py_HashPointer(): 使用Py_HashPointer()。_Py_fopen_obj(): 使用Py_fopen()。PyGen_New(): (no replacement).PyGen_NewWithQualName(): (no replacement).PyCoro_New(): (no replacement).PyAsyncGen_New(): (no replacement).
pythoncapi-compat 项目 可被用于在 Python 3.13 及更早版本中获取这些新的公有函数。 (由 Victor Stinner 在 gh-128863 中贡献。)
计划在 Python 3.19 中移除¶
PEP 456 对于字符串哈希方案定义的嵌入方支持。
计划在 Python 3.20 中移除¶
_PyObject_CallMethodId(),_PyObject_GetAttrId()和_PyUnicode_FromId()自 3.15 起已弃用并将在 3.20 中移除。 作为替代,请使用PyUnicode_InternFromString()并将结果缓存在模块状态中,然后调用PyObject_CallMethod()或PyObject_GetAttr()。 (由 Victor Stinner 在 gh-141049 中贡献。)PyComplexObject中的cval字段 (gh-128813)。 使用PyComplex_AsCComplex()和PyComplex_FromCComplex()在 Python 复数和 CPy_complex表示形式之间进行转换。Py_MATH_PIl和Py_MATH_El宏。
计划在未来版本中移除¶
以下 API 已被弃用,将被移除,但目前尚未确定移除日期。
Py_TPFLAGS_HAVE_FINALIZE: 自 Python 3.8 起不再需要。PySlice_GetIndicesEx(): 改用PySlice_Unpack()和PySlice_AdjustIndices().PyUnicode_READY(): 自 Python 3.12 起不再需要PyErr_Display(): 改用PyErr_DisplayException()。_PyErr_ChainExceptions(): 改用_PyErr_ChainExceptions1()。PyBytesObject.ob_shash成员:改为调用PyObject_Hash()。线程本地存储 (TLS) API: