Python 3.7 有什么新�化¶

编者:

Elvis Pranskevichus <elvis@magic.io>

本文解释了 Python 3.7 相比 3.6 的新增特性。Python 3.7 于 2018 年 6 月 27 日�布。完整的详情��阅 更新日志。

摘� - �布�点¶

新的语法特性:

  • PEP 563,类型标注延迟求值。

���兼容的语法更改:

  • async å’Œ await 现在是ä¿�留的关键字。

新的库模�:

新的内置特性:

对 Python 数�模型的改进:

  • PEP 562, 自定义å�¯è®¿é—®çš„æ¨¡å�—属性。

  • PEP 560, typing模å�—和泛型类型的核心支æŒ�。

  • dict 对象会ä¿�æŒ�æ�’入时的顺åº�这个特性 æ­£å¼�宣布 æˆ�为 Python 语言官方规范的一部分。

标准库中的�大改进:

CPython 实现的改进:

C API 的改进:

  • PEP 539,用于线程本地存储的新 C API

文档的改进:

  • PEP 545, Python 文档翻译

  • 新的文档翻译:Japanese,French å’Œ Korean。

此版本在诸多方�有显著的性能改进。性能优化 章节详细列出了它们。

和之�的 Python 版本存在兼容性的更改列表,请�阅 移�到 Python 3.7 章节。

新的特性¶

PEP 563:延迟的标注求值¶

�� PEP 3107 加入标注功能并在 PEP 526 进一步细化,Python 中类型�示的出现�示了两个明显的�用性问题:

  • 标注å�ªèƒ½ä½¿ç”¨åœ¨å½“å‰�作用域中已ç»�存在的å��称,也就是说,它们ä¸�支æŒ�任何形å¼�çš„å‰�å�‘引用;而且——

  • 标注æº�ç �对 Python 程åº�çš„å�¯åŠ¨æ—¶é—´æœ‰ä¸�利的影å“�。

这两个问题都�以通过延迟标注求值�解决。在定义标注的时候,编译器并�会编译执行相应表达�的代�,而是�存与相应表达�的 AST 等价的字符串形�。如果有需�,标注�以在�行时使用 typing.get_type_hints() 进行解�。在�需�这�解�的通常情况下,标注的存储�本更低(因为解�器�需处�较短的字符串)且�动时间更短。

在�用性方�,标注现在支���引用,以使以下�法有效:

class C:
    @classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...

由于此修改会破�兼容性,在 Python 3.7 中此�新的行为需�在�个模�层级上使用 __future__ 导入��用:

from __future__ import annotations

它将在 Python 3.10 中�为默认行为。

��

PEP 563 -- 延迟的标注求值

PEP 由 �ukasz Langa 撰写并实现。

PEP 538: 传统 C 区域强制转�¶

Python 3 系列有一个�续的挑战就是为处� 7 比特� ASCII 文本的�定编�确定��的默认策略,目�的设定是在� Windows 平�上使用默认的 C 或 POSIX 区域设置。

PEP 538 更新了默认的解释器命令行接�,以自动将上述区域强制转�为�用的基于 UTF-8 的区域,具体�述���有关新增环境�� PYTHONCOERCECLOCALE 的文档。 以这�方�自动设置 LC_CTYPE �味�核心解释器和能感知区域的 C 扩展 (例如 readline) 都将会�定 UTF-8 已被用作默认的文本编�,而��是 ASCII。

PEP 11 中的平�支�定义也已被更新以�制完整文本处�支�适当�置的基于� ASCII 的语言区域。

作为此更改的一部分,当使用任何已定义的强制转�目标区域时 (目�为 C.UTF-8, C.utf8 和 UTF-8) stdin 和 stdout 默认的处�器现在将为 surrogateescape (而�是 strict)。 而无论是什么区域,stderr 默认的处�器�为 backslashreplace。

默认情况下区域强制转�会�默进行,但为了辅助调试潜在的区域相关集�问题,�以通过设置 PYTHONCOERCECLOCALE=warn �请求显�地�用警告信�(直接在 stderr 上�出)。 此设置还会使得 Python �行时在核心解释器�始化时如果传统 C 区域�然处于激活状�时�出警告。

虽然 PEP 538 的区域强制转�的好处在于它还会�时影�扩展模� (例如 GNU readline) 以��进程 (包括�行� Python 应用和旧版本 Python 的�进程),但它也存在需�所�行系统必须存在适�的目标区域的缺点。 为了更好地处�没有�用适�的目标区域的情况 (例如在 RHEL/CentOS 7 上就会出现此情况),Python 3.7 还实现了 PEP 540: 强制 UTF-8 �行时模�。

��

PEP 538 -- 强制转�传统 C 区域到基于 UTF-8 的区域

PEP 由 Nick Coghlan 撰写并实现。

PEP 540: 强制 UTF-8 �行时模�¶

新的 -X utf8 命令行选项和 PYTHONUTF8 环境���被用��用 Python UTF-8 模�。

当处于 UTF-8 模�时,CPython 会忽略区域设置,并默认使用 UTF-8 编�。 用于 sys.stdin 和 sys.stdout �的错误处�器将设置为 surrogateescape。

强制 UTF-8 模��被用�在嵌入的 Python 解释器中改�文本处�行为,而�会改�嵌入方应用的区域设置。

PEP 540 的 UTF-8 模�的好处是�必关心�行所在系统中有哪些�用区域��工作,但它也存在对扩展模� (例如 GNU readline)��行� Python 应用的�进程以��行旧版本 Python 的�进程�起作用的缺点。 为了��与这些组件通信时破�文本数�的风险,Python 3.7 还实现了 PEP 540: 强制 UTF-8 �行时模�)。

UTF-8 模�在语言区域为 C 或 POSIX 并且 PEP 538 区域强制转�特性无法将其修改为��基于 UTF-8 的替代项时会被默认�用(无论修改失败是由于设置了 PYTHONCOERCECLOCALE=0, LC_ALL 还是由于缺少适�的目标区域)。

��

PEP 540 -- 增加了新的 UTF-8 模�

PEP 由 Victor Stinner 撰写并实现

PEP 553: 内置的 breakpoint()¶

Python 3.7 包�了新的内置 breakpoint() 函数,作为一�简�方便地进入 Python 调试器的方�。

内置 breakpoint() 会调用 sys.breakpointhook()。 在默认情况下�者会导入 pdb 然��调用 pdb.set_trace(),但是通过将 sys.breakpointhook() 绑定到你选定的函数,breakpoint() �以进入任何调试器。 此外,环境�� PYTHONBREAKPOINT �被设置为你选定的调试器的�调用对象。 设置 PYTHONBREAKPOINT=0 会完全�用内置 breakpoint()。

��

PEP 553 -- 内置的 breakpoint()

PEP 由 Barry Warsaw 撰写并实现

PEP 539: 用于线程局部存储的新 C API¶

虽然 Python �供了用于线程存储支�的 C API;但原有的 线程局部存储 (TLS) API 已使用 int �表示所有平�上的 TLS 密钥。 对于官方支�的平�而言这通常�是问题,但这��符� POSIX 标准,也�具备任何实际�义上的�移�性。

PEP 539 通过� CPython �供一个�代 CPython 解释器内部的现有 TLS API 的使用的新的 线程专属存储 (TSS) API �改�这一点,�时弃用了现有的 API。 TSS API 使用一�新类型 Py_tss_t 而� int �表示 TSS 密钥 -- 这是一�具体定义�赖于下层 TLS 实现的��明类型。 因此,这将�许在以无法安全地转�为 int 的方�定义原生 TLS 密钥的平�上构建 CPython。

请注�在 TLS 密钥定义方�使其无法被安全地转�为 int 的平�上,现有 TLS API 中的全部函数将无法执行并会立�返回失败信�。 这样�以清楚地表明原有 API 在无法�选使用的平�上��支�,并且也�准备添加此�支�。

��

PEP 539 -- 在 CPython 中用于线程局部存储的新 C-API

PEP 由 Erik M. Bray 撰写;由 Masayuki Yamamoto 实现。

PEP 562: 定制对模�属性的访问¶

Python 3.7 �许在模�上定义 __getattr__() 并且当以其他方�找�到�个模�属性时将会调用它。 在模�上定义 __dir__() 现在也是�许的。

一个典型的�能有用的例�是已弃用模�属性和惰性加载。

��

PEP 562 -- 模�的 __getattr__ 和 __dir__

PEP 由 Ivan Levkivskyi 撰写并实现

PEP 564: 具有纳秒级精度的新时间函数¶

现代系统的时钟精度�以超过由 time.time() 函数�其�化形�所返回的浮点数的有�精度。 为了��精度�失,PEP 564 在 time 模�中增加了原有计时器函数的六个新“纳秒版��化形�:

这些新函数会以整数值的形�返回纳秒数。

测�结果 显示在 Linux 和 Windows time.time_ns() 的精度相比 time.time() 大约�高 3 �。

��

PEP 564 -- 增加具有纳秒级精度的新时间函数

PEP 由 Victor Stinner 撰写并实现

PEP 565: 在 __main__ 中显示 DeprecationWarning¶

DeprecationWarning 的默认处�方�已�被更改,这此警告默认�显示一次,仅有当直接在 __main__ 模�中�行的代�触�它们时�会�次显示。 因此,�文件脚本开�者以� Python 交互模�使用者应该会�次开始看到针对他们所使用 API 的已弃用警告,但被导入应用�库和框架模�所触�的已弃用警告默认将继续��。

作为此项更改的结果,标准库现在�许开�者在三���的已弃用警告行为之间进行选择:

  • FutureWarning: 默认情况下总是会显示,建议用于应用程åº�最终用户应该看到的警告信æ�¯ï¼ˆä¾‹å¦‚对于已弃用的应用程åº�é…�置的设置选项)。

  • DeprecationWarning: 默认情况下仅在 __main__ 中以å�Šå½“è¿�行测试时会显示,建议用于其他 Python å¼€å�‘者应该看到的警告信æ�¯ï¼Œæ��示版本å�‡çº§å�¯èƒ½å¯¼è‡´è¡Œä¸ºæ”¹å�˜æˆ–者错误。

  • PendingDeprecationWarning: 默认情况下仅在è¿�行测试时会显示,å�¯ç”¨äºŽæ��示未æ�¥ç‰ˆæœ¬å�‡çº§å°†ä¼šæ”¹å�˜è­¦å‘Šç±»åˆ«ä¸º DeprecationWarning 或 FutureWarning 的情况。

