socket

新增的 socket.getblocking() 方法会在套接字处于阻塞模式时返回 True,否则返回 False。 (由 Yury Selivanov 在 bpo-32373 [https://bugs.python.org/issue?@action=redirect&bpo=32373] 中贡献。)

新的 socket.close() 函数可关闭所传入的套接字文件描述符。 应该用此函数来代替 os.close() 以获得更好的跨平台兼容性。 (由 Christian Heimes 在 bpo-32454 [https://bugs.python.org/issue?@action=redirect&bpo=32454] 中贡献。)

socket 模块现在会公开 socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37) 以及 socket.TCP_NOTSENT_LOWAT (Linux 3.12) 常量。 (由 Omar Sandoval 在 bpo-26273 [https://bugs.python.org/issue?@action=redirect&bpo=26273] 以及 Nathaniel J. Smith 在 bpo-29728 [https://bugs.python.org/issue?@action=redirect&bpo=29728] 中贡献。)

已增加对 socket.AF_VSOCK 套接字的支持以允许在虚拟机及其宿主机之间进行通信。 (由 Cathy Avery 在 bpo-27584 [https://bugs.python.org/issue?@action=redirect&bpo=27584] 中贡献。)

套接字现在默认会根据文件描述符自动检测所属族、类型和协议。 (由 Christian Heimes 在 bpo-28134 [https://bugs.python.org/issue?@action=redirect&bpo=28134] 中贡献。)

socketserver

socketserver.ThreadingMixIn.server_close() 现在会等待所有非守护线程完成。 socketserver.ForkingMixIn.server_close() 现在会等待所有子进程完成。

socketserver.ForkingMixInsocketserver.ThreadingMixIn 类增加了新的 socketserver.ForkingMixIn.block_on_close 类属性。 该类属性值设为 False 以保持 3.7 之前的行为。

sqlite3

现在当下层的 SQLite 库版本为 3.6.11 及以上时 sqlite3.Connection 会开放 backup() 方法。 (由 Lele Gaifax 在 bpo-27645 [https://bugs.python.org/issue?@action=redirect&bpo=27645] 中贡献。)

sqlite3.connect()database 参数现在接受任何 path-like object,而不是只接受字符串。 (由 Anders Lorentsen 在 bpo-31843 [https://bugs.python.org/issue?@action=redirect&bpo=31843] 中贡献。)

ssl

ssl 模块现在使用 OpenSSL 的内置 API 代替 match_hostname() 来检查主机名或 IP 地址。 值的验证会在 TLS 握手期间进行。 任何证书验证错误包括主机名检查失败现在将引发 SSLCertVerificationError 并使用正确的 TLS Alert 消息中止握手过程。 这个新异常包含有额外的信息。 主机名验证可通过 SSLContext.hostname_checks_common_name 进行自定义。 (由 Christian Heimes 在 bpo-31399 [https://bugs.python.org/issue?@action=redirect&bpo=31399] 中贡献。)

备注

改进的主机名检测需要有兼容 OpenSSL 1.0.2 或 1.1 的 libssl 实现。 因此,OpenSSL 0.9.8 和 1.0.1 不再被支持(请参阅 平台支持的移除 了解详情)。 目前 ssl 模块主要兼容 LibreSSL 2.7.2 及更高版本。

ssl 模块不再以 SNI TLS 扩展发送 IP 地址。 (由 Christian Heimes 在 bpo-32185 [https://bugs.python.org/issue?@action=redirect&bpo=32185] 中贡献。)

match_hostname() 不再支持部分通配符例如 www*.example.org。 (由 Mandeep Singh 在 bpo-23033 [https://bugs.python.org/issue?@action=redirect&bpo=23033] 以及 Christian Heimes 在 bpo-31399 [https://bugs.python.org/issue?@action=redirect&bpo=31399] 中贡献。)

ssl 模块默认的加密套件选择现在是使用黑名单方式而非硬编码的白名单。 Python 不会再重新启用已经被 OpenSSL 安全更新所阻止的加密。 默认的加密套件选择可以在编译时进行配置。 (由 Christian Heimes 在 bpo-31429 [https://bugs.python.org/issue?@action=redirect&bpo=31429] 中贡献。)

现在已支持包含国际化域名 (IDN) 的服务器证书验证。 作为此更改的一部分,SSLSocket.server_hostname 属性现在会以预期的 A 标签形式 ("xn--pythn-mua.org") 而不是以 U 标签形式 ("pythön.org") 存储。 (由 Nathaniel J. Smith 与 Christian Heimes 在 bpo-28414 [https://bugs.python.org/issue?@action=redirect&bpo=28414] 中贡献。)

ssl 模块对 TLS 1.3 和 OpenSSL 1.1.1 具有初步和实验性的支持。 在 Python 3.7.0 发布的时刻,OpenSSL 1.1.1 仍在开发中,而 TLS 1.3 尚未最终确定。 TLS 1.3 握手和协议行为与 TLS 1.2 及更早的版本略有差异,请参阅 TLS 1.3。 (由 Christian Heimes 在 bpo-32947 [https://bugs.python.org/issue?@action=redirect&bpo=32947], bpo-20995 [https://bugs.python.org/issue?@action=redirect&bpo=20995], bpo-29136 [https://bugs.python.org/issue?@action=redirect&bpo=29136], bpo-30622 [https://bugs.python.org/issue?@action=redirect&bpo=30622] 以及 bpo-33618 [https://bugs.python.org/issue?@action=redirect&bpo=33618] 中贡献。)

SSLSocketSSLObject 不再具有公共构造器。 直接实例化从未成为有文档和受支持的特性。 实际必须通过 SSLContext 的方法 wrap_socket()wrap_bio() 来创建。 (由 Christian Heimes 在 bpo-32951 [https://bugs.python.org/issue?@action=redirect&bpo=32951] 中贡献。)

用于设置最小和最大 TLS 协议版本的 OpenSSL 1.1 API 现已可用,名称分别为 SSLContext.minimum_versionSSLContext.maximum_version。 受支持的协议由几个新增旗标指定,例如 HAS_TLSv1_1。 (由 Christian Heimes 在 bpo-32609 [https://bugs.python.org/issue?@action=redirect&bpo=32609] 中贡献。)

增加了 ssl.SSLContext.post_handshake_auth 以启用并通过 ssl.SSLSocket.verify_client_post_handshake() 来初始化 TLS 1.3 握手后验证。 (由 Christian Heimes 在 gh-78851 [https://github.com/python/cpython/issues/78851] 中贡献。)

string

string.Template 现在允许你有选择地分别修改带大括号的占位符和不带大括号的占位符所对应的正则表达式模式。 (由 Barry Warsaw 在 bpo-1198569 [https://bugs.python.org/issue?@action=redirect&bpo=1198569] 中贡献。)

subprocess

subprocess.run() 函数接受新的 capture_output 关键字参数。 当其为真值时,将会捕获 stdout 和 stderr。 这等价于传入 subprocess.PIPE 作为 stdoutstderr 参数。 (由 Bo Bayles 在 bpo-32102 [https://bugs.python.org/issue?@action=redirect&bpo=32102] 中贡献。).) subprocess.run 函数和 subprocess.Popen 构造器现在接受 text 关键字参数作为 universal_newlines 的别名。 (由 Andrew Clegg 在 bpo-31756 [https://bugs.python.org/issue?@action=redirect&bpo=31756] 中贡献。)

在 Windows 中当重定向标准句柄时 close_fds 的默认值由 False 改为 True。 现在可以在重定向标准句柄时将 close_fds 设为真值。 参阅 subprocess.Popen。 这意味着现在 close_fds 在所有受支持的平台上默认值均为 True。 (由 Segev Finer 在 bpo-19764 [https://bugs.python.org/issue?@action=redirect&bpo=19764] 中贡献。)

subprocess.call(), subprocess.run() 期间或在 Popen 上下文管理器中,subprocess 模块现在能更优雅地处理 KeyboardInterrupt。 它现在会等待一小段时间以便子进程退出,然后再继续处理 KeyboardInterrupt 异常。 (由 Gregory P. Smith 在 bpo-25942 [https://bugs.python.org/issue?@action=redirect&bpo=25942] 中贡献。)

sys

新增 sys.breakpointhook() 钩子函数,供内置的 breakpoint() 进行调用。 (由 Barry Warsaw 在 bpo-31353 [https://bugs.python.org/issue?@action=redirect&bpo=31353] 中贡献。)

在 Android 中新增的 sys.getandroidapilevel() 会返回构建时的 Android API 版本。 (由 Victor Stinner 在 bpo-28740 [https://bugs.python.org/issue?@action=redirect&bpo=28740] 中贡献。)

新的 sys.get_coroutine_origin_tracking_depth() 函数会返回当前协程的由新的 sys.set_coroutine_origin_tracking_depth() 所设定的原始跟踪深度。 asyncio 已转换为使用这个新 API 代替已弃用的 sys.set_coroutine_wrapper()。 (由 Nathaniel J. Smith 在 bpo-32591 [https://bugs.python.org/issue?@action=redirect&bpo=32591] 中贡献。)

time

PEP 564 [https://peps.python.org/pep-0564/] 向 time 模块增加六个具有纳秒级精度的新函数:

增加了新的时钟标识符:

新的 time.thread_time()time.thread_time_ns() 函数可用于获取每线程的 CPU 时间度量。 (由 Antoine Pitrou 在 bpo-32025 [https://bugs.python.org/issue?@action=redirect&bpo=32025] 中贡献。)

新的 time.pthread_getcpuclockid() 函数会返回特定线程中 CPU 时钟的时钟 ID。

tkinter

新的 tkinter.ttk.Spinbox 类现已可用。 (由 Alan Moore 在 bpo-32585 [https://bugs.python.org/issue?@action=redirect&bpo=32585] 中贡献。)

tracemalloc

tracemalloc.Traceback 的行为更接近正规的回溯,会对所有帧按从最旧到最新来排序。 Traceback.format() 现在接受负的 limit,并会将结果截短至排在第 abs(limit) 位的旧帧。 如果要获得旧的行为,请在 Traceback.format() 中使用新的 most_recent_first 参数。 (由 Jesse Bakker 在 bpo-32121 [https://bugs.python.org/issue?@action=redirect&bpo=32121] 中贡献。)

types

新的 WrapperDescriptorType, MethodWrapperType, MethodDescriptorTypeClassMethodDescriptorType 类现已可用。 (由 Manuel Krebber 和 Guido van Rossum 在 bpo-29377 [https://bugs.python.org/issue?@action=redirect&bpo=29377] 以及 Serhiy Storchaka 在 bpo-32265 [https://bugs.python.org/issue?@action=redirect&bpo=32265] 中贡献。)

新的 types.resolve_bases() 函数会以 PEP 560 [https://peps.python.org/pep-0560/] 所规定的方式动态解析 MRO 条目。 (由 Ivan Levkivskyi 在 bpo-32717 [https://bugs.python.org/issue?@action=redirect&bpo=32717] 中贡献。)

unicodedata

内部 unicodedata 数据库已升级为使用 Unicode 11 [https://www.unicode.org/versions/Unicode11.0.0/]。 (由 Benjamin Peterson 贡献。)

unittest

新的 -k 命令行选项允许通过名称子字符串或类似于 Unix shell 的模式来筛选测试项。 例如,python -m unittest -k foo 将运行 foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo,但不会运行 bar_tests.FooTest.test_something。 (由 Jonas Haag 在 bpo-32071 [https://bugs.python.org/issue?@action=redirect&bpo=32071] 中贡献。)

unittest.mock

现在 sentinel 属性会在它们被 复制封存 时保存其标识。 (由 Serhiy Storchaka 在 bpo-20804 [https://bugs.python.org/issue?@action=redirect&bpo=20804] 中贡献。)

新的 seal() 函数允许 Mock 对实例进行密封,这将禁止进一步创建属性模拟。 密封会以递归方式应用于自身模拟的所有属性。 (由 Mario Corchero 在 bpo-30541 [https://bugs.python.org/issue?@action=redirect&bpo=30541] 中贡献。)

urllib.parse

urllib.parse.quote() 已经从 RFC 2396 [https://datatracker.ietf.org/doc/html/rfc2396.html] 更新为 RFC 3986 [https://datatracker.ietf.org/doc/html/rfc3986.html],将 ~ 添加到默认情况下从未引用的字符集。 (由 Christian Theune 和 Ratnadeep Debnath 在 bpo-16285 [https://bugs.python.org/issue?@action=redirect&bpo=16285] 中贡献。)

uu

现在 uu.encode() 函数接受可选的 backtick 关键字参数。 当其为真时,零会以 '`' 而非空格来表示。 (由 Xiang Zhang 在 bpo-30103 [https://bugs.python.org/issue?@action=redirect&bpo=30103] 中贡献。)

uuid

新的 UUID.is_safe 属性会从平台中继有关是否使用多进程安全模式来生成所需 UUID 的信息。 (由 Barry Warsaw 在 bpo-22807 [https://bugs.python.org/issue?@action=redirect&bpo=22807] 中贡献。)

uuid.getnode() 现在更倾向于统一管理的 MAC 地址而不是本地管理的 MAC 地址。 这样可以更好地保证从 uuid.uuid1() 返回的 UUID 的全局唯一性。 如果只有本地管理的 MAC 地址可用,则返回首个找到的此类地址。 (由 Barry Warsaw 在 bpo-32107 [https://bugs.python.org/issue?@action=redirect&bpo=32107] 中贡献。)

warnings

默认警告过滤器的初始化已进行以下更改:

  • 通过命令行选项(包括 -b 以及新的 CPython 专属的 -X dev 选项)启用的警告总是会通过 sys.warnoptions 属性被传递给警告机制。

  • 通过命令行或环境变量启用的警告过滤器现在具有以下优先顺序:

    • 用于 -b (或 -bb) 的 BytesWarning 过滤器

    • 通过 -W 选项指定的任何过滤器

    • 通过 PYTHONWARNINGS 环境变量指定的任何过滤器

    • 任何其他 CPython 专属过滤器(例如 -X dev 模式中新增的 default 过滤器)

    • 由警告机制所定义的任何隐式过滤器

  • CPython 调试版本 中,现在默认情况下会显示所有警告(隐式过滤器列表为空)

(由 Nick Coghlan 和 Victor Stinner 在 bpo-20361 [https://bugs.python.org/issue?@action=redirect&bpo=20361], bpo-32043 [https://bugs.python.org/issue?@action=redirect&bpo=32043] 以及 bpo-32230 [https://bugs.python.org/issue?@action=redirect&bpo=32230] 中贡献。)

在单文件脚本和交互式提示符中,默认情况下会再次显示已弃用警告。 详情参见 PEP 565: 在 main 中显示 DeprecationWarning。 (由 Nick Coghlan 在 bpo-31975 [https://bugs.python.org/issue?@action=redirect&bpo=31975] 中贡献。)

xml

作为对 DTD 和外部实体检查的缓解,在默认情况下 xml.dom.minidomxml.sax 模块将不再处理外部实体。 (由 Christian Heimes 在 gh-61441 [https://github.com/python/cpython/issues/61441] 中贡献。)

xml.etree

find() 方法中的 ElementPath 描述词现在可以将当前节点文本与 [. = "text"] 进行比较,而不仅是子节点中的文本。 描述词还允许添加空格以提高可读性。 (由 Stefan Behnel 在 bpo-31648 [https://bugs.python.org/issue?@action=redirect&bpo=31648] 中贡献。)

xmlrpc.server

SimpleXMLRPCDispatcher.register_function 现在可以被用作装饰器。 (由 Xiang Zhang 在 bpo-7769 [https://bugs.python.org/issue?@action=redirect&bpo=7769] 中贡献。)

zipapp

函数 create_archive() 现在接受可选的 filter 参数,以允许用户选择哪些文件应被加入归档包。 (由 Irmen de Jong 在 bpo-31072 [https://bugs.python.org/issue?@action=redirect&bpo=31072] 中贡献。)

函数 create_archive() 现在接受可选的 compressed 参数,以生成压缩归档包。 另外也加入了命令行选项 --compress 以支持压缩。 (由 Zhiming Wang 在 bpo-31638 [https://bugs.python.org/issue?@action=redirect&bpo=31638] 中贡献。)

zipfile

ZipFile 现在接受新的 compresslevel 形参,以控制压缩级别。 (由 Bo Bayles 在 bpo-21417 [https://bugs.python.org/issue?@action=redirect&bpo=21417] 中贡献。)

ZipFile 所创建的归档包中的子目录现在会按字母表顺序保存。 (由 Bernhard M. Wiedemann 在 bpo-30693 [https://bugs.python.org/issue?@action=redirect&bpo=30693] 中贡献。)

C API 的改变

已实现了用于线程本地存储的新 API。 相关概述请参阅 PEP 539: 用于线程局部存储的新 C API,完整参考文档请查看 线程专属存储 (TSS) API。 (由 Masayuki Yamamoto 在 bpo-25658 [https://bugs.python.org/issue?@action=redirect&bpo=25658] 中贡献。) 新的 上下文变量 功能开放了许多 新的 C API

新的 PyImport_GetModule() 函数会返回之前所导入的具有给定名称的模块。 (由 Eric Snow 在 bpo-28411 [https://bugs.python.org/issue?@action=redirect&bpo=28411] 中贡献。)

新的 Py_RETURN_RICHCOMPARE 宏可以简化丰富比较函数的编写。 (由 Petr Victorin 在 bpo-23699 [https://bugs.python.org/issue?@action=redirect&bpo=23699] 中贡献。)

新的 Py_UNREACHABLE 宏可用于标记不可到达的代码路径。 (由 Barry Warsaw 在 bpo-31338 [https://bugs.python.org/issue?@action=redirect&bpo=31338] 中贡献。)

tracemalloc 现在通过新的 PyTraceMalloc_Track()PyTraceMalloc_Untrack() 函数公开了一个 C API。 (由 Victor Stinner 在 bpo-30054 [https://bugs.python.org/issue?@action=redirect&bpo=30054] 中贡献。)

新的 import__find__load__start()import__find__load__done() 静态标记可用于跟踪模块导入。 (由 Christian Heimes 在 bpo-31574 [https://bugs.python.org/issue?@action=redirect&bpo=31574] 中贡献。)

结构体 PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Descwrapperbase 的字段 namedoc 现在的类型为 const char * 而不是 char *。 (由 Serhiy Storchaka 在 bpo-28761 [https://bugs.python.org/issue?@action=redirect&bpo=28761] 中贡献。)

PyUnicode_AsUTF8AndSize()PyUnicode_AsUTF8() 的结果类型现在是 const char * 而非 char *。 (由 Serhiy Storchaka 在 bpo-28769 [https://bugs.python.org/issue?@action=redirect&bpo=28769] 中贡献。)

PyMapping_Keys(), PyMapping_Values()PyMapping_Items() 的结果现在肯定是列表,而非可能是列表也可能是元组。 (由 Oren Milman 在 bpo-28280 [https://bugs.python.org/issue?@action=redirect&bpo=28280] 中贡献。)

添加了函数 PySlice_Unpack()PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在 bpo-27867 [https://bugs.python.org/issue?@action=redirect&bpo=27867] 中贡献。)

PyOS_AfterFork() 已弃用,建议改用新的 functions PyOS_BeforeFork(), PyOS_AfterFork_Parent()PyOS_AfterFork_Child()。 (由 Antoine Pitrou 在 bpo-16500 [https://bugs.python.org/issue?@action=redirect&bpo=16500] 中贡献。)

曾经作为公共 API 一部分的 PyExc_RecursionErrorInst 单例已被移除,因为它的成员永远不会被清理,可能在解释器的最终化过程中导致段错误。 由 Xavier de Gaye 在 bpo-22898 [https://bugs.python.org/issue?@action=redirect&bpo=22898] 和 bpo-30697 [https://bugs.python.org/issue?@action=redirect&bpo=30697] 中贡献。

添加 C API 对使用 timezone 的构造器 PyTimeZone_FromOffset()PyTimeZone_FromOffsetAndName() 的时区的支持,以及通常 PyDateTime_TimeZone_UTC 使用 UTC 单例。 由 Paul Ganssle 在 bpo-10381 [https://bugs.python.org/issue?@action=redirect&bpo=10381] 中贡献。

PyThread_start_new_thread()PyThread_get_thread_ident() 的结果类型以及 PyThreadState_SetAsyncExc()id 形参类型由 long 改为 unsigned long。 (由 Serhiy Storchaka 在 bpo-6532 [https://bugs.python.org/issue?@action=redirect&bpo=6532] 中贡献。)

现在 PyUnicode_AsWideCharString() 在第二个参数为 NULL 且 wchar_t* 字符串包含空字符时会引发 ValueError。 (由 Serhiy Storchaka 在 bpo-30708 [https://bugs.python.org/issue?@action=redirect&bpo=30708] 中贡献。)

对启动顺序以及动态内存分配器管理的更改意味着早已记录在案的,对在调用大多数 C API 函数之前调用 Py_Initialize() 的要求的依赖现在变得更加强烈,未遵循此要求可能导致嵌入式应用程序中的段错误。 请参阅此文档的 移植到 Python 3.7 一节以及 C API 文档的 在Python初始化之前 一节了解更多细节。

新的 PyInterpreterState_GetID() 会返回给定解释器的唯一 ID。 (由 Eric Snow 在 bpo-29102 [https://bugs.python.org/issue?@action=redirect&bpo=29102] 中贡献。)

现在当启用 UTF-8 模式Py_DecodeLocale(), Py_EncodeLocale() 会使用 UTF-8 编码。 (由 Victor Stinner 在 bpo-29240 [https://bugs.python.org/issue?@action=redirect&bpo=29240] 中贡献。)

PyUnicode_DecodeLocaleAndSize()PyUnicode_EncodeLocale() 现在会为 surrogateescape 错误句柄使用当前区域编码。 (由 Victor Stinner 在 bpo-29240 [https://bugs.python.org/issue?@action=redirect&bpo=29240] 中贡献。)

PyUnicode_FindChar()startend 形参的行为现在调整为与字符串切片类似。 (由 Xiang Zhang 在 bpo-28822 [https://bugs.python.org/issue?@action=redirect&bpo=28822] 中贡献。)

构建的改变

对于 --without-threads 构建的支持已被移除。 threading 模块现在将总是可用。 (由 Antoine Pitrou 在 bpo-31370 [https://bugs.python.org/issue?@action=redirect&bpo=31370] 中贡献。)

在非 OSX UNIX 平台上已不再包含用于构建 _ctypes 模块的完整 libffi 副本。 现在当在此类平台上构建 _ctypes 时需要事先装有 libffi 的副本。 (由 Zachary Ware 在 bpo-27979 [https://bugs.python.org/issue?@action=redirect&bpo=27979] 中贡献。)

Windows 构建过程不再依赖 Subversion 来拉取外部源码,而是改用一段 Python 脚本从 GitHub 下载 zip 文件。 如果未在系统中找到 Python 3.6 (通过 py -3.6),则会使用 NuGet 下载一份 32 位的 Python 副本用于此目的。 (由 Zachary Ware 在 bpo-30450 [https://bugs.python.org/issue?@action=redirect&bpo=30450] 中贡献。)

ssl 模块需要兼容 OpenSSL 1.0.2 或 1.1 的 libssl。 OpenSSL 1.0.1 的生命期已于 2016-12-31 终止且不再受支持。 LibreSSL 暂时也不受支持。 LibreSSL 发布版直到 2.6.4 版还缺少所需的 OpenSSL 1.0.2 API。

性能优化

通过移植更多代码来使用 METH_FASTCALL 的约定,可以显著地减少调用 C 代码中实现的各类标准库的很多方法的开销。 (由 Victor Stinner 在 bpo-29300 [https://bugs.python.org/issue?@action=redirect&bpo=29300]、[bpo-29507](https://bugs.python.org/issue?@action=redirect&bpo=29507) [https://bugs.python.org/issue?@action=redirect&bpo=29507]、[bpo-29452](https://bugs.python.org/issue?@action=redirect&bpo=29452) [https://bugs.python.org/issue?@action=redirect&bpo=29452] 以及 bpo-29286 [https://bugs.python.org/issue?@action=redirect&bpo=29286] 中贡献。)

通过各种优化方式,使 Python 在 Linux 上的启动时间缩短了 10%,在 macOS 上缩短了 30%。 (由 Victor Stinner, INADA Naoki 在 bpo-29585 [https://bugs.python.org/issue?@action=redirect&bpo=29585] 中,以及 Ivan Levkivskyi 在 bpo-31333 [https://bugs.python.org/issue?@action=redirect&bpo=31333] 中贡献。)

由于避免创建绑定方法案例的字节码更改,方法调用速度现在加快了 20%。 (由 Yury Selivanov 和 INADA Naoki 在 bpo-26110 [https://bugs.python.org/issue?@action=redirect&bpo=26110] 中贡献。)

asyncio 模块里面的一些常用函数做了显著的性能优化。

作为 PEP 560 工作 的结果,typing 的导入时间已减少了 7 倍,许多与类型相关的操作现在会执行得更快。 (由 Ivan Levkivskyi 在 bpo-32226 [https://bugs.python.org/issue?@action=redirect&bpo=32226] 中贡献。)

sorted()list.sort() 已经过优化,在通常情况下执行速度可提升 40-75%。 (由 Elliot Gorokhovsky 在 bpo-28685 [https://bugs.python.org/issue?@action=redirect&bpo=28685] 中贡献。)

dict.copy() 的执行速度现在加快了 5.5 倍。 (由 Yury Selivanov 在 bpo-31179 [https://bugs.python.org/issue?@action=redirect&bpo=31179] 中贡献。)

name 未找到并且 obj 未重载 object.__getattr__()object.__getattribute__()hasattr()getattr() 现在会比原来快大约 4 倍。 (由 INADA Naoki 在 bpo-32544 [https://bugs.python.org/issue?@action=redirect&bpo=32544] 中贡献。)

在字符串中搜索特定的 Unicode 字符(例如乌克兰语字母“Є”)会比搜索其他字符慢上 25 倍。 而现在最坏情况下也只会慢上 3 倍。 (由 Serhiy Storchaka 在 bpo-24821 [https://bugs.python.org/issue?@action=redirect&bpo=24821] 中贡献。)

collections.namedtuple() 工厂对象已经重写实现,使得创建具名元组的速度加快了 4 到 6 倍。 (由 Jelle Zijlstra 在 bpo-28638 [https://bugs.python.org/issue?@action=redirect&bpo=28638] 中贡献,进一步的改进由 INADA Naoki, Serhiy Storchaka 和 Raymond Hettinger 贡献。)

现在 date.fromordinal()date.fromtimestamp() 在通常情况下执行速度可提升 30%。 (由 Paul Ganssle 在 bpo-32403 [https://bugs.python.org/issue?@action=redirect&bpo=32403] 中贡献。)

由于使用了 os.scandir(),现在 os.fwalk() 函数执行速度提升了 2 倍。 (由 Serhiy Storchaka 在 bpo-25996 [https://bugs.python.org/issue?@action=redirect&bpo=25996] 中贡献。)

由于使用了 os.scandir() 函数,shutil.rmtree() 函数的执行速度已经提升了 20—40%。 (由 Serhiy Storchaka 在 bpo-28564 [https://bugs.python.org/issue?@action=redirect&bpo=28564] 中贡献。)

正则表达式 忽略大小写的匹配和搜索已获得优化。 现在搜索某些模式的速度提升了 20 倍。 (由 Serhiy Storchaka 在 bpo-30285 [https://bugs.python.org/issue?@action=redirect&bpo=30285] 中贡献。)

re.compile() 现在会将 flags 形参转换为 int 对象,如果它是 RegexFlag 的话。 它现在会和 Python 3.5 一样快,而比 Python 3.6 快大约 10%,实际速度取决于具体的模式。 (由 INADA Naoki 在 bpo-31671 [https://bugs.python.org/issue?@action=redirect&bpo=31671] 中贡献。)

selectors.EpollSelector, selectors.PollSelectorselectors.DevpollSelector 这几个类的 modify() 方法在重负载下可以加快 10% 左右。 (由 Giampaolo Rodola' 在 bpo-30014 [https://bugs.python.org/issue?@action=redirect&bpo=30014] 中贡献。)

常量折叠已经从窥孔优化器迁移至新的 AST 优化器,后者可以以更高的一致性来执行优化。 (由 Eugene Toder 和 INADA Naoki 在 bpo-29469 [https://bugs.python.org/issue?@action=redirect&bpo=29469] 和 bpo-11549 [https://bugs.python.org/issue?@action=redirect&bpo=11549] 中贡献。)

abc 中的大部分函数和方法已经用 C 重写。 这使得创建抽像基类以及调用其 isinstance()issubclass() 的速度加快了 1.5 倍。 这也使得 Python 启动耗时减少了 10%。 (由 Ivan Levkivskyi 和 INADA Naoki 在 bpo-31333 [https://bugs.python.org/issue?@action=redirect&bpo=31333] 中贡献。)

在不构造子类时,通过使用快速路径构造器使得 datetime.datedatetime.datetime 的替代构造器获得了显著的速度提升。 (由 Paul Ganssle 在 bpo-32403 [https://bugs.python.org/issue?@action=redirect&bpo=32403] 中贡献。)

在特定情况下 array.array 实例的比较速度已获得很大提升。 现在当比较存放相同的整数类型的值的数组时会比原来快 10 到 70 倍。 (由 Adrian Wielgosik 在 bpo-24700 [https://bugs.python.org/issue?@action=redirect&bpo=24700] 中贡献。)

在大多数平台上 math.erf()math.erfc() 函数现在使用(更快的)C 库实现。 (由 Serhiy Storchaka 在 bpo-26121 [https://bugs.python.org/issue?@action=redirect&bpo=26121] 中贡献。)

其他 CPython 实现的改变

已弃用的 Python 行为

在推导式和生成器表达式中的 yield 语句(包括 yieldyield from 子句)现在已弃用(最左端的 for 子句中的可迭代对象表达式除外)。 这确保了推导式总是立即返回适当类型的容器(而不是有可能返回 generator iterator 对象),这样生成器表达式不会试图将它们的隐式输出与任何来自显式 yield 表达式的输出交错起来。 在 Python 3.7 中,这样的表达式会在编译时引发 DeprecationWarning,在 Python 3.8 中则将引发 SyntaxError。 (由 Serhiy Storchaka 在 bpo-10544 [https://bugs.python.org/issue?@action=redirect&bpo=10544] 中贡献。)

object.__complex__() 返回一个 complex 的子类的行为已弃用并将在未来的 Python 版本中引发错误。 这使得 __complex__() 的行为与 object.__int__()object.__float__() 保持一致。 (由 Serhiy Storchaka 在 bpo-28894 [https://bugs.python.org/issue?@action=redirect&bpo=28894] 中贡献。)

已弃用的 Python 模块、函数和方法

aifc

aifc.openfp() 已被弃用并将在 Python 3.9 中移除。 请改用 aifc.open()。 (由 Brian Curtin 在 bpo-31985 [https://bugs.python.org/issue?@action=redirect&bpo=31985] 中贡献。)

asyncio

asyncio.Lock 和其他 asyncio 同步原语的 await 实例的直接支持已弃用。 想要获取并释放同步资源必须使用异步上下文管理器。 (由 Andrew Svetlov 在 bpo-32253 [https://bugs.python.org/issue?@action=redirect&bpo=32253] 中贡献。)

asyncio.Task.current_task()asyncio.Task.all_tasks() 方法已被弃用。 (由 Andrew Svetlov 在 bpo-32250 [https://bugs.python.org/issue?@action=redirect&bpo=32250] 中贡献。)

collections

在 Python 3.8 中,collections.abc 内的抽象基类将不会再通过常规的 collections 模块公开。 这有助于更清晰地区别具体类与抽象基类。 (由 Serhiy Storchaka 在 bpo-25988 [https://bugs.python.org/issue?@action=redirect&bpo=25988] 中贡献。)

dbm

dbm.dumb 现在支持读取只读文件,且当其未被更改时不会再写入索引文件。 现在如果索引文件丢失并在 'r''w' 模式下被重新创建,则会发出已弃用警告(在未来的 Python 发布版中将改为错误)。 (由 Serhiy Storchaka 在 bpo-28847 [https://bugs.python.org/issue?@action=redirect&bpo=28847] 中贡献。)

enum

在 Python 3.8 中,尝试在 Enum 类中检查非 Enum 对象将引发 TypeError (例如 1 in Color);类似地,尝试在 Flag 成员中检查非 Flag 对象也将引发 TypeError (例如 1 in Perm.RW);目前,两种操作均会返回 False。 (由 Ethan Furman 在 bpo-33217 [https://bugs.python.org/issue?@action=redirect&bpo=33217] 中贡献。)

gettext

使用非整数值在 gettext 中选择复数形式现在已弃用。 它从未正确地发挥作用。 (由 Serhiy Storchaka 在 bpo-28692 [https://bugs.python.org/issue?@action=redirect&bpo=28692] 中贡献。)

importlib

方法 MetaPathFinder.find_module() (被 MetaPathFinder.find_spec() 替代) 和 PathEntryFinder.find_loader() (被 PathEntryFinder.find_spec() 替代) 都已在 Python 3.4 中被弃用,现在会发出 DeprecationWarning。 (由 Matthias Bussonnier 在 bpo-29576 [https://bugs.python.org/issue?@action=redirect&bpo=29576] 中贡献。)

importlib.abc.ResourceLoader ABC 已弃用,推荐改用 importlib.abc.ResourceReader

locale

locale.format() 已弃用,请改用 locale.format_string()。 (由 Garvit 在 bpo-10379 [https://bugs.python.org/issue?@action=redirect&bpo=10379] 中贡献。)

macpath

macpath 现在已弃用,将在 Python 3.8 中被移除。 (由 Chi Hsuan Yen 在 bpo-9850 [https://bugs.python.org/issue?@action=redirect&bpo=9850] 中贡献。)

threading

dummy_threadingdummythread 已被弃用。 构建禁用线程的 Python 已不再可能。 请改用 threading。 (由 Antoine Pitrou 在 bpo-31370 [https://bugs.python.org/issue?@action=redirect&bpo=31370] 中贡献。)

socket

socket.htons()socket.ntohs() 中的静默参数截断已弃用。 在未来的 Python 版本中,如果传入的参数长度大于 16 比特位,将会引发异常。 (由 Oren Milman 在 bpo-28332 [https://bugs.python.org/issue?@action=redirect&bpo=28332] 中贡献。)

ssl

ssl.wrap_socket() 已弃用。 请改用 ssl.SSLContext.wrap_socket()。 (由 Christian Heimes 在 bpo-28124 [https://bugs.python.org/issue?@action=redirect&bpo=28124] 中贡献。)

sunau

sunau.openfp() 已被弃用并将在 Python 3.9 中移除。 请改用 sunau.open()。 (由 Brian Curtin 在 bpo-31985 [https://bugs.python.org/issue?@action=redirect&bpo=31985] 中贡献。)

sys

已弃用 sys.set_coroutine_wrapper()sys.get_coroutine_wrapper()

未写入文档的 sys.callstats() 函数已弃用并将在未来的 Python 版本中被移除。 (由 Victor Stinner 在 bpo-28799 [https://bugs.python.org/issue?@action=redirect&bpo=28799] 中贡献。)

wave

wave.openfp() 已弃用并将在 Python 3.9 中被移除。 请改用 wave.open()。 (由 Brian Curtin 在 bpo-31985 [https://bugs.python.org/issue?@action=redirect&bpo=31985] 中贡献。)

已弃用的 C API 函数和类型

如果 Py_LIMITED_API 未设定或设定为范围在 0x030504000x03060000 (不含) 之间,或为 0x03060100 或更高的值,函数 PySlice_GetIndicesEx() 已弃用并被一个宏所替代。 (由 Serhiy Storchaka 在 bpo-27867 [https://bugs.python.org/issue?@action=redirect&bpo=27867] 中贡献。)

PyOS_AfterFork() 已弃用。 请改用 PyOS_BeforeFork(), PyOS_AfterFork_Parent()PyOS_AfterFork_Child()。 (由 Antoine Pitrou 在 bpo-16500 [https://bugs.python.org/issue?@action=redirect&bpo=16500] 中贡献。)

平台支持的移除

  • 官方已不再支持 FreeBSD 9 及更旧的版本。

  • 为了完整的 Unicode 支持,包括在扩展模块之内,*nix 平台现在至少应当提供 C.UTF-8 (完整区域), C.utf8 (完整区域) 或 UTF-8 (LC_CTYPE 专属区域) 中的一个作为基于 ASCII 的传统 C 区域的替代。

  • OpenSSL 0.9.8 和 1.0.1 已不再受支持,这意味着在仍然使用这些版本的旧平台上构建带有 SSL/TLS 支持的 CPython 3.7 时,需要自定义构建选项以链接到更新的 OpenSSL 版本。

注意,此问题会影响到 Debian 8 (代号“jessie”) 和 Ubuntu 14.04 (代号“Trusty”) 等长期支持 Linux 发行版,因为它们默认仍然使用 OpenSSL 1.0.1。

Debian 9 (“stretch”) 和 Ubuntu 16.04 (“xenial”) 以及其他最新的长期支持 Linux 发行版 (例如 RHEL/CentOS 7.5, SLES 12-SP3) 都使用 OpenSSL 1.0.2 或更新的版本,因此继续在默认的构建配置中受到支持。

CPython 自己的 CI 配置文件 [https://github.com/python/cpython/blob/v3.7.13/.travis.yml] 提供了一个使用 CPython 测试套件中的 SSL 兼容性测试架构 [https://github.com/python/cpython/tree/3.13/Tools/ssl/multissltests.py] 基于 OpenSSL 1.1.0 而非系统所提供的过时 OpenSSL 进行构建和链接的例子。

API 与特性的移除

下列特性与 API 已从 Python 3.7 中移除:

  • os.stat_float_times() 函数已被移除。 它在 Python 2.3 中被引入用于向下兼容 Python 2.2,并自 Python 3.1 起就已弃用。

  • re.sub() 的替换模块中由 '\' 与一个 ASCII 字母构成的未知转义在 Python 3.5 中已弃用,现在将会引发错误。

  • tarfile.TarFile.add() 中移除了对 exclude 参数的支持。 它在 Python 2.7 和 3.2 中已弃用。 请改用 filter 参数。

  • ntpath.splitunc() 函数在 Python 3.1 中被弃用,现在已被移除。 请改用 splitdrive()

  • collections.namedtuple() 不再支持 verbose 形参或 _source 属性,该属性会显示为具名元组类所生成的源代码。 这是加速类创建的设计优化的一部分。 (由 Jelle Zijlstra 在 bpo-28638 [https://bugs.python.org/issue?@action=redirect&bpo=28638] 中贡献,进一步的改进由 INADA Naoki, Serhiy Storchaka 和 Raymond Hettinger 贡献。)

  • 函数 bool(), float(), list()tuple() 不再接受关键字参数。 int() 的第一个参数现在只能作为位置参数传入。

  • 移除了之前在 Python 2.4 中已弃用的 plistlib 模块的类 Plist, Dict_InternalDict。 作为函数 readPlist()readPlistFromBytes() 返回结果的 Dict 值现在为普通 dict。 你不能再使用属性访问来获取这些字典的项。

  • asyncio.windows_utils.socketpair() 函数已被移除。 请改用 socket.socketpair() 函数,它自 Python 3.5 起就在所有平台上可用。 asyncio.windows_utils.socketpair 在 Python 3.5 及更新版本上只是 socket.socketpair 的别名。

  • asyncio 不再将 selectors_overlapped 模块导出为 asyncio.selectorsasyncio._overlapped。 请将 from asyncio import selectors 替换为 import selectors

  • 现在已禁止直接实例化 ssl.SSLSocketssl.SSLObject 对象。 相应构造器从未写入文档、也从未作为公有构造器进行测试或设计。 用户应当使用 ssl.wrap_socket()ssl.SSLContext。 (由 Christian Heimes 在 bpo-32951 [https://bugs.python.org/issue?@action=redirect&bpo=32951] 中贡献。)

  • 未被使用的 distutils install_misc 命令已被移除。 (由 Eric N. Vander Weele 在 bpo-29218 [https://bugs.python.org/issue?@action=redirect&bpo=29218] 中贡献。)

移除的模块

fpectl 模块已被移除。 它从未被默认启用,从未在 x86-64 上正确发挥效果,并且它对 Python ABI 的改变会导致 C 扩展的意外损坏。 (由 Nathaniel J. Smith 在 bpo-29137 [https://bugs.python.org/issue?@action=redirect&bpo=29137] 中贡献。)

Windows 专属的改变

Python 启动器(py.exe)可以接受 32 位或 64 位标记而 不必 同时指定一个小版本。 因此 py -3-32py -3-64py -3.7-32 均为有效,并且现在还接受 -m-64 和 -m.n-64 来强制使用 64 位 python 命令,即使是本应使用 32 位的时候。 如果指定版本不可用则 py.exe 将报错退出。 (由 Steve Barnes 在 bpo-30291 [https://bugs.python.org/issue?@action=redirect&bpo=30291] 中贡献。)

启动器可以运行 py -0 来列出已安装的所有 python,默认版本会以星号标出。 运行 py -0p 将同时列出相应的路径。 如果运行 py 时指定了无法匹配的版本,它将显示 简短形式 的可用版本列表。 (由 Steve Barnes 在 bpo-30362 [https://bugs.python.org/issue?@action=redirect&bpo=30362] 中贡献。)

移植到 Python 3.7

本节列出了先前描述的更改以及可能需要更改代码的其他错误修正.

Python 行为的更改

  1. f(1 for x in [1],)
  2.  
  3. class C(1 for x in [1]):
  4. pass

现在 Python 3.7 会正确地引发 SyntaxError,因为生成器表达式总是必须直接包含于一对括号之内, 且前后都不能有逗号,仅在调用时可以忽略重复的括号。 (由 Serhiy Storchaka 在 bpo-32012 [https://bugs.python.org/issue?@action=redirect&bpo=32012] 和 bpo-32023 [https://bugs.python.org/issue?@action=redirect&bpo=32023] 中贡献。)

  • 现在当使用 -m 开关时,会将初始工作目录添加到 sys.path,而不再是一个空字符串(即在每次导入时动态地指明当前工作目录)。 任何会检测该空字符串,或是以其他方式依赖之前行为的的程序将需要进行相应的更新(例如改为还要检测 os.getcwd()os.path.dirname(__main__.__file__),具体做法首先要取决于为何要对代码执行空字符串检测)。

Python API 的变化

对于同时匹配空字符串和非空字符串的模式,在其他情况下搜索所有匹配的结果也可能会被更改。 例如在字符串 'a\n\n' 中,模式 r'(?m)^\s*?$' 将不仅会匹配位置 2 和 3 上的空字符串,还会匹配位置 2—3 上的字符串 '\n'。 想要只匹配空行,模式应当改写为 r'(?m)^[^\S\n]*$'

现在 re.sub() 会替换与前一个非空匹配相邻的空匹配。 例如 re.sub('x*', '-', 'abxd') 现在将返回 '-a-b--d-' 而不是 '-a-b-d-' ('b' 和 'd' 之间的第一个减号是替换 'x',而第二个减号是替换 'x' 和 'd' 之前的空字符串)。

(由 Serhiy Storchaka 在 bpo-25054 [https://bugs.python.org/issue?@action=redirect&bpo=25054] 和 bpo-32308 [https://bugs.python.org/issue?@action=redirect&bpo=32308] 中贡献。)

C API 的变化

函数 PySlice_GetIndicesEx() 被认为对于大小可变的序列来说并不安全。 如果切片索引不是 int 的实例,而是实现了 __index__() 方法的对象,则序列可以在其长度被传给 PySlice_GetIndicesEx() 之后调整大小。 这可能导致返回超出序列长度的索引号。 为了避免可能的问题,请使用新增的函数 PySlice_Unpack()PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在 bpo-27867 [https://bugs.python.org/issue?@action=redirect&bpo=27867] 中贡献。)

CPython 字节码的改变

新增两个操作码: LOAD_METHODCALL_METHOD。 (由 Yury Selivanov 和 INADA Naoki 在 bpo-26110 [https://bugs.python.org/issue?@action=redirect&bpo=26110] 中贡献。)

STORE_ANNOTATION 操作码已被移除。 (由 Mark Shannon 在 bpo-32550 [https://bugs.python.org/issue?@action=redirect&bpo=32550] 中贡献。)

Windows 专属的改变

用于覆盖 sys.path 的文件现在被命名为 ._pth 而不是 'sys.path'。 请参阅 查找模块 了解更多信息。 (由 Steve Dower 在 bpo-28137 [https://bugs.python.org/issue?@action=redirect&bpo=28137] 中贡献。)

其他 CPython 实现的改变

为了准备在未来对公开的 CPython 运行时初始化 API 进行潜在更改(请参阅 PEP 432 [https://peps.python.org/pep-0432/] 获取最初但略为过时的文稿),CPython 内部的启动和配置管理逻辑已经过大幅重构。 虽然这些更新旨在对嵌入式应用程序和常规的 CPython CLI 用户都完全透明,但它们在这里被提及是因为重构会改变解释器启动期间许多操作的内部顺序,因此可能提示出原先隐藏的缺陷,这可能存在于嵌入式应用程序中,或是在 CPython 自身内部。 (最初由 Nick Coghlan 和 Eric Snow 作为 bpo-22257 [https://bugs.python.org/issue?@action=redirect&bpo=22257] 的一部分贡献,并由 Nick, Eric 和 Victor Stinner 在一系列其他问题报告中进一步更新)。 已知会受到影响的一些细节:

  • 目前 PySys_AddWarnOptionUnicode() 对嵌入式应用程序不可用,因为在调用 Py_Initialize 之前需要创建一个 Unicode 对象。 请改用 PySys_AddWarnOption()

  • 嵌入式应用程序通过 PySys_AddWarnOption() 添加的警告过滤器现在应当以更高的一致性优先于由解释器所设置的过滤器

由于默认警告过滤器的配置方式发生了变化,将 Py_BytesWarningFlag 设置为大于一的值不再足以在发出 BytesWarning 消息的同时将其转换为异常。 而是改为必须设置旗标(以便首先发出警告),以及添加显式的 error::BytesWarning 警告过滤器来将其转换为异常。

由于编译器处理文档字符串的方式发生了变化,一个仅由文档字符串构成的函数体中隐式的 return None 现在被标记为在与文档字符串相同的行,而不是在函数的标题行。

当前异常状态已从帧对象移到协程对象。 这会简化解释器并修正由于在进入或退出生成器时具有交换异常状态而导致的一些模糊错误。 (由 Mark Shannon 在 bpo-25612 [https://bugs.python.org/issue?@action=redirect&bpo=25612] 中贡献。)

Python 3.7.1 中的重要变化

从 3.7.1 开始,Py_Initialize() 现在始终会读取并遵循与 Py_Main() 相同的环境设置(在更早的 Python 版本中,它会遵循一个错误定义的环境变量子集,而在 Python 3.7.0 中则会由于 bpo-34247 [https://bugs.python.org/issue?@action=redirect&bpo=34247] 而完全不读取它们)。 如果不想要此行为,请在调用 Py_Initialize() 之前将 Py_IgnoreEnvironmentFlag 设为 1。

在 3.7.1 中,上下文变量的 C API 已 获得更新 以使用 PyObject 指针。 另请参阅 bpo-34762 [https://bugs.python.org/issue?@action=redirect&bpo=34762]。

在 3.7.1 中,当提供不带末尾新行的输入时 tokenize 模块现在会隐式地添加 NEWLINE 形符。 此行为现在已与 C 词法分析器的内部行为相匹配。 (由 Ammar Askar 在 bpo-33899 [https://bugs.python.org/issue?@action=redirect&bpo=33899] 中贡献。)

Python 3.7.2 中的重要变化

在 3.7.2 中,Windows 下的 venv 不再复制原来的二进制文件,而是改为创建名为 python.exepythonw.exe 的重定向脚本。 这解决了一个长期存在的问题,即所有虚拟环境在每次 Python 升级后都必须进行升级或是重新创建。 然而,要注意此发布版仍然要求重新创建虚拟环境以获得新的脚本。

Python 3.7.6 中的重要变化

出于重要的安全性考量,asyncio.loop.create_datagram_endpoint()reuse_address 形参不再被支持。 这是由 UDP 中的套接字选项 SO_REUSEADDR 的行为导致的。 更多细节请参阅 loop.create_datagram_endpoint() 的文档。 (由 Kyle Stanley, Antoine Pitrou 和 Yury Selivanov 在 bpo-37228 [https://bugs.python.org/issue?@action=redirect&bpo=37228] 中贡献。。)

Python 3.7.10 中的重要变化

较早的 Python 版本允许同时使用 ;& 作为 urllib.parse.parse_qs()urllib.parse.parse_qsl() 中查询形参的分隔符。 出于安全考虑,并遵循新版的 W3C 建议,这已被更改为只允许一种分隔符,默认为 &。 这一改变也会影响 cgi.parse()cgi.parse_multipart() 因为它们在内部使用了受影响的函数。 要了解更多细节,请参阅相应的文档。 (由 Adam Goldschmidt, Senthil Kumaran 和 Ken Jin 在 bpo-42967 [https://bugs.python.org/issue?@action=redirect&bpo=42967] 中贡献。)

Python 3.7.11 中的重要变化

新的安全修正将 ftplib.FTP 的行为改成当设置被动数据通道时不信任远程服务器所发送的 IPv4 地址。 我们会改为重用 ftp 服务器的 IP 地址。 对于需要原先的行为的不常见代码,请在你的 FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (参见 gh-87451 [https://github.com/python/cpython/issues/87451]。)

在 URL 中存在换行符或制表符可能会导致某种形式的攻击。 根据更新了 RFC 3986 的 WHATWG 规范,解析器 urllib.parse() 将从 URL 中去除 ASCII 换行符 \n, \r 和制表符 \t 以防止这种攻击。 移除的字符将由一个新的模块层级变量 urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE 来控制。 (参见 gh-88048 [https://github.com/python/cpython/issues/88048]。)

3.7.14 中的重要安全特性

使用 2 (二进制), 4, 8 (八进制), 16 (十六进制) 或 32 以外的基数例如以 10 (十进制) 为基数在 intstr 之间进行转换现在如果字符串表示形式中的位数超过特定限制则会引发 ValueError 以避免因算法复杂度导致的拒绝服务攻击风险。 这是对于 CVE 2020-10735 [https://www.cve.org/CVERecord?id=CVE-2020-10735] 的一种缓解方案。 此限制可通过环境变量、命令行旗标或 sys API 来配置或者禁用。 参见 整数字符串转换长度限制 文档。 字符串形式的默认限制为 4300 位数字。