- socket
- socketserver
- sqlite3
- ssl
- string
- subprocess
- sys
- time
- tkinter
- tracemalloc
- types
- unicodedata
- unittest
- unittest.mock
- urllib.parse
- uu
- uuid
- warnings
- xml
- xml.etree
- xmlrpc.server
- zipapp
- zipfile
- C API 的改变
- 构建的改变
- 性能优化
- 其他 CPython 实现的改变
- 已弃用的 Python 行为
- 已弃用的 Python 模块、函数和方法
- 已弃用的 C API 函数和类型
- 平台支持的移除
- API 与特性的移除
- 移除的模块
- Windows 专属的改变
- 移植到 Python 3.7
- Python 3.7.1 中的重要变化
- Python 3.7.2 中的重要变化
- Python 3.7.6 中的重要变化
- Python 3.7.10 中的重要变化
- Python 3.7.11 中的重要变化
- 3.7.14 中的重要安全特性
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.ForkingMixIn
和 socketserver.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] 中贡献。)
SSLSocket
和 SSLObject
不再具有公共构造器。 直接实例化从未成为有文档和受支持的特性。 实际必须通过 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_version
和 SSLContext.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
作为 stdout 和 stderr 参数。 (由 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.CLOCK_BOOTTIME
(Linux): 与time.CLOCK_MONOTONIC
相似,不同之处在于它还包括任何系统挂起的时间。time.CLOCK_PROF
(FreeBSD, NetBSD 和 OpenBSD): 高精度的分进程 CPU 计时器。time.CLOCK_UPTIME
(FreeBSD, OpenBSD): 该时间的绝对值是系统运行且未挂起的时间,提供准确的正常运行时间度量。
新的 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
, MethodDescriptorType
和 ClassMethodDescriptorType
类现已可用。 (由 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.minidom
和 xml.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_Desc
和 wrapperbase
的字段 name
和 doc
现在的类型为 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()
的 start 和 end 形参的行为现在调整为与字符串切片类似。 (由 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
模块里面的一些常用函数做了显著的性能优化。
asyncio.get_event_loop()
函数已经改用 C 重新实现,使其执行速度加快了 15 倍。 (由 Yury Selivanov 在 bpo-32296 [https://bugs.python.org/issue?@action=redirect&bpo=32296] 中贡献。)asyncio.Future
回调管理已经过优化。 (由 Yury Selivanov 在 bpo-32348 [https://bugs.python.org/issue?@action=redirect&bpo=32348] 中贡献。)asyncio.gather()
的执行速度现在加快了 15%。 (由 Yury Selivanov 在 bpo-32355 [https://bugs.python.org/issue?@action=redirect&bpo=32355] 中贡献。)当 delay 参数为零或负值时
asyncio.sleep()
的执行速度现在加快了 2 倍。 (由 Andrew Svetlov 在 bpo-32351 [https://bugs.python.org/issue?@action=redirect&bpo=32351] 中贡献。)asyncio 调试模式的执行开销已获减轻。 (由 Antoine Pitrou 在 bpo-31970 [https://bugs.python.org/issue?@action=redirect&bpo=31970] 中贡献。)
作为 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.PollSelector
和 selectors.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.date
和 datetime.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 实现的改变
跟踪钩子现在可以选择不接收
line
而选择从解释器接收opcode
事件,具体做法是在被跟踪的帧上相应地设置新的f_trace_lines
和f_trace_opcodes
属性。 (由 Nick Coghlan 在 bpo-31344 [https://bugs.python.org/issue?@action=redirect&bpo=31344] 中贡献。)修复了一些命名空间包模块属性的一致性问题。 命名空间模块对象的
__file__
被设置为None
(原先未设置),对象的__spec__.origin
也被设置为None
(之前为字符串"namespace"
)。 参见 bpo-32305 [https://bugs.python.org/issue?@action=redirect&bpo=32305]。 而且,命名空间模块对象的__spec__.loader
被设置的值与__loader__
相同 (原先前者被设置为None
)。 参见 bpo-32303 [https://bugs.python.org/issue?@action=redirect&bpo=32303]。locals()
字典现在以变量定义的词法顺序显示。 原先未定义顺序。 (由 Raymond Hettinger 在 bpo-32690 [https://bugs.python.org/issue?@action=redirect&bpo=32690] 中贡献。)distutils
upload
命令不会再试图将行结束符 CR 改为 CRLF。 这修复了 sdists 的一个以与 CR 等价的字节结束的数据损坏问题。 (由 Bo Bayles 在 bpo-32304 [https://bugs.python.org/issue?@action=redirect&bpo=32304] 中贡献。)
已弃用的 Python 行为
在推导式和生成器表达式中的 yield 语句(包括 yield
和 yield 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_threading
和 dummythread
已被弃用。 构建禁用线程的 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
未设定或设定为范围在 0x03050400
和 0x03060000
(不含) 之间,或为 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.selectors
和asyncio._overlapped
。 请将from asyncio import selectors
替换为import selectors
。现在已禁止直接实例化
ssl.SSLSocket
和ssl.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-32
和 py -3-64
与 py -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 行为的更改
async
和await
现在是保留关键字。 使用了这些名称作为标识符的代码现在将引发SyntaxError
。 (由 Jelle Zijlstra 在 bpo-30406 [https://bugs.python.org/issue?@action=redirect&bpo=30406] 中贡献。)PEP 479 [https://peps.python.org/pep-0479/] 在 Python 3.7 中对所有代码启用,在协程和生成器中直接或间接引发的
StopIteration
异常会被转换为RuntimeError
异常。 (由 Yury Selivanov 在 bpo-32670 [https://bugs.python.org/issue?@action=redirect&bpo=32670] 中贡献。)object.__aiter__()
方法不再能被声明为异步的。 (由 Yury Selivanov 在 bpo-31709 [https://bugs.python.org/issue?@action=redirect&bpo=31709] 中贡献。)由于一个疏忽,之前的 Python 版本会错误地接受以下语法:
- f(1 for x in [1],)
- class C(1 for x in [1]):
- 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 的变化
socketserver.ThreadingMixIn.server_close()
现在会等待所有非守护线程完成。 将新增的socketserver.ThreadingMixIn.block_on_close
类属性设为False
可获得 3.7 之前版本的行为。 (由 Victor Stinner 在 bpo-31233 [https://bugs.python.org/issue?@action=redirect&bpo=31233] 和 bpo-33540 [https://bugs.python.org/issue?@action=redirect&bpo=33540] 中贡献。)socketserver.ForkingMixIn.server_close()
现在会等等所有子进程完成。 将新增的socketserver.ForkingMixIn.block_on_close
类属性设为False
可获得 3.7 之前版本的行为。 (由 Victor Stinner 在 bpo-31151 [https://bugs.python.org/issue?@action=redirect&bpo=31151] 和 bpo-33540 [https://bugs.python.org/issue?@action=redirect&bpo=33540] 中贡献。)某些情况下
locale.localeconv()
函数现在会临时将LC_CTYPE
区域设置为LC_NUMERIC
的值。 (由 Victor Stinner 在 bpo-31900 [https://bugs.python.org/issue?@action=redirect&bpo=31900] 中贡献。)如果 path 为字符串
pkgutil.walk_packages()
现在会引发ValueError
。 之前则是返回一个空列表。 (由 Sanyam Khurana 在 bpo-24744 [https://bugs.python.org/issue?@action=redirect&bpo=24744] 中贡献。)string.Formatter.format()
的格式字符串参数现在为 仅限位置 参数。 将其作为关键字参数传入的方式自 Python 3.5 起已弃用。 (由 Serhiy Storchaka 在 bpo-29193 [https://bugs.python.org/issue?@action=redirect&bpo=29193] 中贡献。)类
http.cookies.Morsel
的属性key
,value
和coded_value
现在均为只读。 对其赋值的操作自 Python 3.5 起已弃用。 要设置它们的值请使用set()
方法。 (由 Serhiy Storchaka 在 bpo-29192 [https://bugs.python.org/issue?@action=redirect&bpo=29192] 中贡献。)os.makedirs()
的 mode 参数不会再影响新建中间层级目录的权限位。 要设置它们的文件权限你可以在唤起makedirs()
之前设置 umask。 (由 Serhiy Storchaka 在 bpo-19930 [https://bugs.python.org/issue?@action=redirect&bpo=19930] 中贡献。)struct.Struct.format
的类型现在是str
而非bytes
。 (由 Victor Stinner 在 bpo-21071 [https://bugs.python.org/issue?@action=redirect&bpo=21071] 中贡献。)现在
cgi.parse_multipart()
接受 encoding 和 errors 参数并返回与FieldStorage
相同的结果:对于非文件字段,与键相关联的值是一个字符串列表,而非字节串列表。 (由 Pierre Quentel 在 bpo-29979 [https://bugs.python.org/issue?@action=redirect&bpo=29979] 中贡献。)由于
socket
中的内部更改,在由旧版 Python 中的socket.share
所创建的套接字上调用socket.fromshare()
已不受支持。BaseException
的repr
已更改为不包含末尾的逗号。 大多数异常都会受此更改影响。 (由 Serhiy Storchaka 在 bpo-30399 [https://bugs.python.org/issue?@action=redirect&bpo=30399] 中贡献。)datetime.timedelta
的repr
已更改为在输出中包含关键字参数。 (由 Utkarsh Upadhyay 在 bpo-30302 [https://bugs.python.org/issue?@action=redirect&bpo=30302] 中贡献。)因为
shutil.rmtree()
现在是使用os.scandir()
函数实现的,用户指定的句柄 onerror 现在被调用时如果列目录失败会附带第一个参数os.scandir
而不是os.listdir
。未来可能加入在正则表达式中对 Unicode 技术标准 #18 [https://unicode.org/reports/tr18/] 中嵌套集合与集合操作的支持。 这会改变现有语法。 为了推动这项未来的改变,目前在有歧义的情况下会引发
FutureWarning
。 这包括以字面值'['
开头或包含字面值字符序列'--'
,'&&'
,'~~'
以及'||'
的集合。 要避免警告,请用反斜杠对其进行转义。 (由 Serhiy Storchaka 在 bpo-30349 [https://bugs.python.org/issue?@action=redirect&bpo=30349] 中贡献。)基于可以匹配空字符串的
正则表达式
对字符串进行拆分的结果已被更改。 例如基于r'\s*'
的拆分现在不仅会像原先那样拆分空格符,而且会拆分所有非空格字符之前和字符串结尾处的空字符串。 通过将模式修改为r'\s+'
可以恢复原先的行为。 自 Python 3.5 开始此类模式将会引发FutureWarning
。
对于同时匹配空字符串和非空字符串的模式,在其他情况下搜索所有匹配的结果也可能会被更改。 例如在字符串 '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] 中贡献。)
re.escape()
更改为只转义正则表达式特殊字符,而不转义 ASCII 字母、数字和'_'
以外的所有字符。 (由 Serhiy Storchaka 在 bpo-29995 [https://bugs.python.org/issue?@action=redirect&bpo=29995] 中贡献。)tracemalloc.Traceback
帧现在是按从最旧到最新排序,以便与traceback
更为一致。 (由 Jesse Bakker 在 bpo-32121 [https://bugs.python.org/issue?@action=redirect&bpo=32121] 中贡献。)在支持
socket.SOCK_NONBLOCK
或socket.SOCK_CLOEXEC
标志位的操作系统上,socket.type
不再应用它们。 因此,像if sock.type == socket.SOCK_STREAM
之类的检测会在所有平台上按预期的方式工作。 (由 Yury Selivanov 在 bpo-32331 [https://bugs.python.org/issue?@action=redirect&bpo=32331] 中贡献。)在 Windows 上当重定向标准句柄时,
subprocess.Popen
的 close_fds 参数的默认值从False
更改为True
。 如果你以前依赖于在使用带有标准 io 重定向的subprocess.Popen
时所继承的句柄,则必须传入close_fds=False
以保留原先的行为,或是使用STARTUPINFO.lpAttributeList
。importlib.machinery.PathFinder.invalidate_caches()
— 此方法隐式地影响importlib.invalidate_caches()
— 现在会删除sys.path_importer_cache
中被设为None
的条目。 (由 Brett Cannon 在 bpo-33169 [https://bugs.python.org/issue?@action=redirect&bpo=33169] 中贡献。)在
asyncio
中,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop.getaddrinfo()
,loop.getnameinfo()
已被更改为正确的协程方法以与培训五日文档相匹配。 之前,这些方法会返回asyncio.Future
实例。 (由 Yury Selivanov 在 bpo-32327 [https://bugs.python.org/issue?@action=redirect&bpo=32327] 中贡献。)asyncio.Server.sockets
现在会返回服务器套接字列表的副本,而不是直接地返回它。 (由 Yury Selivanov 在 bpo-32662 [https://bugs.python.org/issue?@action=redirect&bpo=32662] 中贡献。)Struct.format
现在是一个str
实例而非bytes
实例。 (由 Victor Stinner 在 bpo-21071 [https://bugs.python.org/issue?@action=redirect&bpo=21071] 中贡献。)现在可以通过将
required=True
传给ArgumentParser.add_subparsers()
使得argparse
子解析器成为必需的。 (由 Anthony Sottile 在 bpo-26510 [https://bugs.python.org/issue?@action=redirect&bpo=26510] 中贡献。)ast.literal_eval()
现在变得更为严格。 任意地加减数字已不再被允许。 (由 Serhiy Storchaka 在 bpo-31778 [https://bugs.python.org/issue?@action=redirect&bpo=31778] 中贡献。)当一个日期超出
0001-01-01
到9999-12-31
范围时Calendar.itermonthdates
现在将始终如一地引发异常,以便支持不能容忍此类异常的应用程序,可以使用新增的Calendar.itermonthdays3
和Calendar.itermonthdays4
。 这些新方法返回元组,并且其不受datetime.date
所支持的范围限制。 (由 Alexander Belopolsky 在 bpo-28292 [https://bugs.python.org/issue?@action=redirect&bpo=28292] 中贡献。)collections.ChainMap
现在会保留底层映射的顺序。 (由 Raymond Hettinger 在 bpo-32792 [https://bugs.python.org/issue?@action=redirect&bpo=32792] 中贡献。)如果在解释器关闭期间被调用,
concurrent.futures.ThreadPoolExecutor
和concurrent.futures.ProcessPoolExecutor
的submit()
方法现在会引发RuntimeError
。 (由 Mark Nemec 在 bpo-33097 [https://bugs.python.org/issue?@action=redirect&bpo=33097] 中贡献。)configparser.ConfigParser
构造器现在使用read_dict()
来处理默认值,以使其行为与解析器的其余部分保持致。 在默认字典中的非字符串键和值现在会被隐式地转换为字符串。 (由 James Tocknell 在 bpo-23835 [https://bugs.python.org/issue?@action=redirect&bpo=23835] 中贡献。)一些未写入文档的内部导入已被移除。 一个例子是
os.errno
已不再可用;应改为直接使用import errno
。 请注意此类未写入文档的内部导入可能未经通知地随时被移除,甚至是在微版本号发行版中移除。
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_METHOD
和 CALL_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
的文件现在被命名为
而不是 '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.exe
和 pythonw.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 (十进制) 为基数在 int
和 str
之间进行转换现在如果字符串表示形式中的位数超过特定限制则会引发 ValueError
以避免因算法复杂度导致的拒绝服务攻击风险。 这是对于 CVE 2020-10735 [https://www.cve.org/CVERecord?id=CVE-2020-10735] 的一种缓解方案。 此限制可通过环境变量、命令行旗标或 sys
API 来配置或者禁用。 参见 整数字符串转换长度限制 文档。 字符串形式的默认限制为 4300 位数字。