在此之� DeprecationWarning 和 PendingDeprecationWarning 都仅在�行测试时��,这�味�主�编写�文件脚本或使用 Python 交互模�的开�者�能会因他们所用 API �然出现的改�而感到惊讶。

��

PEP 565 -- 在 __main__ 中显示 DeprecationWarning

PEP 由 Nick Coghlan 撰写并实现

PEP 560: 对 typing 模�和泛型类型的核心支�¶

PEP 484 最�的设计方�使其�会�核心 CPython 解释器引入 任何 更改。 现在类型�示和 typing 模�已被社区广泛使用,因此这个�制已被�消。 这个 PEP 引入了两个特殊方法 __class_getitem__() 和 __mro_entries__,这些方法现在被 typing 中的大多数类和特殊构造所使用。 结果就是与类型相关的�类�作的速度��了 7 �,泛型类型�以在没有元类冲�的情况下被使用,而 typing 模�中几个长期存在的错误也已被修正。

��

PEP 560 -- 对 typing 模�和泛型类型的核心支�

PEP 由 Ivan Levkivskyi 撰写并实现

PEP 552: 基于哈希值的 .pyc 文件¶

传统上 Python 检查字节�缓存文件 (� .pyc 文件) 是�最新的方�是通过对��元数� (最�更改的时间戳和大�)和生�缓存时�存在其文件头中的��元数�进行比较。 这�检查方法虽然有效,但也存在缺点。 当文件系统的时间戳太粗糙时,Python 有�能错过��更新,导致用户感到困惑。 此外,在缓存文件中存在时间戳对于 构建��现 并且基于内容的构建系统�说是有问题的。

PEP 552 扩展了 pyc 格�以�许使用�文件的哈希值而��文件的时间戳�检查有效性。 这� .pyc 文件就称为“基于哈希值的�。 默认情况下,Python �然使用基于时间戳的有效性检查,�会在�行时生�基于哈希值的 .pyc 文件。 基于哈希值的 .pyc 文件�以使用 py_compile 或 compileall �生�。

基于哈希值的 .pyc 文件包�两��体:已选定和未选定。 Python 会在�行时针对相应��文件验�已选定基于哈希值的 .pyc 文件,但对未选定基于哈希值的 pyc 文件则�会这样�。 未选定基于哈希值的 .pyc 文件对于需�由 Python 外部的系统(例如构建系统)负责使 .pyc 文件��最新的环境�说是一�有用的性能优化。

请�阅 已缓存字节�的失效 了解更多信�。

��

PEP 552 -- 确定性的 pyc 文件

PEP 由 Benjamin Peterson 撰写并实现

PEP 545: Python 文档翻译¶

PEP 545 �述了创建和维护 Python 文档翻译的整个过程。

新增了三个新的翻译版本:

��

PEP 545 -- Python 文档翻译

PEP 由 Julien Palard, Inada Naoki 和 Victor Stinner 撰写并实现。

Python 开�模� (-X dev)¶

新的 -X dev 命令行选项或新的 PYTHONDEVMODE 环境���被用��用 Python 开�模�。 在开�模�下,Python 将执行�外的如果默认�用会导致开销过大的�行时检查。 请�阅 Python 开�模� 文档查看完整说明。

其他语言特性修改¶

  • await 表达å¼�和包å�« async for å­�å�¥çš„æŽ¨å¯¼å¼�ä¸�å…�许在 æ ¼å¼�化字符串字é�¢å€¼ 的表达å¼�中使用。 在 Python 3.7 中此é™�制已被å�–消。

  • 现在å�¯ä»¥å°†è¶…过 255 个å�‚数传递给一个函数,而现在一个函数也å�¯ä»¥æ‹¥æœ‰è¶…过 255 个形å�‚。 (由 Serhiy Storchaka 在 bpo-12844 å’Œ bpo-18896 中贡献。)

  • 现在 bytes.fromhex() å’Œ bytearray.fromhex() 会忽略所有 ASCII 空白符,而é�žä»…是空格符. (由 Robert Xiao 在 bpo-28927 中贡献。)

  • str, bytes å’Œ bytearray 获得了对新 isascii() 方法的支æŒ�,该方法å�¯è¢«ç”¨æ�¥æµ‹è¯•是个字符串或字节串是å�¦ä»…包å�« ASCII 字符。 (由 INADA Naoki 在 bpo-32677 中贡献。)

  • 现在当 from ... import ... 失败时 ImportError 会显示模å�—å��称和模å�— __file__ 路径。 (由 Matthias Bussonnier 在 bpo-29546 中贡献。)

  • 现在已支æŒ�涉å�Šå°†å­�模å�—绑定到一个å��ç§°çš„ç»�对导入的循环导入。 (由 Serhiy Storchaka 在 bpo-30024 中贡献。)

  • 现在 object.__format__(x, '') 等价于 str(x) 而é�ž format(str(self), '')。 (由 Serhiy Storchaka d bpo-28974 中贡献。)

  • 为了更好地支æŒ�栈跟踪的动æ€�创建,现在 types.TracebackType å�¯ä»¥ä»Ž Python 代ç �中被实例化,并且 回溯对象 çš„ tb_next 属性现在是å�¯å†™çš„。 (由 Nathaniel J. Smith 在 bpo-30579 中贡献。)

  • 当使用 -m 开关时,现在 sys.path[0] 会主动扩展为完整的起始目录路径,而ä¸�是ä¿�æŒ�为空目录(这将å…�许在å�‘生导入时从 当å‰� 工作目录导入) (由 Nick Coghlan 在 bpo-33053 中贡献。)

  • æ–°çš„ -X importtime 选项或 PYTHONPROFILEIMPORTTIME 环境å�˜é‡�å�¯è¢«ç”¨æ�¥æ˜¾ç¤ºæ¯�次模å�—导入的时间。 (由 Inada Naoki 在 bpo-31415 中贡献。)

新增模�¶

contextvars¶

新的 contextvars 模�和一组 新的 C API 引入了对 上下文�� 的支�。 上下文��在概念上类似于线程局部��。 与 TLS ��,上下文��能正确地支�异步代�。

asyncio 和 decimal 已得到更新以使用和支�开箱�用的上下文��。 特别是激活的 decimal 上下文现在将存储在上下文��中,它�许�进制�算在异步代�中使用正确的上下文。

��

PEP 567 -- 上下文��

PEP 由 Yury Selivanov 撰写并实现

dataclasses¶

新的 dataclass() 装饰器�供了一�声明 数�类 的方�。 数�类使用��标注��述其属性。 它的构造器和其他魔术方法例如 __repr__(), __eq__() 以� __hash__() 会自动地生�。

示例:

@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"

��

PEP 557 -- 数�类

PEP 由 Eric V. Smith 撰写并实现

importlib.resources¶

新的 importlib.resources 模��供了一些新的 API 和一个新的 ABC 用于访问�打开和读�包内的 资�。 资�基本上类似于包内的文件,但它们�一定是物�文件系统中实际的文件。 模�加载器�以�供 get_resource_reader() 函数,它会返回一个 importlib.abc.ResourceReader 实例�支�这个新 API。 内置的文件路径加载器和 zip 文件加载器都支�此特性。

由 Barry Warsaw 和 Brett Cannon 在 bpo-32248 中贡献。

��

importlib_resources -- 用于较早版本 Python 的 PyPI �下移�包。

改进的模�¶

argparse¶

新的 ArgumentParser.parse_intermixed_args() 方法�许混�选项与�置�数。 (由 paul.j3 在 bpo-14191 中�供。)

asyncio¶

