弃用项

计划在 Python 3.15 中移除

  • 导入系统

    • 在设置模块的 __cached__ 属性时,若未同时设置 __spec__.cached,此行为已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑 __cached__ 属性。(由 gh-97879 贡献)

    • 在设置模块的 __package__ 属性时,若未同时设置 __spec__.parent,此行为已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑 __package__ 属性。(由 gh-97879 贡献)

  • ctypes:

    • 未写入文档的 ctypes.SetPointerType() 函数自 Python 3.13 起已被弃用。

  • http.server:

    • 过时且很少使用的 CGIHTTPRequestHandler 已从 Python 3.13 开始弃用。没有直接的替代品。任何将 Web 服务器与请求处理程序对接的方式都比 CGI 好。

    • python -m http.server 命令行界面的 --cgi 旗标已自 Python 3.13 起弃用。

  • importlib:

    • load_module() 方法:请改用 exec_module()

  • locale:

  • pathlib:

  • platform:

    • java_ver() 已自 Python 3.13 起弃用。此函数仅对 Jython 支持有用,其 API 令人困惑,且基本未经测试。

  • sysconfig:

  • threading:

    • RLock() 在 Python 3.15 中将不再接受任何参数。自 Python 3.14 起,传递任何参数的行为已被弃用,因为 Python 版本不允许任何参数,但 C 版本允许任意数量的位置或关键字参数,并会忽略所有参数。

  • types:

  • typing:

    • 用于创建 NamedTuple 类的未写入文档的关键字参数语法(例如,Point = NamedTuple("Point", x=int, y=int))已自 Python 3.13 起弃用。请改用基于类的语法或函数式语法。

    • 当使用 TypedDict 的函数式语法时,未向 fields 参数传递值(TD = TypedDict("TD"))或传递 NoneTD = TypedDict("TD", None))的做法已自 Python 3.13 起弃用。要创建一个没有字段的 TypedDict,请使用 class TD(TypedDict): passTD = TypedDict("TD", {})

    • typing.no_type_check_decorator() 装饰器函数已自 Python 3.13 起弃用。在 typing 模块中存在八年后,它仍未被任何主流类型检查器支持。

  • wave:

  • zipimport:

计划在 Python 3.16 中移除

计划在 Python 3.17 中移除

  • collections.abc:

    • collections.abc.ByteString 计划在 Python 3.17 中移除。

      要测试 obj 是否在运行时实现了缓冲区协议,请使用 isinstance(obj, collections.abc.Buffer)。在类型注解中,请使用 Buffer 或显式指定代码支持的类型的联合类型(例如 bytes | bytearray | memoryview)。

      ByteString 最初旨在作为一个抽象类,作为 bytesbytearray 的超类型。然而,由于该抽象基类(ABC)从未有过任何方法,所以知道一个对象是 ByteString 的实例实际上并不能提供任何关于该对象的有用信息。其他常见的缓冲区类型,如 memoryview,也从未被理解为 ByteString 的子类型(无论是在运行时还是通过静态类型检查器)。

      更多详情请参阅 PEP 688。(由 Shantanu Jain 在 gh-91896 中贡献。)

  • typing:

    • 在 Python 3.14 之前,旧式联合类型是通过私有类 typing._UnionGenericAlias 实现的。该类对于实现已不再需要,但为了向后兼容而保留,并计划在 Python 3.17 中移除。用户应使用文档化的内省辅助工具,如 typing.get_origin()typing.get_args(),而不是依赖于私有实现细节。

    • typing.ByteString,自 Python 3.9 起已弃用,计划在 Python 3.17 中移除。

      要测试 obj 是否在运行时实现了缓冲区协议,请使用 isinstance(obj, collections.abc.Buffer)。在类型注解中,请使用 Buffer 或显式指定代码支持的类型的联合类型(例如 bytes | bytearray | memoryview)。

      ByteString 最初旨在作为一个抽象类,作为 bytesbytearray 的超类型。然而,由于该抽象基类(ABC)从未有过任何方法,所以知道一个对象是 ByteString 的实例实际上并不能提供任何关于该对象的有用信息。其他常见的缓冲区类型,如 memoryview,也从未被理解为 ByteString 的子类型(无论是在运行时还是通过静态类型检查器)。

      更多详情请参阅 PEP 688。(由 Shantanu Jain 在 gh-91896 中贡献。)

