弃用项¶
计划在 Python 3.15 中移除¶
导入系统
在设置模块的
__cached__
属性时,若未同时设置__spec__.cached
,此行为已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑__cached__
属性。(由 gh-97879 贡献)在设置模块的
__package__
属性时,若未同时设置__spec__.parent
,此行为已被弃用。在 Python 3.15 中,导入系统或标准库将不再设置或考虑__package__
属性。(由 gh-97879 贡献)
-
未写入文档的
ctypes.SetPointerType()
函数自 Python 3.13 起已被弃用。
-
过时且很少使用的
CGIHTTPRequestHandler
已从 Python 3.13 开始弃用。没有直接的替代品。任何将 Web 服务器与请求处理程序对接的方式都比 CGI 好。python -m http.server 命令行界面的
--cgi
旗标已自 Python 3.13 起弃用。
-
load_module()
方法:请改用exec_module()
。
-
getdefaultlocale()
函数自 Python 3.11 起已被弃用。原计划在 Python 3.13 中移除(gh-90817),但已推迟到 Python 3.15。请改用getlocale()
、setlocale()
和getencoding()
。(由 Hugo van Kemenade 在 gh-111187 中贡献。)
-
PurePath.is_reserved()
已自 Python 3.13 起弃用。要检测 Windows 上的保留路径,请使用os.path.isreserved()
。
-
java_ver()
已自 Python 3.13 起弃用。此函数仅对 Jython 支持有用,其 API 令人困惑,且基本未经测试。
-
sysconfig.is_python_build()
的 check_home 参数已自 Python 3.12 起弃用。
-
RLock()
在 Python 3.15 中将不再接受任何参数。自 Python 3.14 起,传递任何参数的行为已被弃用,因为 Python 版本不允许任何参数,但 C 版本允许任意数量的位置或关键字参数,并会忽略所有参数。
-
types.CodeType
:访问co_lnotab
已在 PEP 626 中自 3.10 版起弃用,并计划在 3.12 版中移除,但它仅在 3.12 版中获得了正式的DeprecationWarning
警告。可能会在 3.15 版中移除。(由 Nikita Sobolev 在 gh-101866 中贡献。)
-
用于创建
NamedTuple
类的未写入文档的关键字参数语法(例如,Point = NamedTuple("Point", x=int, y=int)
)已自 Python 3.13 起弃用。请改用基于类的语法或函数式语法。当使用
TypedDict
的函数式语法时,未向 fields 参数传递值(TD = TypedDict("TD")
)或传递None
(TD = TypedDict("TD", None)
)的做法已自 Python 3.13 起弃用。要创建一个没有字段的 TypedDict,请使用class TD(TypedDict): pass
或TD = TypedDict("TD", {})
。typing.no_type_check_decorator()
装饰器函数已自 Python 3.13 起弃用。在typing
模块中存在八年后,它仍未被任何主流类型检查器支持。
wave
:Wave_read
和Wave_write
类的getmark()
、setmark()
和getmarkers()
方法已自 Python 3.13 起弃用。
-
load_module()
已自 Python 3.10 起弃用。请改用exec_module()
。(由 Jiahao Li 在 gh-125746 中贡献。)
计划在 Python 3.16 中移除¶
导入系统
在设置模块的
__loader__
属性时,若未同时设置__spec__.loader
,此行为已被弃用。在 Python 3.16 中,导入系统或标准库将不再设置或考虑__loader__
属性。
-
'u'
格式代码(wchar_t
)自 Python 3.3 起在文档中被弃用,自 Python 3.13 起在运行时被弃用。请改用'w'
格式代码(Py_UCS4
)来处理 Unicode 字符。
-
asyncio.iscoroutinefunction()
已被弃用,并将在 Python 3.16 中移除;请改用inspect.iscoroutinefunction()
。(由 Jiahao Li 和 Kumar Aditya 在 gh-122875 中贡献。)asyncio
的策略系统已被弃用,并将在 Python 3.16 中移除。特别是,以下类和函数已被弃用:用户应使用
asyncio.run()
或带 loop_factory 参数的asyncio.Runner
来使用期望的事件循环实现。例如,在 Windows 上使用
asyncio.SelectorEventLoop
import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(由 Kumar Aditya 在 gh-127949 中贡献。)
-
对布尔类型进行按位取反(
~True
或~False
)的行为已自 Python 3.12 起弃用,因为它会产生令人惊讶且不直观的结果(-2
和-1
)。要对布尔值进行逻辑非运算,请改用not x
。在极少数情况下,如果您需要对底层整数进行按位取反,请显式转换为int
(~int(x)
)。
-
以关键字参数形式向
functools.reduce()
的 Python 实现传递 function 或 sequence 参数的做法已自 Python 3.14 起弃用。
-
对带有 strm 参数的自定义日志处理程序的支持已被弃用,并计划在 Python 3.16 中移除。请改用 stream 参数来定义处理程序。(由 Mariusz Felisiak 在 gh-115032 中贡献。)
-
对于
mimetypes.MimeTypes.add_type()
,有效的扩展名应以“.”开头或是空字符串。不带点的扩展名已被弃用,并将在 Python 3.16 中引发ValueError
。(由 Hugo van Kemenade 在 gh-75223 中贡献。)
-
ExecError
异常已自 Python 3.14 起弃用。自 Python 3.4 以来,shutil
中的任何函数都未使用过它,现在它是RuntimeError
的别名。
-
Class.get_methods
方法已自 Python 3.14 起弃用。
sys
:_enablelegacywindowsfsencoding()
函数已自 Python 3.13 起弃用。请改用PYTHONLEGACYWINDOWSFSENCODING
环境变量。
-
sysconfig.expand_makefile_vars()
函数已自 Python 3.14 起弃用。请改用sysconfig.get_paths()
的vars
参数。
-
未写入文档且未使用的
TarFile.tarfile
属性已自 Python 3.13 起弃用。
计划在 Python 3.17 中移除¶
-
collections.abc.ByteString
计划在 Python 3.17 中移除。要测试
obj
是否在运行时实现了缓冲区协议,请使用isinstance(obj, collections.abc.Buffer)
。在类型注解中,请使用Buffer
或显式指定代码支持的类型的联合类型(例如bytes | bytearray | memoryview
)。ByteString
最初旨在作为一个抽象类,作为bytes
和bytearray
的超类型。然而,由于该抽象基类(ABC)从未有过任何方法,所以知道一个对象是ByteString
的实例实际上并不能提供任何关于该对象的有用信息。其他常见的缓冲区类型,如memoryview
,也从未被理解为ByteString
的子类型(无论是在运行时还是通过静态类型检查器)。
-
在 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
最初旨在作为一个抽象类,作为bytes
和bytearray
的超类型。然而,由于该抽象基类(ABC)从未有过任何方法,所以知道一个对象是ByteString
的实例实际上并不能提供任何关于该对象的有用信息。其他常见的缓冲区类型,如memoryview
,也从未被理解为ByteString
的子类型(无论是在运行时还是通过静态类型检查器)。
计划在 Python 3.19 中移除¶
计划在未来版本中移除¶
以下 API 将在未来移除,但目前尚未确定移除日期。
-
嵌套参数组和嵌套互斥组的做法已被弃用。
向
add_argument_group()
传递未写入文档的关键字参数 prefix_chars 的做法现已弃用。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
的严格子类的实例。对
__complex__()
方法返回complex
的严格子类的支持:这些方法将被要求返回complex
的实例。将
int()
委托给__trunc__()
方法的做法。在
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)-
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()
。pydoc.ErrorDuringImport
:exc_info 参数使用元组值的做法已被弃用,请改用异常实例。re
:现在对正则表达式中的数字组引用和组名应用了更严格的规则。现在只接受 ASCII 数字序列作为数字引用。字节串模式和替换字符串中的组名现在只能包含 ASCII 字母、数字和下划线。(由 Serhiy Storchaka 在 gh-91760 中贡献。)sre_compile
、sre_constants
和sre_parse
模块。shutil
:rmtree()
的 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
方法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()
。
C API 弃用项¶
计划在 Python 3.15 中移除¶
PyWeakref_GetObject()
和PyWeakref_GET_OBJECT()
:请改用PyWeakref_GetRef()
。可以使用 pythoncapi-compat 项目 在 Python 3.12 及更早版本中获得PyWeakref_GetRef()
。Py_UNICODE
类型和Py_UNICODE_WIDE
宏:请改用wchar_t
。PyUnicode_AsDecodedObject()
:请改用PyCodec_Decode()
。PyUnicode_AsDecodedUnicode()
:请改用PyCodec_Decode()
;请注意,某些编解码器(例如“base64”)可能返回str
以外的类型,例如bytes
。PyUnicode_AsEncodedObject()
:请改用PyCodec_Encode()
。PyUnicode_AsEncodedUnicode()
:请改用PyCodec_Encode()
;请注意,某些编解码器(例如“base64”)可能返回bytes
以外的类型,例如str
。Python 初始化函数,在 Python 3.13 中被弃用
Py_GetPath()
:请改用PyConfig_Get("module_search_paths")
(sys.path
)。Py_GetPrefix()
:请改用PyConfig_Get("base_prefix")
(sys.base_prefix
)。如果需要处理虚拟环境,请使用PyConfig_Get("prefix")
(sys.prefix
)。Py_GetExecPrefix()
:请改用PyConfig_Get("base_exec_prefix")
(sys.base_exec_prefix
)。如果需要处理虚拟环境,请使用PyConfig_Get("exec_prefix")
(sys.exec_prefix
)。Py_GetProgramFullPath()
:请改用PyConfig_Get("executable")
(sys.executable
)。Py_GetProgramName()
:请改用PyConfig_Get("executable")
(sys.executable
)。Py_GetPythonHome()
:请改用PyConfig_Get("home")
或PYTHONHOME
环境变量。
可以使用 pythoncapi-compat 项目 在 Python 3.13 及更早版本中获得
PyConfig_Get()
。用于配置 Python 初始化的函数,在 Python 3.11 中被弃用
PySys_SetArgvEx()
:请改用设置PyConfig.argv
。PySys_SetArgv()
:请改用设置PyConfig.argv
。Py_SetProgramName()
:请改用设置PyConfig.program_name
。Py_SetPythonHome()
:请改用设置PyConfig.home
。PySys_ResetWarnOptions()
:请改用清空sys.warnoptions
和warnings.filters
。
应使用
Py_InitializeFromConfig()
API 与PyConfig
配合使用。全局配置变量
Py_DebugFlag
:请改用PyConfig.parser_debug
或PyConfig_Get("parser_debug")
。Py_VerboseFlag
:请改用PyConfig.verbose
或PyConfig_Get("verbose")
。Py_InteractiveFlag
:请改用PyConfig.interactive
或PyConfig_Get("interactive")
。Py_InspectFlag
:请改用PyConfig.inspect
或PyConfig_Get("inspect")
。Py_OptimizeFlag
:请改用PyConfig.optimization_level
或PyConfig_Get("optimization_level")
。Py_NoSiteFlag
:请改用PyConfig.site_import
或PyConfig_Get("site_import")
。Py_BytesWarningFlag
:请改用PyConfig.bytes_warning
或PyConfig_Get("bytes_warning")
。Py_FrozenFlag
:请改用PyConfig.pathconfig_warnings
或PyConfig_Get("pathconfig_warnings")
。Py_IgnoreEnvironmentFlag
:请改用PyConfig.use_environment
或PyConfig_Get("use_environment")
。Py_DontWriteBytecodeFlag
:请改用PyConfig.write_bytecode
或PyConfig_Get("write_bytecode")
。Py_NoUserSiteDirectory
:请改用PyConfig.user_site_directory
或PyConfig_Get("user_site_directory")
。Py_UnbufferedStdioFlag
:请改用PyConfig.buffered_stdio
或PyConfig_Get("buffered_stdio")
。Py_HashRandomizationFlag
:请改用PyConfig.use_hash_seed
和PyConfig.hash_seed
或PyConfig_Get("hash_seed")
。Py_IsolatedFlag
:请改用PyConfig.isolated
或PyConfig_Get("isolated")
。Py_LegacyWindowsFSEncodingFlag
:请改用PyPreConfig.legacy_windows_fs_encoding
或PyConfig_Get("legacy_windows_fs_encoding")
。Py_LegacyWindowsStdioFlag
:请改用PyConfig.legacy_windows_stdio
或PyConfig_Get("legacy_windows_stdio")
。Py_FileSystemDefaultEncoding
、Py_HasFileSystemDefaultEncoding
:请改用PyConfig.filesystem_encoding
或PyConfig_Get("filesystem_encoding")
。Py_FileSystemDefaultEncodeErrors
:请改用PyConfig.filesystem_errors
或PyConfig_Get("filesystem_errors")
。Py_UTF8Mode
:请改用PyPreConfig.utf8_mode
或PyConfig_Get("utf8_mode")
。(请参阅Py_PreInitialize()
)
应使用
Py_InitializeFromConfig()
API 与PyConfig
一起设置这些选项。或者,可以使用PyConfig_Get()
在运行时获取这些选项。
计划在 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()
。
可以使用 pythoncapi-compat 项目 在 Python 3.13 及更早版本中获得这些新的公共函数。(由 Victor Stinner 在 gh-128863 中贡献。)
计划在未来版本中移除¶
以下 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