asyncio 模�获得了许多新的特性��用性和 性能��。 ��的改�包括:

  • æ–°çš„ 暂定 asyncio.run() 函数å�¯è¢«ç”¨äºŽé€šè¿‡è‡ªåŠ¨åˆ›å»ºå’Œé”€æ¯�事件循环æ�¥åŸºäºŽå�Œæ­¥ä»£ç �è¿�行å��程。 (由 Yury Selivanov 在 bpo-32314 中贡献。)

  • asyncio 增加支æŒ� contextvars. loop.call_soon(), loop.call_soon_threadsafe(), loop.call_later(), loop.call_at() 并且 Future.add_done_callback() 具有新的å�¯é€‰ä»…关键字å�‚æ•° context。 现在 Tasks 会自动跟踪其上下文。 详情å�‚è§� PEP 567。 (由 Yury Selivanov 在 bpo-32436 中贡献。)

  • 增加了新的 asyncio.create_task() 函数作为 asyncio.get_event_loop().create_task() 的快æ�·æ–¹å¼�。 (由 Andrew Svetlov 在 bpo-32311 中贡献。)

  • æ–°çš„ loop.start_tls() 方法å�¯ç”¨äºŽå�‡çº§çŽ°æœ‰çš„ TLS 连接。 (由 Yury Selivanov 在 bpo-23749 中贡献。)

  • æ–°çš„ loop.sock_recv_into() 方法å…�许直接从套接字读å�–æ•°æ�®æ”¾å…¥æ‰€æ��供的缓冲区,从而å�¯ä»¥å‡�å°‘æ•°æ�®å¤�制。 (由 Antoine Pitrou 在 bpo-31819 中贡献。)

  • æ–°çš„ asyncio.current_task() 函数å�¯è¿”回当å‰�è¿�行的 Task 实例,以å�Šæ–°çš„ asyncio.all_tasks() 函数å�¯è¿”回给定循环中所有现存 Task 实例的集å�ˆã€‚ Task.current_task() å’Œ Task.all_tasks() 方法已弃用。 (由 Andrew Svetlov 在 bpo-32250 中贡献。)

  • æ–°çš„ 暂定 BufferedProtocol ç±»å…�许通过手动控制接收缓冲区æ�¥å®žçްæµ�å¼�å��议。 (由 Yury Selivanov 在 bpo-32251 中贡献。)

  • æ–°çš„ asyncio.get_running_loop() 函数å�¯è¿”回当å‰�è¿�行的循环,如果没有循环在è¿�行则引å�‘ RuntimeError。 这与 asyncio.get_event_loop() ä¸�å�Œï¼Œå�Žè€…在没有循环在è¿�行时将 创建 一个新的事件循环。 (由 Yury Selivanov 在 bpo-32269 中æ��供。)

  • æ–°çš„ StreamWriter.wait_closed() å��程方法å…�许执行等待直到æµ�写入器被关闭。 æ–°çš„ StreamWriter.is_closing() 方法å�¯ç”¨äºŽç¡®å®šå†™å…¥å™¨æ˜¯å�¦è¢«å…³é—­ã€‚ (由 Andrew Svetlov 在 bpo-32391 中贡献。)

  • æ–°çš„ loop.sock_sendfile() å��程方法å…�许在å�¯èƒ½çš„æƒ…况下使用 os.sendfile å�‘é€�文件。 (由 Andrew Svetlov 在 bpo-32410 中贡献。)

  • æ–°çš„ Future.get_loop() å’Œ Task.get_loop() 方法会返回创建 task 或 future 对象的事件循环的实例。 Server.get_loop() å…�许为 asyncio.Server 对象执行å�Œæ ·æ“�作。 (由 Yury Selivanov 在 bpo-32415 中,以å�Šç”± Srinivas Reddy Thatiparthy 在 bpo-32418 中贡献。)

  • 现在å�¯ä»¥æŽ§åˆ¶ asyncio.Server 的实例如何开å�¯æœ�务。 之å‰�,æœ�务在创建å�Žå°†ç«‹å�³å¼€å�¯æœ�务。 æ–°çš„ start_serving 关键字å�‚数已添加到 loop.create_server() å’Œ loop.create_unix_server(),并且 Server.start_serving(), å’Œ Server.serve_forever() å�¯è¢«ç”¨æ�¥åˆ†ç¦»æœ�务的实例化和æœ�务的开å�¯ã€‚ æ–°çš„ Server.is_serving() 方法会在æœ�务开å�¯æ—¶è¿”回 True。 现在 Server 对象已是异步上下文管ç�†å™¨:

    srv = await loop.create_server(...)
    
    async with srv:
        # some code
    
    # At this point, srv is closed and no longer accepts new connections.
    

    (由 Yury Selivanov 在 bpo-32662 中贡献。)

  • ç”± loop.call_later() 所返回的回调对象已获得新的 when() 方法,该方法会返回一个排入计划日程的ç»�对时间戳。 (由 Andrew Svetlov 在 bpo-32741 中贡献。)

  • loop.create_datagram_endpoint() 方法已获得对 Unix 套接字的支æŒ�。 (由 Quentin Dawans 在 bpo-31245 中贡献。)

  • asyncio.open_connection(), asyncio.start_server() functions, loop.create_connection(), loop.create_server(), loop.create_accepted_socket() 方法å�Šå…¶å¯¹åº”çš„ UNIX 套接字å�˜ä½“现在接å�— ssl_handshake_timeout 关键字å�‚数。 (由 Neil Aspinall 在 bpo-29970 中贡献。)

  • æ–°çš„ Handle.cancelled() 方法会在回调被å�–消时返回 True。 (由 Marat Sharafutdinov 在 bpo-31943 中贡献。)

  • asyncio æº�已被转æ�¢ä¸ºä½¿ç”¨ async/await 语法。 (由 Andrew Svetlov 在 bpo-32193 中贡献。)

  • æ–°çš„ ReadTransport.is_reading() 方法å�¯ç”¨äºŽç¡®å®šä¼ è¾“的读å�–状æ€�。 此外,对 ReadTransport.resume_reading() å’Œ ReadTransport.pause_reading() 的调用现在是幂等的。 (由 Yury Selivanov 在 bpo-32356 中贡献。)

  • 接å�—套接字路径的循环方法现在支æŒ�ä¼ å…¥ 路径类对象。 (由 Yury Selivanov 在 bpo-32066 中贡献。)

  • 在 asyncio 中,Linux 上的 TCP 套接字现在创建时默认带有 TCP_NODELAY 旗标设置。 (由 Yury Selivanov å’Œ Victor Stinner 在 bpo-27456 中贡献。)

  • 在被å�–消任务中å�‘生的异常ä¸�会å†�被记录。 (由 Yury Selivanov 在 bpo-30508 中贡献。)

  • æ–°çš„ WindowsSelectorEventLoopPolicy å’Œ WindowsProactorEventLoopPolicy 类。 (由 Yury Selivanov 在 bpo-33792 中贡献。)

部分 asyncio API 改为 已弃用。

binascii¶

b2a_uu() 函数现在接��选的 backtick 关键字�数。 当其为真值时,零会以 '`' 而�空格�表示。 (由 Xiang Zhang 在 bpo-30103 中贡献。)

calendar¶

HTMLCalendar 类具有新的类属性,�以简化所生� HTML 日历中 CSS 类的自定义。 (由 Oz Tiram 在 bpo-30095 中贡献。)

collections¶

collections.namedtuple() 现在支�默认值。 (由 Raymond Hettinger 在 bpo-32320 中贡献。)

compileall¶

compileall.compile_dir() 增加了新的 invalidation_mode 形�,�用于�用 基于哈希值的 .pyc 有效性检测。 失效模�也�以在命令行中使用新的 --invalidation-mode �数�指定。 (由 Benjamin Peterson 在 bpo-31650 中贡献。)

concurrent.futures¶

ProcessPoolExecutor 和 ThreadPoolExecutor 现在支�新的 �始化器 以� initargs 构造器�数。 (由 Antoine Pitrou 在 bpo-21423 中贡献。)

ProcessPoolExecutor 现在能通过新的 mp_context �数�接�多进程上下文。 (由 Thomas Moreau 在 bpo-31540 中贡献。)

contextlib¶

新的 nullcontext() 是一个比 ExitStack 更简�和快速的无�作上下文管�器。 (由 Jesse-Bakker 在 bpo-10049 中贡献。)

增加了新的 asynccontextmanager(), AbstractAsyncContextManager 和 AsyncExitStack 以补充它们所对应的�步项。 (由 Jelle Zijlstra 在 bpo-29679 和 bpo-30241 中,以�由 Alexander Mohr 和 Ilya Kulakov 在 bpo-29302 中贡献。)

cProfile¶

cProfile 命令行现在接� -m module_name 作为脚本路径的替代。 (由 Sanyam Khurana 在 bpo-21862 中贡献。)

crypt¶

crypt 模�现在支� Blowfish 哈希方法。 (由 Serhiy Storchaka 在 bpo-31664 中贡献。)

mksalt() 函数现在�许指定哈希�作的轮数。 (由 Serhiy Storchaka 在 bpo-31702 中贡献。)

datetime¶

新的 datetime.fromisoformat() 方法会基于由 datetime.isoformat() 所输出的�一特定格�字符串构建 datetime 对象。 (由 Paul Ganssle 在 bpo-15873 中贡献。)

tzinfo 类现在支��于一分钟的�移�。 (由 Alexander Belopolsky 在 bpo-5288 中贡献。)

dbm¶

dbm.dumb 现在支�读��读文件,并且在其未改�时��写入索引文件。

decimal¶

decimal 模�现在使用 上下文�� �储存�进制值上下文。 (由 Yury Selivanov 在 bpo-32630 中贡献。)

dis¶

dis() 函数现在能够�汇编嵌套的代�对象(推导��生�器表达�和嵌套函数的代�,以�用于构建嵌套类的代�)。 �汇编递归的最大深度由新的 depth 形��控制。 (由 Serhiy Storchaka 在 bpo-11822 中贡献。)

distutils¶

README.rst 现在包�在 distutils 的标准 README 列表之中,因而也包�在���布之中。 (由 Ryan Gonzalez 在 bpo-11913 中贡献。)

enum¶

Enum 增加了新的 _ignore_ 类特�属性,该属性�许列出�应当�为枚举�员的特�属性�称。 (由 Ethan Furman 在 bpo-31801 中贡献。)

在 Python 3.8 中,�试在 Enum 类中检查� Enum 对象将引� TypeError (例如 1 in Color);类似地,�试在 Flag �员中检查� Flag 对象也将引� TypeError (例如 1 in Perm.RW);目�,两��作�会返回 False 并且已弃用。 (由 Ethan Furman 在 bpo-33217 中贡献。)

functools¶

functools.singledispatch() 现在支�使用类型标注�注册实现。 (由 �ukasz Langa 在 bpo-32227 中贡献。)

gc¶

新的 gc.freeze() 函数�许冻结由垃圾回收器所跟踪的所有对象,并将它们从未�的集�中排除。 这�以在 POSIX fork() 调用之�使用以令 GC �好地进行写入时�制或加速收集。 新的 gc.unfreeze() 函数会�转此�作。 此外,gc.get_freeze_count() �被用于获�冻结对象的数�。 (由 Li Zekun 在 bpo-31558 中贡献。)

hmac¶

hmac 现在具有�优化的一次性 digest() 函数,其速度比 HMAC() �快三�。 (由 Christian Heimes 在 bpo-32433 中贡献。)

http.client¶

HTTPConnection 和 HTTPSConnection 现在支�新的 blocksize �数以��上传���。 (由 Nir Soffer 在 bpo-31945 中贡献。)

http.server¶

SimpleHTTPRequestHandler 现在支� HTTP If-Modified-Since 标头。 如果目标文件在该标点指定的时间之�未被修改则�务器会返回 304 �应状�。 (由 Pierre Quentel 在 bpo-29654 中贡献。)