计划在 Python 3.19 中移除

  • ctypes:

    • 在非 Windows 平台上,通过设置 _pack_ 但不设置 _layout_ 来隐式切换到与 MSVC 兼容的结构体布局的做法。

计划在未来版本中移除

以下 API 将在未来移除,但目前尚未确定移除日期。

  • argparse:

    • 嵌套参数组和嵌套互斥组的做法已被弃用。

    • add_argument_group() 传递未写入文档的关键字参数 prefix_chars 的做法现已弃用。

    • argparse.FileType 类型转换器已被弃用。

  • builtins:

    • 生成器:throw(type, exc, tb)athrow(type, exc, tb) 签名已被弃用:请改用单参数签名的 throw(exc)athrow(exc)

    • 目前 Python 允许数字字面量紧跟关键字,例如 0in x1or x0if 1else 2。这会允许一些易混淆和有歧义的表达式,例如 [0x1for x in y](可能被解释为 [0x1 for x in y][0x1f or x in y])。如果数字字面量紧跟着 andelseforifinisor 这些关键字之一,将会引发语法警告。在未来的版本中,这将更改为语法错误。(gh-87999

    • __index__()__int__() 方法返回非 int 类型的支持:这些方法将被要求返回 int 的严格子类的实例。

    • __float__() 方法返回 float 的严格子类的支持:这些方法将被要求返回 float 的实例。

    • __complex__() 方法返回 complex 的严格子类的支持:这些方法将被要求返回 complex 的实例。

    • int() 委托给 __trunc__() 方法的做法。

    • complex() 构造函数中将复数作为 realimag 参数传递的做法现已弃用;它应该仅作为单个位置参数传递。(由 Serhiy Storchaka 在 gh-109218 中贡献。)

  • calendarcalendar.Januarycalendar.February 常量已被弃用,并由 calendar.JANUARYcalendar.FEBRUARY 替换。(由 Prince Roshan 在 gh-103636 中贡献。)

  • codecs:请使用 open() 而不是 codecs.open()。(gh-133038

  • codeobject.co_lnotab:请改用 codeobject.co_lines() 方法。

  • datetime:

    • utcnow():请使用 datetime.datetime.now(tz=datetime.UTC)

    • utcfromtimestamp():请使用 datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)

  • gettext:复数值必须是整数。

  • importlib:

  • importlib.metadata:

    • EntryPoints 元组接口。

    • 返回值的隐式 None

  • loggingwarn() 方法已自 Python 3.3 起弃用,请改用 warning()

  • mailbox:使用 StringIO 输入和文本模式已被弃用,请改用 BytesIO 和二进制模式。

  • os:在多线程进程中调用 os.register_at_fork()

  • pydoc.ErrorDuringImportexc_info 参数使用元组值的做法已被弃用,请改用异常实例。

  • re:现在对正则表达式中的数字组引用和组名应用了更严格的规则。现在只接受 ASCII 数字序列作为数字引用。字节串模式和替换字符串中的组名现在只能包含 ASCII 字母、数字和下划线。(由 Serhiy Storchaka 在 gh-91760 中贡献。)

  • sre_compilesre_constantssre_parse 模块。

  • shutilrmtree()onerror 参数在 Python 3.12 中已弃用;请改用 onexc 参数。

  • ssl 选项和协议

    • 不带协议参数的 ssl.SSLContext 已被弃用。

    • ssl.SSLContext: set_npn_protocols()selected_npn_protocol() 已被弃用:请改用 ALPN。

    • ssl.OP_NO_SSL* 选项

    • ssl.OP_NO_TLS* 选项

    • 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

  • threading 方法

  • typing.Text (gh-92332)。

  • 内部类 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()

  • wsgirefSimpleHandler.stdout.write() 不应进行部分写入。

  • xml.etree.ElementTree:测试 Element 的真值的做法已被弃用。在未来的版本中,它将始终返回 True。请优先使用显式的 len(elem)elem is not None 测试。

  • sys._clear_type_cache() 已被弃用:请改用 sys._clear_internal_caches()

C API 弃用项

计划在 Python 3.15 中移除

计划在 Python 3.18 中移除

计划在未来版本中移除

以下 API 已被弃用并将被移除,但目前尚未确定移除日期。