SimpleHTTPRequestHandler 接�新的 directory �数并增加了新的 --directory 命令行�数。 通过此形�,�务器�以对�务指定目录,默认情况下它使用当�工作目录。 (由 Stéphane Wirtel 和 Julien Palard 在 bpo-28707 中贡献。)

新的 ThreadingHTTPServer 类使用线程�处�使用 ThreadingMixin 的请求。 它会在 http.server 附带 -m �行时被使用。 (由 Julien Palard 在 bpo-31639 中贡献。)

idlelib 与 IDLE¶

多个对自动补全的修正。 (由 Louie Lu 在 bpo-15786 中贡献。)

Module Browser (在 File ��中,之�称为 Class Browser) 现在会在最高层级函数和类之外显示嵌套的函数和类。 (由 Guilherme Polo, Cheryl Sabella 和 Terry Jan Reedy 在 bpo-1612262 中贡献。)

Settings 对�框 (Options 中的 Configure IDLE) 已�被部分�写以改进外观和功能。 (由 Cheryl Sabella 和 Terry Jan Reedy 在多个问题项中贡献。)

字体样本现在包括一组�拉�字符以便用户能更好地查看所选特定字体的效果。 (由 Terry Jan Reedy 在 bpo-13802 中贡献。) 样本�以被修改以包括其他字符。 (由 Serhiy Storchaka 在 bpo-31860 中贡献。)

之�以扩展形�实现的 IDLE 特性已作为正常特性�新实现。 它们的设置已从 Extensions 选项�移至其他对�框选项�。 (由 Charles Wohlganger 和 Terry Jan Reedy 在 bpo-27099 中实现。)

编辑器代�上下文选项已�过修改。 Box 会显示所有上下文行直到最大行数。 点击一个上下文行会使编辑器跳转到该行。 自定义主题的上下文颜色已添加到 Settings 对�框的 Highlights 选项�。 (由 Cheryl Sabella 和 Terry Jan Reedy 在 bpo-33642, bpo-33768 和 bpo-33679 中贡献。)

在 Windows 上,会有新的 API 调用将 tk 对 DPI 的调整告知 Windows。 在 Windows 8.1+ 或 10 上,如果 Python 二进制�的 DPI 兼容属性未改�,并且监视器分辨率大于 96 DPI,这应该会令文本和线�更清晰。 �则的�它应该�造�影�。 (由 Terry Jan Reedy 在 bpo-33656 中贡献。)

在 3.7.1 中新增:

超过 N 行(默认值为 50)的输出将被折�为一个按钮。 N �以在 Settings 对�框的 General 页的 PyShell 部分中进行修改。 数�较少但是超长的行�以通过在输出上�击�折�。 被折�的输出�通过�击按钮�展开,或是通过�击按钮�放入剪贴�或是�独的窗�。 (由 Tal Einat 在 bpo-1529353 中贡献。)

上述修改已被��移�到 3.6 维护�行版中。

在 3.7.4 中新增:

在 Run ��中增加了 "Run Customized" 以使用自定义设置��行模�。 输入的任何命令行�数都会被加入 sys.argv。 它们在下次自定义�行时会�次显示在窗体中。 用户也�以�用通常的 Shell 主模���。 (由 Cheryl Sabella, Terry Jan Reedy 等人在 bpo-5680 和 bpo-37627 中贡献。)

在 3.7.5 中新增:

在 IDLE 编辑器窗�中增加了�选的行��。 窗�打开时默认�带行��,除�在�置对�框的 General 选项�中进行设置。 已打开窗�中的行���以在 Options ��中显示和��。 (由 Tal Einat 和 Saimadhav Heblikar 在 bpo-17535 中贡献。)

importlib¶

引入了 importlib.abc.ResourceReader ABC 以支�从包中加载资�。 �请�阅 importlib.resources。 (由 Barry Warsaw, Brett Cannon 在 bpo-32248 中贡献。)

如果模�缺少规格�述 importlib.reload() 现在会引� ModuleNotFoundError。 (由 Garvit Khatri 在 bpo-29851 中贡献。)

如果指定的父模��是一个包 (�缺少 __path__ 属性) importlib.find_spec() 现在会引� ModuleNotFoundError 而� AttributeError。 (由 Milan Oberkirch 在 bpo-30436 中贡献。)

新的 importlib.source_hash() �被用�计算传入�的哈希值。 基于哈希值的 .pyc 文件 会嵌入此函数所返回的值。

io¶

新的 TextIOWrapper.reconfigure() 方法�用于根�新的设置�新�置文本�。 (由 Antoine Pitrou 在 bpo-30526 以� INADA Naoki 在 bpo-15216 中贡献。)

ipaddress¶

methods of ipaddress.IPv6Network 和 ipaddress.IPv4Network 中新的 subnet_of() 以� supernet_of() 方法�用于网络包�测试。 (由 Michel Albert 和 Cheryl Sabella 在 bpo-20825 中贡献。)

itertools¶

itertools.islice() 现在接� 类整数对象 作为 start, stop 和 slice �数。 (由 Will Roberts 在 bpo-30537 中贡献。)

locale¶

locale.format_string() 中新的 monetary �数�用于转�所使用的��分隔符和分组字符串。 (由 Garvit 在 bpo-10379 中贡献。)

现在 locale.getpreferredencoding() 函数在 Android 上或是在 强制 UTF-8 模� 下总是返回 'UTF-8' 。

logging¶

Logger 实例现在�以被 pickle。 (由 Vinay Sajip 在 bpo-30520 中贡献。)

新的 StreamHandler.setStream() 方法�用于在�柄创建之�替�日志�。 (由 Vinay Sajip 在 bpo-30522 中创建。)

现在�以在传递给 logging.config.fileConfig() 的�置信�中对�柄构造器指定关键字�数。 (由 Preston Landers 在 bpo-31080 中贡献。)

math¶

新的 math.remainder() 函数实现了 IEEE 754 风格的余数�算。 (由 Mark Dickinson 在 bpo-29962 中贡献。)

mimetypes¶

.bmp 的 MIME type 从 'image/x-ms-bmp' 改为 'image/bmp'。 (由 Nitish Chandra 在 bpo-22589 中贡献。)

msilib¶

新的 Database.Close() 方法�用于关闭 MSI 数�库。 (由 Berker Peksag 在 bpo-20486 中贡献。)

multiprocessing¶

新的 Process.close() 方法会显�地关闭进程对象并释放与其关�的所有资�。 如果底层进程�在�行则将引� ValueError。 (由 Antoine Pitrou 在 bpo-30596 中贡献。)

新的 Process.kill() 方法�用于在 Unix 上使用 SIGKILL 信��终止进程。 (由 Vitor Pereira 在 bpo-30794 中贡献。)

由 Process 所创建的�守护线程现在会在进程退出时被�并。 (由 Antoine Pitrou 在 bpo-18966 中贡献。)

os¶

os.fwalk() 现在接� bytes 类型的 path �数。 (由 Serhiy Storchaka 在 bpo-28682 中贡献。)

os.scandir() 已获得对 文件�述器 的支�。 (由 Serhiy Storchaka 在 bpo-25996 中贡献。)

新的 register_at_fork() 函数�许注册 Python 回调以便在进程分�中执行。 (由 Antoine Pitrou 在 bpo-16500 中贡献。)

增加了 os.preadv() (结�了 os.readv() 与 os.pread() 的功能) 以� os.pwritev() 函数 (结�了 os.writev() 和 os.pwrite() 的功能)。 (由 Pablo Galindo 在 bpo-31368 中贡献。)

os.makedirs() 的 mode �数��会影�新创建的中间层级目录的���。 (由 Serhiy Storchaka 在 bpo-19930 中贡献。)

os.dup2() 现在会返回新的文件�述器。 之�,返回的总是 None。 (由 Benjamin Peterson 在 bpo-32441 中贡献。)

在 Solaris �其派生系统上 os.stat() 所返回的结构现在会包� st_fstype 属性。 (由 Jesús Cea Avión 在 bpo-32659 中贡献。)

pathlib¶

在 POSIX 类系统上新的 Path.is_mount() 方法现在�用于确定一个路径是�为挂载点。 (由 Cooper Ry Lees 在 bpo-30897 中贡献。)

pdb¶

pdb.set_trace() 现在接�一个�选的�关键字�数 header。 如果给出,它会在调试开始之�被打�到控制�。 (由 Barry Warsaw 在 bpo-31389 中贡献。)

pdb 命令行现在接� -m module_name 作为对脚本文件的替代。 (由 Mario Corchero 在 bpo-32206 中贡献。)

py_compile¶

py_compile.compile() -- �其扩展形� compileall -- 现在会通过无�件地为基于哈希值的有效性验�创建 .pyc 文件�支� SOURCE_DATE_EPOCH 环境��。 这样�以确�当 .pyc 文件被主动创建时 ��现的生�。 (由 Bernhard M. Wiedemann 在 bpo-29708 中贡献。)

pydoc¶

pydoc �务器现在�以绑定到由新的 -n 命令行�数所指定的任�主机�。 (由 Feanil Patel 在 bpo-31128 中贡献。)

queue¶

新的 SimpleQueue 类是一个无界的 FIFO 队列。 (由 Antoine Pitrou 在 bpo-14976 中贡献。)

re¶

旗标 re.ASCII, re.LOCALE 和 re.UNICODE �以在组的范围内设置。 (由 Serhiy Storchaka 在 bpo-31690 中贡献。)

re.split() 现在支�基于匹�一个空字符串的模�例如 r'\b', '^$' 或 (?=-) 进行拆分。 (由 Serhiy Storchaka 在 bpo-25054 中贡献。)

使用 re.LOCALE 旗标编译的正则表达����赖于编译时的区域设置。 区域设置仅在已编译正则表达�被使用时�被应用。 (由 Serhiy Storchaka 在 bpo-30215 中贡献。)

现在如果一个正则表达�包�语义将在未��生改�的字符集构造,则会引� FutureWarning,例如嵌套集与集��作等。 (由 Serhiy Storchaka 在 bpo-30349 中贡献。)

已编译正则表达�和匹�对象现在�以使用 copy.copy() 和 copy.deepcopy() 进行拷�。 (由 Serhiy Storchaka 在 bpo-10076 中贡献。)

signal¶

signal.set_wakeup_fd() 函数新增的 warn_on_full_buffer �数�以指定当唤醒缓冲区溢出时 Python 是��在 stderr 上打�警告信�。 (由 Nathaniel J. Smith 在 bpo-30050 中贡献。)

socket¶

新增的 socket.getblocking() 方法会在套接字处于阻塞模�时返回 True,�则返回 False。 (由 Yury Selivanov 在 bpo-32373 中贡献。)

新的 socket.close() 函数�关闭所传入的套接字文件�述符。 应该用此函数�代替 os.close() 以获得更好的跨平�兼容性。 (由 Christian Heimes 在 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 以� Nathaniel J. Smith 在 bpo-29728 中贡献。)

已增加对 socket.AF_VSOCK 套接字的支�以�许在虚拟机�其宿主机之间进行通信。 (由 Cathy Avery 在 bpo-27584 中贡献。)

套接字现在默认会根�文件�述符自动检测所属��类型和�议。 (由 Christian Heimes 在 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 中贡献。)

sqlite3.connect() 的 database �数现在接�任何 path-like object,而�是�接�字符串。 (由 Anders Lorentsen 在 bpo-31843 中贡献。)

ssl¶

ssl 模�现在使用 OpenSSL 的内置 API 代替 match_hostname() �检查主机�或 IP 地�。 值的验�会在 TLS �手期间进行。 任何�书验�错误包括主机�检查失败现在将引� SSLCertVerificationError 并使用正确的 TLS Alert 消�中止�手过程。 这个新异常包�有�外的信�。 主机�验��通过 SSLContext.hostname_checks_common_name 进行自定义。 (由 Christian Heimes 在 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 中贡献。)

match_hostname() ��支�部分通�符例如 www*.example.org。 (由 Mandeep Singh 在 bpo-23033 以� Christian Heimes 在 bpo-31399 中贡献。)

ssl 模�默认的加密套件选择现在是使用黑��方�而�硬编�的白��。 Python �会��新�用已�被 OpenSSL 安全更新所阻止的加密。 默认的加密套件选择�以在编译时进行�置。 (由 Christian Heimes 在 bpo-31429 中贡献。)

现在已支�包�国际化域� (IDN) 的�务器�书验�。 作为此更改的一部分,SSLSocket.server_hostname 属性现在会以预期的 A 标签形� ("xn--pythn-mua.org") 而�是以 U 标签形� ("pythön.org") 存储。 (由 Nathaniel J. Smith 与 Christian Heimes 在 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, bpo-20995, bpo-29136, bpo-30622 以� bpo-33618 中贡献。)

SSLSocket 和 SSLObject ��具有公共构造器。 直接实例化从未�为有文档和�支�的特性。 实际必须通过 SSLContext 的方法 wrap_socket() 和 wrap_bio() �创建。 (由 Christian Heimes 在 bpo-32951 中贡献。)

用于设置最�和最大 TLS �议版本的 OpenSSL 1.1 API 现已�用,�称分别为 SSLContext.minimum_version 和 SSLContext.maximum_version。 �支�的�议由几个新增旗标指定,例如 HAS_TLSv1_1。 (由 Christian Heimes 在 bpo-32609 中贡献。)

增加了 ssl.SSLContext.post_handshake_auth 以�用并通过 ssl.SSLSocket.verify_client_post_handshake() ��始化 TLS 1.3 �手�验�。 (由 Christian Heimes 在 gh-78851 中贡献。)

string¶

string.Template 现在�许你有选择地分别修改带大括�的��符和�带大括�的��符所对应的正则表达�模�。 (由 Barry Warsaw 在 bpo-1198569 中贡献。)

subprocess¶

subprocess.run() 函数接�新的 capture_output 关键字�数。 当其为真值时,将会�获 stdout 和 stderr。 这等价于传入 subprocess.PIPE 作为 stdout 和 stderr �数。 (由 Bo Bayles 在 bpo-32102 中贡献。).)

subprocess.run 函数和 subprocess.Popen 构造器现在接� text 关键字�数作为 universal_newlines 的别�。 (由 Andrew Clegg 在 bpo-31756 中贡献。)

在 Windows 中当�定�标准�柄时 close_fds 的默认值由 False 改为 True。 现在�以在�定�标准�柄时将 close_fds 设为真值。 �阅 subprocess.Popen。 这�味�现在 close_fds 在所有�支�的平�上默认值�为 True。 (由 Segev Finer 在 bpo-19764 中贡献。)

在 subprocess.call(), subprocess.run() 期间或在 Popen 上下文管�器中,subprocess 模�现在能更优雅地处� KeyboardInterrupt。 它现在会等待一�段时间以便�进程退出,然��继续处� KeyboardInterrupt 异常。 (由 Gregory P. Smith 在 bpo-25942 中贡献。)

sys¶

新增 sys.breakpointhook() 钩�函数,供内置的 breakpoint() 进行调用。 (由 Barry Warsaw 在 bpo-31353 中贡献。)

在 Android 中新增的 sys.getandroidapilevel() 会返回构建时的 Android API 版本。 (由 Victor Stinner 在 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 中贡献。)

time¶

PEP 564 � 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 中贡献。)

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

tkinter¶

新的 tkinter.ttk.Spinbox 类现已�用。 (由 Alan Moore 在 bpo-32585 中贡献。)

tracemalloc¶

tracemalloc.Traceback 的行为更接近正规的回溯,会对所有帧按从最旧到最新�排�。 Traceback.format() 现在接�负的 limit,并会将结果截短至排在第 abs(limit) �的旧帧。 如果�获得旧的行为,请在 Traceback.format() 中使用新的 most_recent_first �数。 (由 Jesse Bakker 在 bpo-32121 中贡献。)

types¶

新的 WrapperDescriptorType, MethodWrapperType, MethodDescriptorType 和 ClassMethodDescriptorType 类现已�用。 (由 Manuel Krebber 和 Guido van Rossum 在 bpo-29377 以� Serhiy Storchaka 在 bpo-32265 中贡献。)

新的 types.resolve_bases() 函数会以 PEP 560 所规定的方�动�解� MRO �目。 (由 Ivan Levkivskyi 在 bpo-32717 中贡献。)

unicodedata¶

内部 unicodedata 数�库已�级为使用 Unicode 11。 (由 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 中贡献。)

unittest.mock¶

现在 sentinel 属性会在它们被 �制 或 �存 时�存其标识。 (由 Serhiy Storchaka 在 bpo-20804 中贡献。)

新的 seal() 函数�许 Mock 对实例进行密�,这将�止进一步创建属性模拟。 密�会以递归方�应用于自身模拟的所有属性。 (由 Mario Corchero 在 bpo-30541 中贡献。)

urllib.parse¶

urllib.parse.quote() 已�从 RFC 2396 更新为 RFC 3986,将 ~ 添加到默认情况下从未引用的字符集。 (由 Christian Theune 和 Ratnadeep Debnath 在 bpo-16285 中贡献。)

uu¶

uu.encode() 函数现在接��选的 backtick 关键字�数。 当其为真时,零会以 '`' 而�空格�表示。 (由 Xiang Zhang 在 bpo-30103 中贡献。)

uuid¶

新的 UUID.is_safe 属性会从平�中继有关是�使用多进程安全模��生�所需 UUID 的信�。 (由 Barry Warsaw 在 bpo-22807 中贡献。)

uuid.getnode() 现在更倾�于统一管�的 MAC 地�而�是本地管�的 MAC 地�。 这样�以更好地��从 uuid.uuid1() 返回的 UUID 的全局唯一性。 如果�有本地管�的 MAC 地��用,则返回首个找到的此类地�。 (由 Barry Warsaw 在 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, bpo-32043 以� bpo-32230 中贡献。)

在�文件脚本和交互��示符中,默认情况下会�次显示已弃用警告。 详情�� PEP 565: 在 __main__ 中显示 DeprecationWarning。 (由 Nick Coghlan 在 bpo-31975 中贡献。)

xml¶

作为对 DTD 和外部实体检查的缓解,在默认情况下 xml.dom.minidom 和 xml.sax 模�将��处�外部实体。 (由 Christian Heimes 在 gh-61441 中贡献。)

xml.etree¶

find() 方法中的 ElementPath �述�现在�以将当�节点文本与 [. = "text"] 进行比较,而�仅是�节点中的文本。 �述�还�许添加空格以�高�读性。 (由 Stefan Behnel 在 bpo-31648 中贡献。)

xmlrpc.server¶

SimpleXMLRPCDispatcher.register_function 现在�以被用作装饰器。 (由 Xiang Zhang 在 bpo-7769 中贡献。)

zipapp¶

函数 create_archive() 现在接��选的 filter �数,以�许用户选择哪些文件应被加入归档包。 (由 Irmen de Jong 在 bpo-31072 中贡献。)

函数 create_archive() 现在接��选的 compressed �数,以生�压缩归档包。 �外也加入了命令行选项 --compress 以支�压缩。 (由 Zhiming Wang 在 bpo-31638 中贡献。)

zipfile¶

ZipFile 现在接�新的 compresslevel 形�,以控制压缩级别。 (由 Bo Bayles 在 bpo-21417 中贡献。)

ZipFile 所创建的归档包中的�目录现在会按字�表顺��存。 (由 Bernhard M. Wiedemann 在 bpo-30693 中贡献。)

C API 的改�¶

已实现了用于线程本地存储的新 API。 相关概述请�阅 PEP 539: 用于线程局部存储的新 C API,完整�考文档请查看 线程专属存储 (TSS) API。 (由 Masayuki Yamamoto 在 bpo-25658 中贡献。)

新的 上下文�� 功能开放了许多 新的 C API。

新的 PyImport_GetModule() 函数会返回之�所导入的具有给定�称的模�。 (由 Eric Snow 在 bpo-28411 中贡献。)

新的 Py_RETURN_RICHCOMPARE ��以简化丰富比较函数的编写。 (由 Petr Victorin 在 bpo-23699 中贡献。)

新的 Py_UNREACHABLE ��用于标记��到达的代�路径。 (由 Barry Warsaw 在 bpo-31338 中贡献。)

tracemalloc 现在通过新的 PyTraceMalloc_Track() 和 PyTraceMalloc_Untrack() 函数公开了一个 C API。 (由 Victor Stinner 在 bpo-30054 中贡献。)

新的 import__find__load__start() 和 import__find__load__done() ��标记�用于跟踪模�导入。 (由 Christian Heimes 在 bpo-31574 中贡献。)

结构体 PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc 和 wrapperbase 的字段 name 和 doc 现在的类型为 const char * 而�是 char *。 (由 Serhiy Storchaka 在 bpo-28761 中贡献。)

PyUnicode_AsUTF8AndSize() 和 PyUnicode_AsUTF8() 的结果类型现在是 const char * 而� char *。 (由 Serhiy Storchaka 在 bpo-28769 中贡献。)

PyMapping_Keys(), PyMapping_Values() 和 PyMapping_Items() 的结果现在肯定是列表,而��能是列表也�能是元组。 (由 Oren Milman 在 bpo-28280 中贡献。)

添加了函数 PySlice_Unpack() 和 PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在 bpo-27867 中贡献。)

PyOS_AfterFork() 已弃用,建议改用新的 functions PyOS_BeforeFork(), PyOS_AfterFork_Parent() 和 PyOS_AfterFork_Child()。 (由 Antoine Pitrou 在 bpo-16500 中贡献。)

曾�作为公共 API 一部分的 PyExc_RecursionErrorInst �例已被移除,因为它的�员永远�会被清�,�能在解释器的最终化过程中导致段错误。 由 Xavier de Gaye 在 bpo-22898 和 bpo-30697 中贡献。

添加 C API 对使用 timezone 的构造器 PyTimeZone_FromOffset() 和 PyTimeZone_FromOffsetAndName() 的时区的支�,以�通常 PyDateTime_TimeZone_UTC 使用 UTC �例。 由 Paul Ganssle 在 bpo-10381 中贡献。

PyThread_start_new_thread() 和 PyThread_get_thread_ident() 的结果类型以� PyThreadState_SetAsyncExc() 的 id 形�类型由 long 改为 unsigned long。 (由 Serhiy Storchaka 在 bpo-6532 中贡献。)

现在 PyUnicode_AsWideCharString() 在第二个�数为 NULL 且 wchar_t* 字符串包�空字符时会引� ValueError。 (由 Serhiy Storchaka 在 bpo-30708 中贡献。)

对�动顺�以�动�内存分�器管�的更改�味�早已记录在案的,对在调用大多数 C API 函数之�调用 Py_Initialize() 的�求的�赖现在�得更加强烈,未�循此�求�能导致嵌入�应用程�中的段错误。 请�阅此文档的 移�到 Python 3.7 一节以� C API 文档的 在Python�始化之� 一节了解更多细节。

新的 PyInterpreterState_GetID() 会返回给定解释器的唯一 ID。 (由 Eric Snow 在 bpo-29102 中贡献。)

现在当�用 UTF-8 模� 时 Py_DecodeLocale(), Py_EncodeLocale() 会使用 UTF-8 编�。 (由 Victor Stinner 在 bpo-29240 中贡献。)

PyUnicode_DecodeLocaleAndSize() 和 PyUnicode_EncodeLocale() 现在会为 surrogateescape 错误�柄使用当�区域编�。 (由 Victor Stinner 在 bpo-29240 中贡献。)

PyUnicode_FindChar() 的 start 和 end 形�的行为现在调整为与字符串切片类似。 (由 Xiang Zhang 在 bpo-28822 中贡献。)

构建的改�¶

对于 --without-threads 构建的支�已被移除。 threading 模�现在将总是�用。 (由 Antoine Pitrou 在 bpo-31370 中贡献。)

在� OSX UNIX 平�上已��包�用于构建 _ctypes 模�的完整 libffi 副本。 现在当在此类平�上构建 _ctypes 时需�事先装有 libffi 的副本。 (由 Zachary Ware 在 bpo-27979 中贡献。)

Windows 构建过程���赖 Subversion �拉�外部��,而是改用一段 Python 脚本从 GitHub 下载 zip 文件。 如果未在系统中找到 Python 3.6 (通过 py -3.6),则会使用 NuGet 下载一份 32 �的 Python 副本用于此目的。 (由 Zachary Ware 在 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�bpo-29507�bpo-29452 以� bpo-29286 中贡献。)

通过��优化方�,使 Python 在 Linux 上的�动时间缩短了 10%,在 macOS 上缩短了 30%。 (由 Victor Stinner, INADA Naoki 在 bpo-29585 中,以� Ivan Levkivskyi 在 bpo-31333 中贡献。)

由于��创建绑定方法案例的字节�更改,方法调用速度现在加快了 20%。 (由 Yury Selivanov 和 INADA Naoki 在 bpo-26110 中贡献。)

对 asyncio 模�里�的一些常用函数�了显著的性能优化。

  • asyncio.get_event_loop() 函数已ç»�改用 C é‡�新实现,使其执行速度加快了 15 å€�。 (由 Yury Selivanov 在 bpo-32296 中贡献。)

  • asyncio.Future 回调管ç�†å·²ç»�过优化。 (由 Yury Selivanov 在 bpo-32348 中贡献。)

  • asyncio.gather() 的执行速度现在加快了 15%。 (由 Yury Selivanov 在 bpo-32355 中贡献。)

  • 当 delay å�‚数为零或负值时 asyncio.sleep() 的执行速度现在加快了 2 å€�。 (由 Andrew Svetlov 在 bpo-32351 中贡献。)

  • asyncio 调试模å¼�的执行开销已获å‡�轻。 (由 Antoine Pitrou 在 bpo-31970 中贡献。)

作为 PEP 560 工作 的结果,typing 的导入时间已�少了 7 �,许多与类型相关的�作现在会执行得更快。 (由 Ivan Levkivskyi 在 bpo-32226 中贡献。)

sorted() 和 list.sort() 已�过优化,在通常情况下执行速度��� 40-75%。 (由 Elliot Gorokhovsky 在 bpo-28685 中贡献。)

dict.copy() 的执行速度现在加快了 5.5 �。 (由 Yury Selivanov 在 bpo-31179 中贡献。)

当 name 未找到并且 obj 未�载 object.__getattr__() 或 object.__getattribute__() 时 hasattr() 和 getattr() 现在会比原�快大约 4 �。 (由 INADA Naoki 在 bpo-32544 中贡献。)

在字符串中�索特定的 Unicode 字符(例如乌克兰语字�“Є�)会比�索其他字符慢上 25 �。 而现在最�情况下也�会慢上 3 �。 (由 Serhiy Storchaka 在 bpo-24821 中贡献。)

collections.namedtuple() 工厂对象已��写实现,使得创建具�元组的速度加快了 4 到 6 �。 (由 Jelle Zijlstra 在 bpo-28638 中贡献,进一步的改进由 INADA Naoki, Serhiy Storchaka 和 Raymond Hettinger 贡献。)

现在 date.fromordinal() 和 date.fromtimestamp() 在通常情况下执行速度��� 30%。 (由 Paul Ganssle 在 bpo-32403 中贡献。)

由于使用了 os.scandir(),现在 os.fwalk() 函数执行速度��了 2 �。 (由 Serhiy Storchaka 在 bpo-25996 中贡献。)

由于使用了 os.scandir() 函数,shutil.rmtree() 函数的执行速度已���了 20--40%。 (由 Serhiy Storchaka 在 bpo-28564 中贡献。)

正则表达� 忽略大�写的匹�和�索已获得优化。 现在�索�些模�的速度��了 20 �。 (由 Serhiy Storchaka 在 bpo-30285 中贡献。)

re.compile() 现在会将 flags 形�转�为 int 对象,如果它是 RegexFlag 的�。 它现在会和 Python 3.5 一样快,而比 Python 3.6 快大约 10%,实际速度�决于具体的模�。 (由 INADA Naoki 在 bpo-31671 中贡献。)

selectors.EpollSelector, selectors.PollSelector 和 selectors.DevpollSelector 这几个类的 modify() 方法在�负载下�以加快 10% 左�。 (由 Giampaolo Rodola' 在 bpo-30014 中贡献。)

常�折�已�从窥孔优化器�移至新的 AST 优化器,�者�以以更高的一致性�执行优化。 (由 Eugene Toder 和 INADA Naoki 在 bpo-29469 和 bpo-11549 中贡献。)

abc 中的大部分函数和方法已�用 C �写。 这使得创建抽�基类以�调用其 isinstance() 和 issubclass() 的速度加快了 1.5 �。 这也使得 Python �动耗时�少了 10%。 (由 Ivan Levkivskyi 和 INADA Naoki 在 bpo-31333 中贡献。)

在�构造�类时,通过使用快速路径构造器使得 datetime.date 和 datetime.datetime 的替代构造器获得了显著的速度��。 (由 Paul Ganssle 在 bpo-32403 中贡献。)

在特定情况下 array.array 实例的比较速度已获得很大��。 现在当比较存放相�的整数类型的值的数组时会比原�快 10 到 70 �。 (由 Adrian Wielgosik 在 bpo-24700 中贡献。)

在大多数平�上 math.erf() 和 math.erfc() 函数现在使用(更快的)C 库实现。 (由 Serhiy Storchaka 在 bpo-26121 中贡献。)

其他 CPython 实现的改�¶

  • 跟踪钩å­�现在å�¯ä»¥é€‰æ‹©ä¸�接收 line 而选择从解释器接收 opcode 事件,具体å�šæ³•æ˜¯åœ¨è¢«è·Ÿè¸ªçš„å¸§ä¸Šç›¸åº”åœ°è®¾ç½®æ–°çš„ f_trace_lines å’Œ f_trace_opcodes 属性。 (由 Nick Coghlan 在 bpo-31344 中贡献。)

  • ä¿®å¤�了一些命å��空间包模å�—属性的一致性问题。 命å��空间模å�—对象的 __file__ 被设置为 None (原先未设置),对象的 __spec__.origin 也被设置为 None (之å‰�为字符串 "namespace")。 å�‚è§� bpo-32305。 而且,命å��空间模å�—对象的 __spec__.loader 被设置的值与 __loader__ 相å�Œ (原先å‰�者被设置为 None)。 å�‚è§� bpo-32303。

  • locals() 字典现在以å�˜é‡�定义的è¯�法顺åº�显示。 原先未定义顺åº�。 (由 Raymond Hettinger 在 bpo-32690 中贡献。)

  • distutils upload 命令ä¸�会å†�试图将行结æ�Ÿç¬¦ CR 改为 CRLF。 这修å¤�了 sdists 的一个以与 CR 等价的字节结æ�Ÿçš„æ•°æ�®æ�Ÿå��问题。 (由 Bo Bayles 在 bpo-32304 中贡献。)

已弃用的 Python 行为¶

在推导�和生�器表达�中的 yield 语�(包括 yield 和 yield from ��)现在已弃用(最左端的 for ��中的�迭代对象表达�除外)。 这确�了推导�总是立�返回适当类型的容器(而�是有�能返回 generator iterator 对象),这样生�器表达��会试图将它们的��输出与任何�自显� yield 表达�的输出交错起�。 在 Python 3.7 中,这样的表达�会在编译时引� DeprecationWarning,在 Python 3.8 中则将引� SyntaxError。 (由 Serhiy Storchaka 在 bpo-10544 中贡献。)

从 object.__complex__() 返回一个 complex 的�类的行为已弃用并将在未�的 Python 版本中引�错误。 这使得 __complex__() 的行为与 object.__int__() 和 object.__float__() ��一致。 (由 Serhiy Storchaka 在 bpo-28894 中贡献。)

已弃用的 Python 模��函数和方法¶

aifc¶

aifc.openfp() 已弃用并将在 Python 3.9 中被移除。 请改用 aifc.open()。 (由 Brian Curtin 在 bpo-31985 中贡献。)

asyncio¶

对 asyncio.Lock 和其他 asyncio �步原语的 await 实例的直接支�已弃用。 想�获�并释放�步资�必须使用异步上下文管�器。 (由 Andrew Svetlov 在 bpo-32253 中贡献。)

asyncio.Task.current_task() 和 asyncio.Task.all_tasks() 方法已弃用。 (由 Andrew Svetlov 在 bpo-32250 中贡献。)

collections¶

在 Python 3.8 中,collections.abc 内的抽象基类将�会�通过常规的 collections 模�公开。 这有助于更清晰地区别具体类与抽象基类。 (由 Serhiy Storchaka 在 bpo-25988 中贡献。)

dbm¶

dbm.dumb 现在支�读��读文件,且当其未被更改时�会�写入索引文件。 现在如果索引文件丢失并在 'r' 与 'w' 模�下被�新创建,则会�出已弃用警告(在未�的 Python �布版中将改为错误)。 (由 Serhiy Storchaka 在 bpo-28847 中贡献。)

enum¶

在 Python 3.8 中,�试在 Enum 类中检查� Enum 对象将引� TypeError (例如 1 in Color);类似地,�试在 Flag �员中检查� Flag 对象也将引� TypeError (例如 1 in Perm.RW);目�,两��作�会返回 False。 (由 Ethan Furman 在 bpo-33217 中贡献。)

gettext¶

使用�整数值在 gettext 中选择�数形�现在已弃用。 它从未正确地�挥作用。 (由 Serhiy Storchaka 在 bpo-28692 中贡献。)

importlib¶

方法 MetaPathFinder.find_module() (被 MetaPathFinder.find_spec() 替代) 和 PathEntryFinder.find_loader() (被 PathEntryFinder.find_spec() 替代) 都已在 Python 3.4 中被弃用,现在会�出 DeprecationWarning。 (由 Matthias Bussonnier 在 bpo-29576 中贡献。)

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

locale¶

locale.format() 已弃用,请改用 locale.format_string()。 (由 Garvit 在 bpo-10379 中贡献。)

macpath¶

macpath 现在已弃用,将在 Python 3.8 中被移除。 (由 Chi Hsuan Yen 在 bpo-9850 中贡献。)

threading¶

dummy_threading 和 _dummy_thread 已弃用。 构建�用线程的 Python 已���能。 请改用 threading。 (由 Antoine Pitrou 在 bpo-31370 中贡献。)

socket¶

socket.htons() 和 socket.ntohs() 中的�默�数截断已弃用。 在未�的 Python 版本中,如果传入的�数长度大于 16 比特�,将会引�异常。 (由 Oren Milman 在 bpo-28332 中贡献。)

ssl¶

ssl.wrap_socket() 已弃用。 请改用 ssl.SSLContext.wrap_socket()。 (由 Christian Heimes 在 bpo-28124 中贡献。)

sunau¶

sunau.openfp() 已弃用并将在 Python 3.9 中被移除。 请改用 sunau.open()。 (由 Brian Curtin 在 bpo-31985 中贡献。)

sys¶

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

未写入文档的 sys.callstats() 函数已弃用并将在未�的 Python 版本中被移除。 (由 Victor Stinner 在 bpo-28799 中贡献。)

wave¶

wave.openfp() 已弃用并将在 Python 3.9 中被移除。 请改用 wave.open()。 (由 Brian Curtin 在 bpo-31985 中贡献。)

已弃用的 C API 函数和类型¶

如果 Py_LIMITED_API 未设定或设定为范围在 0x03050400 和 0x03060000 (��) 之间,或为 0x03060100 或更高的值,函数 PySlice_GetIndicesEx() 已弃用并被一个�所替代。 (由 Serhiy Storchaka 在 bpo-27867 中贡献。)

PyOS_AfterFork() 已弃用。 请改用 PyOS_BeforeFork(), PyOS_AfterFork_Parent() 或 PyOS_AfterFork_Child()。 (由 Antoine Pitrou 在 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 �置文件 �供了一个使用 CPython 测试套件中的 SSL 兼容性测试架构 基于 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 中贡献,进一步的改进由 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 中贡献。)

  • 未被使用的 distutils install_misc 命令已被移除。 (由 Eric N. Vander Weele 在 bpo-29218 中贡献。)

移除的模�¶

fpectl 模�已被移除。 它从未被默认�用,从未在 x86-64 上正确�挥效果,并且它对 Python ABI 的改�会导致 C 扩展的�外��。 (由 Nathaniel J. Smith 在 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 中贡献。)

�动器�以�行 py -0 �列出已安装的所有 python,默认版本会以星�标出。 �行 py -0p 将�时列出相应的路径。 如果�行 py 时指定了无法匹�的版本,它将显示 简短形� 的�用版本列表。 (由 Steve Barnes 在 bpo-30362 中贡献。)

移�到 Python 3.7¶

本节列出了先��述的更改以��能需�更改代�的其他错误修正.

Python 行为的更改¶

  • async å’Œ await 现在是ä¿�留关键字。 使用了这些å��称作为标识符的代ç �现在将引å�‘ SyntaxError。 (由 Jelle Zijlstra 在 bpo-30406 中贡献。)

  • PEP 479 在 Python 3.7 中对所有代ç �å�¯ç”¨ï¼Œåœ¨å��程和生æˆ�器中直接或间接引å�‘çš„ StopIteration 异常会被转æ�¢ä¸º RuntimeError 异常。 (由 Yury Selivanov 在 bpo-32670 中贡献。)

  • object.__aiter__() 方法ä¸�å†�能被声明为异步的。 (由 Yury Selivanov 在 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 和 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 å’Œ bpo-33540 中贡献。)

  • socketserver.ForkingMixIn.server_close() 现在会等等所有å­�进程完æˆ�。 将新增的 socketserver.ForkingMixIn.block_on_close 类属性设为 False å�¯èŽ·å¾— 3.7 之å‰�版本的行为。 (由 Victor Stinner 在 bpo-31151 å’Œ bpo-33540 中贡献。)

  • æŸ�些情况下 locale.localeconv() 函数现在会临时将 LC_CTYPE 区域设置为 LC_NUMERIC 的值。 (由 Victor Stinner 在 bpo-31900 中贡献。)

  • 如果 path 为字符串 pkgutil.walk_packages() 现在会引å�‘ ValueError。 之å‰�则是返回一个空列表。 (由 Sanyam Khurana 在 bpo-24744 中贡献。)

  • string.Formatter.format() 的格å¼�字符串å�‚数现在为 ä»…é™�ä½�ç½® å�‚数。 将其作为关键字å�‚数传入的方å¼�自 Python 3.5 起已弃用。 (由 Serhiy Storchaka 在 bpo-29193 中贡献。)

  • ç±» http.cookies.Morsel 的属性 key, value å’Œ coded_value 现在å�‡ä¸ºå�ªè¯»ã€‚ 对其赋值的æ“�作自 Python 3.5 起已弃用。 è¦�设置它们的值请使用 set() 方法。 (由 Serhiy Storchaka 在 bpo-29192 中贡献。)

  • os.makedirs() çš„ mode å�‚æ•°ä¸�会å†�å½±å“�新建中间层级目录的æ�ƒé™�ä½�。 è¦�设置它们的文件æ�ƒé™�ä½ å�¯ä»¥åœ¨å�‘起调用 makedirs() 之å‰�设置 umask。 (由 Serhiy Storchaka 在 bpo-19930 中贡献。)

  • struct.Struct.format 的类型现在是 str 而é�ž bytes。 (由 Victor Stinner 在 bpo-21071 中贡献。)

  • parse_multipart() 现在接å�— encoding å’Œ errors å�‚数并返回与 FieldStorage 相å�Œçš„结果:对于é�žæ–‡ä»¶å­—段,与键相关è�”的值是一个字符串列表,而é�žå­—节串列表。(由 Pierre Quentel 在 bpo-29979 中贡献。)

  • 由于 socket 中的内部更改,在由旧版 Python 中的 socket.share 所创建的套接字上调用 socket.fromshare() å·²ä¸�å�—支æŒ�。

  • BaseException çš„ repr 已更改为ä¸�包å�«æœ«å°¾çš„逗å�·ã€‚ 大多数异常都会å�—此更改影å“�。 (由 Serhiy Storchaka 在 bpo-30399 中贡献。)

  • datetime.timedelta çš„ repr 已更改为在输出中包å�«å…³é”®å­—å�‚数。 (由 Utkarsh Upadhyay 在 bpo-30302 中贡献。)

  • 因为 shutil.rmtree() 现在是使用 os.scandir() 函数实现的,用户指定的å�¥æŸ„ onerror 现在被调用时如果列目录失败会附带第一个å�‚æ•° os.scandir 而ä¸�是 os.listdir。

  • 未æ�¥å�¯èƒ½åŠ å…¥åœ¨æ­£åˆ™è¡¨è¾¾å¼�中对 Unicode 技术标准 #18 中嵌套集å�ˆä¸Žé›†å�ˆæ“�作的支æŒ�。 这会改å�˜çŽ°æœ‰è¯­æ³•ã€‚ 为了推动这项未æ�¥çš„æ”¹å�˜ï¼Œç›®å‰�在有歧义的情况下会引å�‘ FutureWarning。 这包括以字é�¢å€¼ '[' 开头或包å�«å­—é�¢å€¼å­—符åº�列 '--', '&&', '~~' 以å�Š '||' 的集å�ˆã€‚ è¦�é�¿å…�警告,请用å��æ–œæ� å¯¹å…¶è¿›è¡Œè½¬ä¹‰ã€‚ (由 Serhiy Storchaka 在 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 和 bpo-32308 中贡献。)

  • re.escape() 更改为å�ªè½¬ä¹‰æ­£åˆ™è¡¨è¾¾å¼�特殊字符,而ä¸�转义 ASCII å­—æ¯�ã€�æ•°å­—å’Œ '_' 以外的所有字符。 (由 Serhiy Storchaka 在 bpo-29995 中贡献。)

  • tracemalloc.Traceback 帧现在是按从最旧到最新排åº�,以便与 traceback 更为一致。 (由 Jesse Bakker 在 bpo-32121 中贡献。)

  • 在支æŒ� socket.SOCK_NONBLOCK 或 socket.SOCK_CLOEXEC 标志ä½�çš„æ“�作系统上,socket.type ä¸�å†�应用它们。 因此,åƒ� if sock.type == socket.SOCK_STREAM 之类的检测会在所有平å�°ä¸ŠæŒ‰é¢„期的方å¼�工作。 (由 Yury Selivanov 在 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 中贡献。)

  • 在 asyncio 中,loop.sock_recv(), loop.sock_sendall(), loop.sock_accept(), loop.getaddrinfo(), loop.getnameinfo() 已被更改为正确的å��程方法以与培训五日文档相匹é…�。 之å‰�,这些方法会返回 asyncio.Future 实例。 (由 Yury Selivanov 在 bpo-32327 中贡献。)

  • asyncio.Server.sockets 现在会返回æœ�务器套接字列表的副本,而ä¸�是直接地返回它。 (由 Yury Selivanov 在 bpo-32662 中贡献。)

  • Struct.format 现在是一个 str 实例而é�ž bytes 实例。 (由 Victor Stinner 在 bpo-21071 中贡献。)

  • 现在å�¯ä»¥é€šè¿‡å°† required=True ä¼ ç»™ ArgumentParser.add_subparsers() 使得 argparse å­�è§£æž�器æˆ�为必需的。 (由 Anthony Sottile 在 bpo-26510 中贡献。)

  • ast.literal_eval() 现在更为严格。 ä»»æ„�地加å‡�æ•°å­—å·²ä¸�å†�被å…�许。 (由 Serhiy Storchaka 在 bpo-31778 中贡献。)

  • 当一个日期超出 0001-01-01 到 9999-12-31 范围时 Calendar.itermonthdates 现在将始终如一地引å�‘异常,以便支æŒ�ä¸�能容å¿�此类异常的应用程åº�,å�¯ä»¥ä½¿ç”¨æ–°å¢žçš„ Calendar.itermonthdays3 å’Œ Calendar.itermonthdays4。 这些新方法返回元组,并且其ä¸�å�— datetime.date 所支æŒ�的范围é™�制。 (由 Alexander Belopolsky 在 bpo-28292 中贡献。)

  • collections.ChainMap 现在会ä¿�留底层映射的顺åº�。 (由 Raymond Hettinger 在 bpo-32792 中贡献。)

  • 如果在解释器关闭期间被调用,concurrent.futures.ThreadPoolExecutor å’Œ concurrent.futures.ProcessPoolExecutor çš„ submit() 方法现在会引å�‘ RuntimeError。 (由 Mark Nemec 在 bpo-33097 中贡献。)

  • configparser.ConfigParser 构造器现在使用 read_dict() æ�¥å¤„ç�†é»˜è®¤å€¼ï¼Œä»¥ä½¿å…¶è¡Œä¸ºä¸Žè§£æž�器的其余部分ä¿�æŒ�致。 在默认字典中的é�žå­—符串键和值现在会被éš�å¼�地转æ�¢ä¸ºå­—符串。 (由 James Tocknell 在 bpo-23835 中贡献。)

  • 一些未写入文档的内部导入已被移除。 一个例å­�是 os.errno å·²ä¸�å†�å�¯ç”¨ï¼›åº”改为直接使用 import errno。 请注æ„�此类未写入文档的内部导入å�¯èƒ½æœªç»�通知地éš�时被移除,甚至是在微版本å�·å�‘行版中移除。

C API 的�化¶

函数 PySlice_GetIndicesEx() 被认为对于大���的�列�说并�安全。 如果切片索引�是 int 的实例,而是实现了 __index__() 方法的对象,则�列�以在其长度被传给 PySlice_GetIndicesEx() 之�调整大�。 这�能导致返回超出�列长度的索引�。 为了���能的问题,请使用新增的函数 PySlice_Unpack() 和 PySlice_AdjustIndices()。 (由 Serhiy Storchaka 在 bpo-27867 中贡献。)

CPython 字节�的改�¶

新增了两个�作�: LOAD_METHOD 和 CALL_METHOD。 (由 Yury Selivanov 和 INADA Naoki 在 bpo-26110 中贡献。)

STORE_ANNOTATION �作�已被移除。 (由 Mark Shannon 在 bpo-32550 中贡献。)

Windows 专属的改�¶

用于覆盖 sys.path 的文件现在被命�为 <python-executable>._pth 而�是 'sys.path'。 请�阅 查找模� 了解更多信�。 (由 Steve Dower 在 bpo-28137 中贡献。)

其他 CPython 实现的改�¶

为了准备在未�对公开的 CPython �行时�始化 API 进行潜在更改(请�阅 PEP 432 获�最�但略为过时的文稿),CPython 内部的�动和�置管�逻辑已�过大幅�构。 虽然这些更新旨在对嵌入�应用程�和常规的 CPython CLI 用户都完全�明,但它们在这里被��是因为�构会改�解释器�动期间许多�作的内部顺�,因此�能�示出原先��的缺陷,这�能存在于嵌入�应用程�中,或是在 CPython 自身内部。 (最�由 Nick Coghlan 和 Eric Snow 作为 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 中贡献。)

Python 3.7.1 中的���化¶

从 3.7.1 开始,Py_Initialize() 现在始终会读�并�循与 Py_Main() 相�的环境设置(在更早的 Python 版本中,它会�循一个错误定义的环境���集,而在 Python 3.7.0 中则会由于 bpo-34247 而完全�读�它们)。 如果�想�此行为,请在调用 Py_Initialize() 之�将 Py_IgnoreEnvironmentFlag 设为 1。

在 3.7.1 中,上下文��的 C API 已 获得更新 以使用 PyObject 指针。 �请�阅 bpo-34762。

在 3.7.1 中,当�供�带末尾新行的输入时 tokenize 模�现在会��地添加 NEWLINE 形符。 此行为现在已与 C �法分�器的内部行为相匹�。 (由 Ammar Askar 在 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 中贡献。。)

Python 3.7.10 中的���化¶

早先的 Python 版本�许使用 ; 和 & 作为 urllib.parse.parse_qs() 和 urllib.parse.parse_qsl() 中 query 形�的分隔键。 出于安全考虑,也为了�循更新的 W3C 推�设置,这已被改为��许�个分隔键,默认为 &。 这一改�还会影� cgi.parse() 和 cgi.parse_multipart() 因为它们在内部使用了�影�的函数。 �了解更多细节,请查看它们�自的文档。 (由 Adam Goldschmidt, Senthil Kumaran 和 Ken Jin 在 bpo-42967 中贡献。)

Python 3.7.11 中的���化¶

新的安全修正将 ftplib.FTP 的行为改�当设置被动数�通�时�信任远程�务器所��的 IPv4 地�。 我们会改为�用 ftp �务器的 IP 地�。 对于需�原先的行为的�常�代�,请在你的 FTP 实例上将 trust_server_pasv_ipv4_address 属性设为 True。 (�� gh-87451。)

在 URL 中存在�行符或制表符�能会导致��形�的攻击。 根�更新了 RFC 3986 的 WHATWG 规范,解�器 urllib.parse() 将从 URL 中去除 ASCII �行符 \n, \r 和制表符 \t 以防止这�攻击。 移除的字符将由一个新的模�层级�� urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE �控制。 (�� gh-88048。)

3.7.14 中的��安全特性¶

使用�进制以外的底,如 2(二进制)�4�8(八进制)�16(�六进制)�32 以外作为基数在 int 和 str 之间进行转�,如果字符串形�的数字数�超过一个�制,会抛出 ValueError,以��因算法��而导致的潜在拒��务攻击。这是对 CVE-2020-10735 的缓解方案。这个�制�以通过环境���命令行旗标或 sys API 进行�置或�用。�� integer string conversion length limitation 文档。默认�制是字符串形�的 4300 �数字。