Python 3.4 新特性

作者:

R. David Murray <rdmurray@bitdance.com> (编辑)

本文介绍了 Python 3.4 相对于 3.3 的新特性。Python 3.4 于 2014 年 3 月 16 日发布。有关详细信息,请参阅变更日志

另请参阅

PEP 429 – Python 3.4 发布计划

摘要 – 版本亮点

新语法特性

  • Python 3.4 中没有添加新的语法特性。

其他新特性

新的库模块

显著改进的库模块

安全改进

CPython 实现改进

请继续阅读,以获取面向用户的更改的完整列表,包括许多其他较小的改进、CPython 优化、弃用和潜在的移植问题。

新功能

PEP 453:在 Python 安装中显式引导 PIP

默认引导 pip

新的 ensurepip 模块(在 PEP 453 中定义)提供了一个标准的跨平台机制,用于将 pip 安装程序引导到 Python 安装和虚拟环境中。Python 3.4.0 中包含的 pip 版本是 pip 1.5.4,未来的 3.4.x 维护版本会将捆绑的版本更新为创建候选版本时可用的最新版本 pip

默认情况下,命令 pipXpipX.Y 将安装在所有平台上(其中 X.Y 代表 Python 安装的版本),以及 pip Python 包及其依赖项。在 Windows 和所有平台上的虚拟环境中,还将安装未版本化的 pip 命令。在其他平台上,系统范围的未版本化 pip 命令通常指的是单独安装的 Python 2 版本。

pyvenv 命令行实用程序和 venv 模块使用 ensurepip 模块,使 pip 在虚拟环境中随时可用。使用命令行实用程序时,默认安装 pip,而使用 venv 模块的 API 时,必须显式请求安装 pip

对于 CPython POSIX 系统上的源代码构建make installmake altinstall 命令默认引导 pip。此行为可以通过配置选项控制,并通过 Makefile 选项覆盖。

在 Windows 和 Mac OS X 上,CPython 安装程序现在默认安装 pip 以及 CPython 本身(用户可以选择在安装过程中不安装它)。Windows 用户需要选择加入自动 PATH 修改,才能默认从命令行使用 pip,否则仍然可以通过 Windows 的 Python 启动器作为 py -m pip 访问。

PEP 中所述,平台打包者可以选择不默认安装这些命令,只要在调用时,它们提供关于如何在该平台上安装这些命令的清晰而简单的指导(通常使用系统包管理器)。

注意

为了避免并行 Python 2 和 Python 3 安装之间的冲突,当直接调用 ensurepip 时,默认只引导版本化的 pip3pip3.4 命令 - 还需要 --default-pip 选项来请求未版本化的 pip 命令。pyvenv 和 Windows 安装程序确保在这些环境中可以使用非限定的 pip 命令,并且始终可以通过 -m 开关而不是直接调用 pip,以避免在具有多个 Python 安装的系统上出现歧义。

文档更改

作为此更改的一部分,文档的安装 Python 模块分发 Python 模块部分已完全重新设计为简短的入门和 FAQ 文档。大多数打包文档现在已移至 Python Packaging Authority 维护的 Python Packaging User Guide 和各个项目的文档中。

但是,由于此迁移目前仍未完成,这些指南的旧版本仍然可以作为使用 setuptools 构建 C 和 C++ 扩展使用 setuptools 构建 C 和 C++ 扩展使用。

另请参阅

PEP 453 – 在 Python 安装中显式引导 pip

该 PEP 由 Donald Stufft 和 Nick Coghlan 撰写,由 Donald Stufft、Nick Coghlan、Martin von Löwis 和 Ned Deily 实现。

PEP 446:新创建的文件描述符不可继承

PEP 446 使新创建的文件描述符不可继承。一般来说,这是应用程序需要的行为:当启动新进程时,让当前打开的文件也在新进程中打开可能会导致各种难以发现的错误,并可能导致安全问题。

但是,在某些情况下需要继承。为了支持这些情况,可以使用以下新函数和方法

另请参阅

PEP 446 – 使新创建的文件描述符不可继承

该 PEP 由 Victor Stinner 撰写和实现。

编解码器处理的改进

自从首次引入以来,codecs模块一直旨在作为类型中立的动态编码和解码系统运行。然而,它与 Python 文本模型的紧密耦合,特别是内置的strbytesbytearray类型的类型限制便利方法,在历史上掩盖了这一事实。

作为澄清情况的关键一步,codecs.encode()codecs.decode()便利函数现在在 Python 2.7、3.3 和 3.4 中正确记录。这些函数自 Python 2.4 以来就存在于codecs模块中(并且已包含在回归测试套件中),但以前只能通过运行时内省发现。

strbytesbytearray上的便利方法不同,codecs便利函数在 Python 2 和 Python 3 中都支持任意编解码器,而不是仅限于 Unicode 文本编码(在 Python 3 中)或basestring <-> basestring 转换(在 Python 2 中)。

在 Python 3.4 中,解释器能够识别标准库中提供的已知非文本编码,并在适当的时候将用户引导至这些通用便利函数

>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs

在一个相关的更改中,只要在不破坏向后兼容性的情况下可行,在编码和解码操作期间引发的异常都会包装在同类型的链式异常中,该异常会提及导致错误的编解码器的名称

>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)

最后,如以上示例所示,这些改进允许恢复在 Python 3.2 中恢复的非 Unicode 编解码器的便利别名。这意味着现在可以将二进制数据编码为十六进制表示形式(例如)并从中解码,如下所示

>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'

标准库中提供的二进制和文本转换在二进制转换文本转换中详细说明。

(由 Nick Coghlan 在 bpo-7475, bpo-17827, bpo-17828bpo-19619 中贡献。)

PEP 451:用于导入系统的 ModuleSpec 类型

PEP 451 提供了对导入机制将用于加载模块的信息(即模块规范)的封装。这有助于简化导入实现和几个与导入相关的 API。此更改也是未来几个与导入相关的改进的垫脚石。

PEP 中面向公众的更改是完全向后兼容的。此外,它们对除导入器作者之外的所有人都应该是透明的。关键的查找器和加载器方法已被弃用,但它们将继续工作。新的导入器应使用 PEP 中描述的新方法。现有导入器应更新以实现新方法。请参阅已弃用部分,了解应替换的方法及其替换方法列表。

其他语言更改

对核心 Python 语言进行的一些较小的更改是

  • Unicode 数据库已更新为 UCD 版本 6.3。

  • min()max()现在接受一个 default 仅关键字参数,该参数可用于指定它们在评估的迭代器没有元素时返回的值。(由 Julian Berman 在 bpo-18111 中贡献。)

  • 模块对象现在是可弱引用的。

  • 模块 __file__ 属性(和相关值)现在默认情况下应始终包含绝对路径,唯一的例外是使用相对路径直接执行脚本时的 __main__.__file__。(由 Brett Cannon 在 bpo-18416 中贡献。)

  • 除非使用 surrogatepass 错误处理程序,否则所有 UTF-* 编解码器(UTF-7 除外)现在在编码和解码期间都拒绝代理项,但 UTF-16 解码器除外(它接受有效的代理项对)和 UTF-16 编码器(它在编码非 BMP 字符时会生成它们)。(由 Victor Stinner、Kang-Hao (Kenny) Lu 和 Serhiy Storchaka 在 bpo-12892 中贡献。)

  • 新的德语 EBCDIC 编解码器 cp273。(由 Michael Bierenfeld 和 Andrew Kuchling 在 bpo-1097797 中贡献。)

  • 新增乌克兰语 编解码器 cp1125。(由 Serhiy Storchaka 在 bpo-19668 中贡献。)

  • bytes.join() 和 bytearray.join() 现在接受任意缓冲区对象作为参数。(由 Antoine Pitrou 在 bpo-15958 中贡献。)

  • int 构造函数现在接受任何具有 __index__ 方法作为其 *base* 参数的对象。(由 Mark Dickinson 在 bpo-16772 中贡献。)

  • 帧对象现在有一个 clear() 方法,用于清除帧中对局部变量的所有引用。(由 Antoine Pitrou 在 bpo-17934 中贡献。)

  • memoryview 现在被注册为一个 Sequence,并支持 reversed() 内置函数。(由 Nick Coghlan 和 Claudiu Popa 在 bpo-18690bpo-19078 中贡献。)

  • 由于 Argument Clinic 的引入以及对 inspectpydoc 模块的其他更改,help() 报告的签名在几种情况下得到了修改和改进。

  • __length_hint__() 现在是正式语言规范的一部分(请参阅 PEP 424)。(由 Armin Ronacher 在 bpo-16148 中贡献。)

新模块

asyncio

新的 asyncio 模块(在 PEP 3156 中定义)为 Python 提供了一个标准的、可插拔的事件循环模型,在标准库中提供了可靠的异步 I/O 支持,并使其他事件循环实现更容易与标准库和彼此之间进行互操作。

对于 Python 3.4,此模块被认为是临时 API

另请参阅

PEP 3156 – 异步 I/O 支持重启:“asyncio”模块

由 Guido van Rossum 编写和领导实现的 PEP。

ensurepip

新的 ensurepip 模块是 PEP 453 实现的主要基础设施。在正常情况下,最终用户不需要与此模块交互,但如果拒绝将 pip 自动引导到安装或虚拟环境中,则可以使用它手动引导 pip

ensurepip 包括 pip 的捆绑副本,该副本与它所附带的 CPython 版本的第一个候选版本一样是最新的(这适用于维护版本和功能版本)。ensurepip 不会访问互联网。如果安装可以访问互联网,则在运行 ensurepip 后,可以使用捆绑的 pippip 升级到比捆绑版本更新的版本。(请注意,这样一个升级版本的 pip 被认为是单独安装的软件包,如果卸载 Python,则不会被删除。)

该模块名为 *ensure*pip,因为如果在已经安装 pip 时调用它,它什么也不做。它还有一个 --upgrade 选项,如果已安装的 pip 版本比捆绑副本旧,则会使它安装 pip 的捆绑副本。

enum

新的 enum 模块(在 PEP 435 中定义)提供了枚举类型的标准实现,允许其他模块(例如 socket)通过用向后兼容的枚举值替换不透明的整数常量来提供更丰富的信息性错误消息和更好的调试支持。

另请参阅

PEP 435 – 向 Python 标准库添加枚举类型

由 Barry Warsaw、Eli Bendersky 和 Ethan Furman 编写的 PEP,由 Ethan Furman 实现。

pathlib

新的 pathlib 模块提供表示文件系统路径的类,这些路径具有适用于不同操作系统的语义。路径类分为*纯路径*(提供纯粹的计算操作,没有 I/O)和*具体路径*(继承自纯路径,但也提供 I/O 操作)。

对于 Python 3.4,此模块被认为是临时 API

另请参阅

PEP 428 – pathlib 模块 – 面向对象的文件系统路径

由 Antoine Pitrou 编写和实现的 PEP。

selectors

新的 selectors 模块(作为实现 PEP 3156 的一部分而创建)允许基于 select 模块原语构建高级且高效的 I/O 多路复用。

statistics

新的 statistics 模块(在 PEP 450 中定义)直接在标准库中提供一些核心统计功能。此模块支持计算数据序列的平均值、中位数、众数、方差和标准差。

另请参阅

PEP 450 – 向标准库添加统计模块

由 Steven D’Aprano 编写和实现的 PEP

tracemalloc

新的 tracemalloc 模块(在 PEP 454 中定义)是一个用于跟踪 Python 分配的内存块的调试工具。它提供以下信息

  • 跟踪对象分配的位置

  • 按文件名和行号划分的已分配内存块的统计信息:已分配内存块的总大小、数量和平均大小

  • 计算两个快照之间的差异以检测内存泄漏

另请参阅

PEP 454 – 添加新的 tracemalloc 模块以跟踪 Python 内存分配

由 Victor Stinner 编写和实现的 PEP

改进的模块

abc

可以使用新函数 abc.get_cache_token() 来知道何时使受对象图更改影响的缓存失效。(Łukasz Langa 在 bpo-16832 中贡献了此功能。)

新类 ABCABCMeta 作为其元类。使用 ABC 作为基类与指定 metaclass=abc.ABCMeta 具有基本相同的效果,但键入更简单,更易于阅读。(Bruno Dupuis 在 bpo-16049 中贡献了此功能。)

aifc

getparams() 方法现在返回一个 namedtuple 而不是普通元组。(Claudiu Popa 在 bpo-17818 中贡献了此功能。)

aifc.open() 现在支持上下文管理协议:当在 with 代码块中使用时,返回对象的 close() 方法将在代码块结束时自动调用。(Serhiy Storchacha 在 bpo-16486 中贡献了此功能。)

writeframesraw()writeframes() 方法现在接受任何 bytes-like object。(Serhiy Storchaka 在 bpo-8311 中贡献了此功能。)

argparse

FileType 类现在接受 encodingerrors 参数,这些参数会传递给 open()。(Lucas Maystre 在 bpo-11175 中贡献了此功能。)

audioop

audioop 现在支持 24 位采样。(Serhiy Storchaka 在 bpo-12866 中贡献了此功能。)

新的 byteswap() 函数将大端采样转换为小端采样,反之亦然。(Serhiy Storchaka 在 bpo-19641 中贡献了此功能。)

所有 audioop 函数现在都接受任何 bytes-like object。不接受字符串:它们以前不起作用,现在会立即引发错误。(Serhiy Storchaka 在 bpo-16685 中贡献了此功能。)

base64

base64 中的编码和解码函数现在接受任何 bytes-like object,而以前需要 bytesbytearray 实例。(Nick Coghlan 在 bpo-17839 中贡献了此功能。)

新函数 a85encode()a85decode()b85encode()b85decode() 提供了将二进制数据编码和解码为 Ascii85 和 git/mercurial Base85 格式的能力。 a85 函数具有可用于使其与 Ascii85 编码的变体兼容的选项,包括 Adobe 变体。(Martin Morrison、Mercurial 项目、Serhiy Storchaka 和 Antoine Pitrou 在 bpo-17618 中贡献了此功能。)

collections

ChainMap.new_child() 方法现在接受 m 参数,该参数指定要添加到链的子映射。这允许将现有映射和/或自定义映射类型用于子项。(Vinay Sajip 在 bpo-16613 中贡献了此功能。)

colorsys

RGB — YIQ 转换的系数位数已扩展,以便与 FCC NTSC 版本匹配。结果的变化应小于 1%,并且可能更好地匹配其他地方找到的结果。(Brian Landers 和 Serhiy Storchaka 在 bpo-14323 中贡献了此功能。)

contextlib

新的 contextlib.suppress 上下文管理器有助于澄清故意抑制单个语句中异常的代码的意图。(Raymond Hettinger 在 bpo-15806 和 Zero Piraeus 在 bpo-19266 中贡献了此功能。)

新的 contextlib.redirect_stdout() 上下文管理器使实用程序脚本更容易处理将其输出写入 sys.stdout 并且不提供任何重定向选项的非灵活 API。使用上下文管理器,sys.stdout 输出可以重定向到任何其他流,或者与 io.StringIO 结合使用,可以重定向到字符串。后者可能特别有用,例如,从一个旨在实现命令行界面的函数捕获输出。建议仅用于实用程序脚本,因为它会影响 sys.stdout 的全局状态。(Raymond Hettinger 在 bpo-15805 中贡献了此功能。)

contextlib 文档也已更新,以包括对单次使用、可重用和可重入上下文管理器之间差异的 讨论

dbm

dbm.open() 对象现在支持上下文管理协议。当在 with 语句中使用时,数据库对象的 close 方法将在代码块结束时自动调用。(Claudiu Popa 和 Nick Coghlan 在 bpo-19282 中贡献了此功能。)

dis

函数 show_code()dis()distb()disassemble() 现在接受一个仅限关键字的 file 参数,该参数控制它们在何处写入其输出。

dis 模块现在围绕 Instruction 类构建,该类提供对每个单独字节码操作的详细信息的面向对象访问。

新方法 get_instructions() 提供了一个迭代器,该迭代器为给定的 Python 代码段发出 Instruction 流。因此,现在可以编写一个程序,以与 dis 模块本身提供的方式不同的方式来检查和操作字节码对象。例如

>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE

dis 模块中的各种显示工具已被重写以使用这些新组件。

此外,一个新的应用友好的类 Bytecode 提供了一个面向对象的 API,用于以人类可读的形式检查字节码以及迭代指令。Bytecode 构造函数接受与 get_instruction() 相同的参数(外加一个可选的 current_offset),并且可以迭代生成的对象以产生 Instruction 对象。但它也有一个 dis 方法,等价于在构造函数参数上调用 dis,但以多行字符串的形式返回。

>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()       
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']

Bytecode 还有一个类方法 from_traceback(),它提供了操作回溯的能力(也就是说,print(Bytecode.from_traceback(tb).dis()) 等价于 distb(tb))。

(由 Nick Coghlan、Ryan Kelly 和 Thomas Kluyver 在 bpo-11816 和 Claudiu Popa 在 bpo-17916 中贡献。)

新函数 stack_effect() 计算给定操作码和参数对 Python 堆栈的影响,这是其他方式无法获得的信息。(由 Larry Hastings 在 bpo-19722 中贡献。)

doctest

一个新的 选项标志FAIL_FAST,在检测到第一个失败时立即停止测试运行。(由 R. David Murray 和 Daniel Urban 在 bpo-16522 中贡献。)

doctest 命令行接口现在使用 argparse,并有两个新选项,-o-f-o 允许在命令行上指定 doctest 选项,而 -f-o FAIL_FAST 的简写(与 unittest CLI 支持的类似选项并行)。(由 R. David Murray 在 bpo-11390 中贡献。)

doctest 现在将在扩展模块的 __doc__ 字符串中查找 doctest。(由 Zachary Ware 在 bpo-3158 中贡献。)

email

as_string() 现在接受一个 policy 参数,以便在生成字符串表示形式时覆盖消息的默认策略。这意味着现在可以在更多情况下使用 as_string,而不必为了将格式化参数传递给其 flatten 方法而创建和使用 generator。(由 R. David Murray 在 bpo-18600 中贡献。)

添加了新方法 as_bytes(),以生成消息的字节表示形式,其方式类似于 as_string 生成字符串表示形式的方式。它不接受 maxheaderlen 参数,但接受 unixfrompolicy 参数。Message__bytes__() 方法会调用它,这意味着 bytes(mymsg) 现在将产生直观的结果:包含完整格式化消息的字节对象。(由 R. David Murray 在 bpo-18600 中贡献。)

Message.set_param() 消息现在接受 replace 关键字参数。指定后,将更新关联的标头,而不会更改其在标头列表中的位置。为了向后兼容,默认值为 False。(由 R. David Murray 在 bpo-18891 中贡献。)

已添加一对新的 Message 子类(EmailMessageMIMEPart),以及一个新的子模块 contentmanager 和一个新的 policy 属性 content_manager。所有文档当前都在新模块中,该模块是作为 email 新的 临时 API 的一部分添加的。这些类提供了许多新方法,使从电子邮件消息中提取内容和向其中插入内容变得更加容易。有关详细信息,请参阅 contentmanager 文档和 email: 示例。这些 API 添加完成了作为 email6 项目一部分计划的大部分工作。当前临时 API 计划在 Python 3.5 中最终确定(可能在错误处理领域进行一些小的补充)。(由 R. David Murray 在 bpo-18891 中贡献。)

filecmp

新的 clear_cache() 函数提供了清除 filecmp 比较缓存的能力,该缓存使用 os.stat() 信息来确定自上次比较以来文件是否已更改。例如,如果文件可能已更改并在比特定文件系统的文件修改时间字段的分辨率更短的时间内重新检查,则可以使用此功能。(由 Mark Levitt 在 bpo-18149 中贡献。)

新的模块属性 DEFAULT_IGNORES 提供了用作 dircmp() 函数的 ignore 参数默认值的目录列表。(由 Eli Bendersky 在 bpo-15442 中贡献。)

functools

新的 partialmethod() 描述符将部分参数应用于描述符,就像 partial() 为普通可调用对象提供的那样。当包含在类定义中时,新的描述符还可以更轻松地使任意可调用对象(包括 partial() 实例)的行为类似于普通实例方法。(由 Alon Horev 和 Nick Coghlan 在 bpo-4331 中贡献。)

新的 singledispatch() 装饰器为 Python 标准库带来了对单分派泛型函数的支持。面向对象编程侧重于将对一组公共数据的多个操作分组到一个类中,而泛型函数则侧重于对操作的多种实现进行分组,使其能够处理不同类型的数据。

另请参阅

PEP 443 – 单分派泛型函数

该 PEP 由 Łukasz Langa 编写并实现。

total_ordering() 现在支持从底层比较函数返回 NotImplemented 的返回值。(由 Katie Miller 在 bpo-10042 中贡献。)

现在,stdlib 中包含 partial() 函数的纯 Python 版本;在 CPython 中,它被 C 加速版本覆盖,但其他实现可以使用它。(由 Brian Thorne 在 bpo-12428 中贡献。)

gc

新函数 get_stats() 返回一个包含自解释器启动以来收集统计信息的三代字典列表。(由 Antoine Pitrou 在 bpo-16351 中贡献。)

glob

新函数 escape() 提供了一种转义文件名中特殊字符的方法,使其不会成为 glob 扩展的一部分,而是按字面匹配。(由 Serhiy Storchaka 在 bpo-8402 中贡献。)

hashlib

新的 hashlib.pbkdf2_hmac() 函数提供了 PKCS#5 基于密码的密钥派生函数 2。(由 Christian Heimes 在 bpo-18582 中贡献。)

name 属性的 hashlib 哈希对象现在是一个正式支持的接口。它一直存在于 CPython 的 hashlib 中(尽管它没有为所有支持的哈希返回小写名称),但它不是一个公共接口,因此其他一些 Python 实现以前不支持它。(由 Jason R. Coombs 在 bpo-18532 中贡献。)

hmac

hmac 现在接受 bytearray 以及 bytes 作为 new() 函数的 key 参数,并且 new() 函数和 update() 方法的 msg 参数现在接受 hashlib 模块支持的任何类型。(由 Jonas Borgström 在 bpo-18240 中贡献。)

hmac.new() 函数的 digestmod 参数现在可以是 hashlib 识别的任何哈希摘要名称。此外,当前将 digestmod 的值默认为 MD5 的行为已弃用:在未来的 Python 版本中将没有默认值。(由 Christian Heimes 在 bpo-17276 中贡献。)

随着 block_sizename 属性的添加(以及 digest_size 属性的正式文档),hmac 模块现在完全符合 PEP 247 API。(由 Christian Heimes 在 bpo-18775 中贡献。)

html

新函数 unescape() 函数将 HTML5 字符引用转换为相应的 Unicode 字符。(由 Ezio Melotti 在 bpo-2927 中贡献。)

HTMLParser 接受一个新的关键字参数 convert_charrefs,当为 True 时,会自动转换所有字符引用。为了向后兼容,其值默认为 False,但在未来的 Python 版本中会更改为 True,因此建议您显式设置它并更新您的代码以使用此新功能。(由 Ezio Melotti 在 bpo-13633 中贡献。)

HTMLParserstrict 参数现已弃用。(由 Ezio Melotti 在 bpo-15114 中贡献。)

http

send_error() 现在接受一个可选的额外 explain 参数,该参数可用于提供扩展的错误描述,如果存在硬编码的默认值,则会覆盖该默认值。此扩展的错误描述将使用 error_message_format 属性进行格式化,并作为错误响应的主体发送。(由 Karl Cow 在 bpo-12921 中贡献。)

http.server 命令行界面 现在有一个 -b/--bind 选项,该选项使服务器侦听特定的地址。(由 Malte Swart 在 bpo-17764 中贡献。)

idlelib 和 IDLE

由于 idlelib 实现了 IDLE shell 和编辑器,并且不打算被其他程序导入,因此每次发布都会对其进行改进。请参阅 Lib/idlelib/NEWS.txt,其中包含自 3.3.0 以来的累积更改列表,以及未来 3.4.x 版本中的更改。也可以从 IDLE 帮助 ‣ 关于 IDLE 对话框中获取此文件。

importlib

InspectLoader ABC 定义了一个新方法 source_to_code(),它接受源数据和路径,并返回代码对象。默认实现等效于 compile(data, path, 'exec', dont_inherit=True)。(由 Eric Snow 和 Brett Cannon 在 bpo-15627 中贡献。)

InspectLoader 现在还具有 get_code() 方法的默认实现。但是,出于性能原因,通常需要覆盖默认实现。(由 Brett Cannon 在 bpo-18072 中贡献。)

作为 imp 模块弃用的一部分,reload() 函数已从 imp 移动到 importlib。(由 Berker Peksag 在 bpo-18193 中贡献。)

importlib.util 现在有一个 MAGIC_NUMBER 属性,用于访问字节码版本号。这取代了已弃用的 imp 模块中的 get_magic() 函数。(由 Brett Cannon 在 bpo-18192 中贡献。)

新的 importlib.util 函数 cache_from_source()source_from_cache() 取代了已弃用的 imp 模块中同名的函数。(由 Brett Cannon 在 bpo-18194 中贡献。)

importlib 引导程序 NamespaceLoader 现在符合 InspectLoader ABC,这意味着 runpypython -m 现在可以与命名空间包一起使用。(由 Brett Cannon 在 bpo-18058 中贡献。)

importlib.util 有一个新函数 decode_source(),它使用通用换行符处理从字节解码源代码。这对于实现 InspectLoader.get_source() 方法很有用。

importlib.machinery.ExtensionFileLoader 现在有一个 get_filename() 方法。这在最初的实现中被不小心遗漏了。(由 Eric Snow 在 bpo-19152 中贡献。)

inspect

inspect 模块现在提供了一个基本的 命令行界面,用于快速显示模块、类和函数的源代码和其他信息。(由 Claudiu Popa 和 Nick Coghlan 在 bpo-18626 中贡献。)

unwrap() 可以轻松地解开由 functools.wraps() 创建的包装函数链(以及任何在包装函数上设置 __wrapped__ 属性的其他 API)。(由 Daniel Urban、Aaron Iles 和 Nick Coghlan 在 bpo-13266 中贡献。)

作为新的 enum 模块实现的一部分,inspect 模块现在对自定义 __dir__ 方法和通过元类提供的动态类属性提供了更好的支持。(由 Ethan Furman 在 bpo-18929bpo-19030 中贡献。)

getfullargspec()getargspec() 现在使用 signature() API。这使它们能够支持更广泛的可调用对象,包括那些具有 __signature__ 属性的对象、那些具有参数诊所提供的元数据的对象、functools.partial() 对象等等。请注意,与 signature() 不同,这些函数仍然忽略 __wrapped__ 属性,并报告绑定方法的已绑定第一个参数,因此如果需要这些功能,仍然需要更新您的代码以直接使用 signature()。(由 Yury Selivanov 在 bpo-17481 中贡献。)

signature() 现在支持 CPython 函数的鸭子类型,这增加了对使用 Cython 编译的函数的支持。(由 Stefan Behnel 和 Yury Selivanov 在 bpo-17159 中贡献。)

ipaddress

ipaddress 在 Python 3.3 中作为 临时 API 添加到标准库。随着 Python 3.4 的发布,此限定已删除:ipaddress 现在被认为是稳定的 API,受制于维护向后兼容性的正常标准库要求。

如果地址是全局可路由的,则新的 is_global 属性为 True。(由 Peter Moody 在 bpo-17400 中贡献。)

logging

TimedRotatingFileHandler 有一个新的 atTime 参数,可用于指定应发生滚动的时间。(由 Ronald Oussoren 在 bpo-9556 中贡献。)

SocketHandlerDatagramHandler 现在支持 Unix 域套接字(通过将 port 设置为 None)。(由 Vinay Sajip 在提交 ce46195b56a9 中贡献。)

fileConfig() 现在接受 configparser.RawConfigParser 子类实例作为 fname 参数。这有助于在日志配置只是整个应用程序配置的一部分时使用配置文件,或者在应用程序将配置传递给 fileConfig() 之前修改配置时使用配置文件。(由 Vinay Sajip 在 bpo-16110 中贡献。)

现在可以通过提供验证函数作为新 verify 关键字参数的参数,在通过 logging.config.listen() 函数从套接字接收到的日志配置数据进行处理之前对其进行验证。(由 Vinay Sajip 在 bpo-15452 中贡献。)

marshal

默认的 marshal 版本已提升到 3。实现新版本的代码恢复了 Python2 的行为,即仅记录一份内部字符串的副本并在反序列化时保留内部化,并将此“一份副本”的功能扩展到任何对象类型(包括处理递归引用)。这减少了 .pyc 文件的大小以及模块从 .pyc(或 .pyo)文件加载时在内存中占用的内存量。(由 Kristján Valur Jónsson 在 bpo-16475 中贡献,Antoine Pitrou 在 bpo-19219 中进行了额外的加速。)

mmap

现在,mmap 对象可以进行弱引用。(由 Valerie Lambert 在 bpo-4885 中贡献。)

multiprocessing

在 Unix 系统上,为使用multiprocessing启动进程,添加了两种新的启动方法spawnforkserver。这些方法使进程与线程的混合更加健壮,并且 spawn 方法与 multiprocessing 在 Windows 上一直使用的语义相匹配。新函数 get_all_start_methods() 报告平台上可用的所有启动方法,get_start_method() 报告当前的启动方法,而 set_start_method() 设置启动方法。(由 Richard Oudkerk 在 bpo-8713 中贡献。)

multiprocessing 现在还引入了 context 的概念,它决定了子进程的创建方式。新函数 get_context() 返回一个使用指定启动方法的上下文。它具有与 multiprocessing 模块本身相同的 API,因此你可以使用它来创建将在该上下文中运行的 Pool 和其他对象。这使得框架和应用程序或同一应用程序的不同部分可以互相不干扰地使用 multiprocessing。(由 Richard Oudkerk 在 bpo-18999 中贡献。)

除非使用旧的 fork 启动方法,否则子进程不再从其父进程继承不需要的句柄/文件描述符(bpo-8713 的一部分)。

现在,multiprocessing 依赖于 runpy(它实现了 -m 开关)在使用 spawnforkserver 启动方法时,在子进程中正确地初始化 __main__。这解决了在子进程中,将 multiprocessing、-m 命令行开关和显式相对导入结合使用可能导致模糊故障的一些边缘情况。(由 Nick Coghlan 在 bpo-19946 中贡献。)

operator

新函数 length_hint() 提供了如何使用 __length_hint__() 特殊方法的规范实现,这是该语言功能的 PEP 424 正式规范的一部分。(由 Armin Ronacher 在 bpo-16148 中贡献。)

现在有一个纯 Python 版本的 operator 模块,可供参考和供 Python 的其他实现使用。(由 Zachary Ware 在 bpo-16694 中贡献。)

os

有一些新函数可以获取和设置文件描述符(os.get_inheritable()os.set_inheritable())或 Windows 句柄(os.get_handle_inheritable()os.set_handle_inheritable())的可继承标志

新函数 cpu_count() 报告 Python 正在运行的平台上可用的 CPU 数量(如果无法确定计数,则为 None)。现在,multiprocessing.cpu_count() 函数是根据此函数实现的。(由 Trent Nelson、Yogesh Chaudhari、Victor Stinner 和 Charles-François Natali 在 bpo-17914 中贡献。)

os.path.samestat() 现在在 Windows 平台上可用(并且 os.path.samefile() 实现现在在 Unix 和 Windows 之间共享)。(由 Brian Curtin 在 bpo-11939 中贡献。)

现在,os.path.ismount() 可以识别 Windows 上驱动器根目录下的卷。(由 Tim Golden 在 bpo-9035 中贡献。)

os.open() 在提供它们的平台上支持两个新标志,O_PATH(未打开的文件描述符)和 O_TMPFILE(未命名的临时文件;截至 3.4.0 版本,仅在 Linux 系统上可用,这些系统的内核版本为 3.11 或更新版本,并且具有 uapi 标头)。(分别由 Christian Heimes 在 bpo-18673 和 Benjamin Peterson 贡献。)

pdb

pdb 经过增强,可以更有效地处理生成器、yieldyield from。在调试基于 asyncio 的程序时,这尤其有用。(由 Andrew Svetlov 和 Xavier de Gaye 在 bpo-16596 中贡献。)

print 命令已从 pdb 中移除,恢复了从 pdb 命令行访问 Python print() 函数的能力。Python 2 的 pdb 没有 print 命令;相反,输入 print 会执行 print 语句。在 Python 3 中,print 被错误地设置为 pdb p 命令的别名。然而,p 命令打印其参数的 repr,而不是像 Python 2 的 print 命令那样打印 str。更糟糕的是,Python 3 的 pdb print 命令遮蔽了 Python 3 的 print 函数,使其在 pdb 提示符下不可访问。(由 Connor Osborn 在 bpo-18764 中贡献。)

pickle

pickle 现在支持(但默认不使用)新的 pickle 协议,协议 4。这个新协议解决了之前协议中存在的一些问题,例如嵌套类的序列化、非常大的字符串和容器,以及 __new__() 方法接受仅关键字参数的类。它还提供了一些效率上的改进。

另请参阅

PEP 3154 – Pickle 协议 4

由 Antoine Pitrou 编写,Alexandre Vassalotti 实现的 PEP。

plistlib

plistlib 现在有一个类似于 stdlib 序列化协议的标准模式的 API,具有新的 load()dump()loads()dumps() 函数。(较旧的 API 现在已弃用。)除了已经支持的 XML plist 格式(FMT_XML)之外,它现在还支持二进制 plist 格式(FMT_BINARY)。(由 Ronald Oussoren 和其他人在 bpo-14455 中贡献。)

poplib

poplib 中添加了两个新方法:capa(),它返回 POP 服务器通告的功能列表;以及 stls(),如果 POP 服务器支持,它会将明文 POP3 会话切换为加密的 POP3 会话。(由 Lorenzo Catucci 在 bpo-4473 中贡献。)

pprint

pprint 模块的 PrettyPrinter 类及其 pformat()pprint() 函数具有一个新选项 compact,用于控制输出的格式。目前,将 compact 设置为 True 意味着序列将以每个(缩进的)行中尽可能多地容纳序列元素的方式打印,直到达到 width。 (由 Serhiy Storchaka 在 bpo-19132 中贡献。)

现在使用 Python 的标准行继续语法来包装长字符串。(由 Antoine Pitrou 在 bpo-17150 中贡献。)

pty

pty.spawn() 现在返回子进程的 os.waitpid() 的状态值,而不是 None。(由 Gregory P. Smith 贡献。)

pydoc

pydoc 模块现在直接基于 inspect.signature() 自省 API,使其能够为更广泛的可调用对象提供签名信息。此更改还意味着在显示帮助信息时会考虑 __wrapped__ 属性。(由 Larry Hastings 在 bpo-19674 中贡献。)

pydoc 模块不再为已经绑定的方法显示 self 参数。相反,它旨在始终显示所提供的可调用对象的精确当前签名。(由 Larry Hastings 在 bpo-20710 中贡献。)

除了对 pydoc 进行的直接更改外,inspect 模块的底层更改也大大改进了它对自定义 __dir__ 方法和各种描述符行为的处理。

由于 help() 内置函数基于 pydoc,因此上述更改也会影响 help() 的行为。

re

新的 fullmatch() 函数和 regex.fullmatch() 方法将模式锚定到字符串的两端进行匹配。这提供了一种明确表达匹配目标的方法,从而避免了一类在代码更改或向现有正则表达式添加替代项时丢失 $ 字符的细微错误。(由 Matthew Barnett 在 bpo-16203 中贡献。)

现在 regex 对象 的 repr 包括模式和标志;现在 match 对象 的 repr 包括开始位置、结束位置以及匹配的字符串部分。(由 Hugo Lopes Tavares 和 Serhiy Storchaka 在 bpo-13592bpo-17087 中贡献。)

resource

新的 prlimit() 函数,在内核版本为 2.6.36 或更高版本且 glibc 为 2.13 或更高版本的 Linux 平台上可用,提供了查询或设置除进行调用的进程之外的其他进程的资源限制的能力。(由 Christian Heimes 在 bpo-16595 中贡献。)

在 Linux 内核版本 2.6.36 或更高版本上,还有一些新的特定于 Linux 的常量:RLIMIT_MSGQUEUERLIMIT_NICERLIMIT_RTPRIORLIMIT_RTTIMERLIMIT_SIGPENDING。(由 Christian Heimes 在 bpo-19324 中贡献。)

在 FreeBSD 9 及更高版本中,有一些新的 FreeBSD 特定常量:RLIMIT_SBSIZERLIMIT_SWAPRLIMIT_NPTS。(由 Claudiu Popa 在 bpo-19343 中贡献。)

select

epoll 对象现在支持上下文管理协议。当在 with 语句中使用时,close() 方法将在代码块结束时自动调用。(由 Serhiy Storchaka 在 bpo-16488 中贡献。)

devpoll 对象现在具有 fileno()close() 方法,以及一个新属性 closed。(由 Victor Stinner 在 bpo-18794 中贡献。)

shelve

Shelf 实例现在可以在 with 语句中使用,并且将在 with 代码块结束时自动关闭。(由 Filip Gruszczyński 在 bpo-13896 中贡献。)

shutil

当源文件和目标文件是同一个文件时,copyfile() 现在会引发一个特定的 Error 子类,即 SameFileError,这允许应用程序针对此特定错误采取适当的操作。(由 Atsuo Ishimoto 和 Hynek Schlawack 在 bpo-1492704 中贡献。)

smtpd

SMTPServerSMTPChannel 类现在接受一个 *map* 关键字参数,如果指定,该参数将作为其 *map* 参数传递给 asynchat.async_chat。这允许应用程序避免影响全局套接字映射。(由 Vinay Sajip 在 bpo-11959 中贡献。)

smtplib

SMTPException 现在是 OSError 的子类,这允许在使用 try/except 语句的代码中同时捕获套接字级别错误和 SMTP 协议级别错误,而该代码只关心是否发生错误。(由 Ned Jackson Lovely 在 bpo-2118 中贡献。)

socket

socket 模块现在在支持的平台上支持 CAN_BCM 协议。(由 Brian Thorne 在 bpo-15359 中贡献。)

套接字对象具有新的方法来获取或设置它们的 可继承标志get_inheritable()set_inheritable()

socket.AF_*socket.SOCK_* 常量现在是使用新的 enum 模块的枚举值。这允许在调试期间打印有意义的名称,而不是整数“魔术数字”。

现在,在 BSD 和 OSX 上可以使用 AF_LINK 常量。

现在 Windows 上支持 inet_pton()inet_ntop()。(由 Atsuo Ishimoto 在 bpo-7171 中贡献。)

sqlite3

connect() 函数新增了一个布尔参数 *uri*,可用于指示 *database* 参数是一个 uri(参见 SQLite URI 文档)。(由 poq 在 bpo-13773 中贡献。)

ssl

添加了 PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2(TLSv1.1 和 TLSv1.2 支持);只有在 Python 与 OpenSSL 1.0.1 或更高版本链接时,才可以使用对这些协议的支持。(由 Michele Orrù 和 Antoine Pitrou 在 bpo-16692 中贡献。)

新函数 create_default_context() 提供了一种标准方法来获取 SSLContext,其设置旨在在兼容性和安全性之间取得合理的平衡。这些设置比 SSLContext 构造函数提供的默认设置更严格,并且如果最佳实践安全性要求发生变化,则将来可能会在不事先弃用的情况下进行调整。使用支持 SSL 的 stdlib 库的新推荐最佳实践是使用 create_default_context() 获取 SSLContext 对象,如果需要则修改它,然后将其作为适当的 stdlib API 的 *context* 参数传递。(由 Christian Heimes 在 bpo-19689 中贡献。)

SSLContext 方法 load_verify_locations() 接受一个新的可选参数 *cadata*,该参数可用于分别通过字符串或字节直接提供 PEM 或 DER 编码的证书。(由 Christian Heimes 在 bpo-18138 中贡献。)

新函数 get_default_verify_paths() 返回 set_default_verify_paths() 方法用于设置 OpenSSL 的默认 cafilecapath 的路径和环境变量的命名元组。这可以帮助调试默认验证问题。(由 Christian Heimes 在 bpo-18143 中贡献。)

SSLContext 有一个新的方法 cert_store_stats(),用于报告加载的 X.509 证书、X.509 CA 证书和证书吊销列表(crl)的数量,以及一个 get_ca_certs() 方法,该方法返回加载的 CA 证书列表。(由 Christian Heimes 在 bpo-18147 中贡献。)

如果 OpenSSL 0.9.8 或更高版本可用,SSLContext 有一个新的属性 verify_flags,可以通过将其设置为新的常量 VERIFY_DEFAULTVERIFY_CRL_CHECK_LEAFVERIFY_CRL_CHECK_CHAINVERIFY_X509_STRICT 的某种组合来控制证书验证过程。默认情况下,OpenSSL 不进行任何 CRL 验证。(由 Christien Heimes 在 bpo-8813 中贡献。)

新的 SSLContext 方法 load_default_certs() 从默认位置加载一组默认的“证书颁发机构”(CA)证书,这些默认位置因平台而异。它可以用来加载 TLS Web 服务器身份验证证书(purpose=SERVER_AUTH),供客户端用来验证服务器,以及供服务器用来验证客户端证书的证书(purpose=CLIENT_AUTH)。(由 Christian Heimes 在 bpo-19292 中贡献。)

两个新的仅限 Windows 的函数,enum_certificates()enum_crls(),提供了从 Windows 证书存储中检索证书、证书信息和 CRL 的能力。(由 Christian Heimes 在 bpo-17134 中贡献。)

使用新的 ssl.SSLContext.set_servername_callback() 方法支持服务器端 SNI(服务器名称指示)。(由 Daniel Black 在 bpo-8109 中贡献。)

SSLSocket.getpeercert() 返回的字典包含额外的 X509v3 扩展项:crlDistributionPointscalIssuersOCSP URI。(由 Christian Heimes 在 bpo-18379 中贡献。)

stat

stat 模块现在由 _stat 中的 C 实现支持。需要 C 实现,因为大多数值都不是标准化的,并且是平台相关的。(由 Christian Heimes 在 bpo-11016 中贡献。)

该模块支持新的 ST_MODE 标志,S_IFDOORS_IFPORTS_IFWHT。(由 Christian Hiemes 在 bpo-11016 中贡献。)

struct

新的函数 iter_unpack 和已编译格式上的新的 struct.Struct.iter_unpack() 方法,提供了对包含给定格式数据的重复实例的缓冲区进行流式解包的功能。(由 Antoine Pitrou 在 bpo-17804 中贡献。)

subprocess

check_output() 现在接受一个 input 参数,该参数可用于为运行的命令提供 stdin 的内容。(由 Zack Weinberg 在 bpo-16624 中贡献。)

getstatus()getstatusoutput() 现在可以在 Windows 上运行。此更改实际上是在 3.3.4 中无意间进行的。(由 Tim Golden 在 bpo-10197 中贡献。)

sunau

getparams() 方法现在返回一个 namedtuple 而不是普通的 tuple。(由 Claudiu Popa 在 bpo-18901 中贡献。)

sunau.open() 现在支持上下文管理协议:当在 with 块中使用时,返回对象的 close 方法将在块的末尾自动调用。(由 Serhiy Storchaka 在 bpo-18878 中贡献。)

AU_write.setsampwidth() 现在支持 24 位采样,从而增加了使用该模块写入 24 位采样的支持。(由 Serhiy Storchaka 在 bpo-19261 中贡献。)

writeframesraw()writeframes() 方法现在接受任何 bytes-like object。(Serhiy Storchaka 在 bpo-8311 中贡献了此功能。)

sys

新的函数 sys.getallocatedblocks() 返回解释器当前分配的块数。(在使用默认的 --with-pymalloc 设置的 CPython 中,这是通过 PyObject_Malloc() API 进行的分配。)这对于跟踪内存泄漏很有用,尤其是在通过测试套件自动执行时。(由 Antoine Pitrou 在 bpo-13390 中贡献。)

当 Python 解释器在 交互模式 下启动时,它会检查 __interactivehook__ 属性是否存在于 sys 模块上。如果该属性存在,则在启动交互模式之前,将调用其值,且不带任何参数。检查是在读取 PYTHONSTARTUP 文件之后进行的,因此可以在此处设置它。site 模块 将其设置为 一个函数,如果平台支持 readline,则该函数启用制表符完成和历史记录保存(在 ~/.python-history 中)。如果您不想要这种(新)行为,则可以通过从 sys 中删除此属性(或将其设置为其他可调用对象),在 PYTHONSTARTUPsitecustomizeusercustomize 中覆盖它。(由 Éric Araujo 和 Antoine Pitrou 在 bpo-5845 中贡献。)

tarfile

现在,当直接作为脚本或通过 -m 调用时,tarfile 模块支持简单的 命令行接口。这可用于创建和提取 tar 格式的存档文件。(由 Berker Peksag 在 bpo-13477 中贡献。)

textwrap

TextWrapper 类有两个新的属性/构造函数参数:max_lines,用于限制输出中的行数;以及 placeholder,这是一个字符串,如果由于 max_lines 而截断输出,它将出现在输出的末尾。基于这些功能,一个新的便利函数 shorten() 将输入中的所有空白压缩为单个空格,并生成以 placeholder 结尾的给定 width 的单行(默认为 [...])。(由 Antoine Pitrou 和 Serhiy Storchaka 在 bpo-18585bpo-18725 中贡献。)

threading

代表主线程的 Thread 对象可以通过新的 main_thread() 函数获得。在正常情况下,这将是启动 Python 解释器的线程。(由 Andrew Svetlov 在 bpo-18882 中贡献。)

traceback

新的 traceback.clear_frames() 函数接收一个 traceback 对象并清除它引用的所有帧中的局部变量,从而减少了内存消耗。(由 Andrew Kuchling 在 bpo-1565525 中贡献。)

types

新的 DynamicClassAttribute() 描述符提供了一种定义属性的方法,该属性在通过实例对象查找时表现正常,但在通过类查找时,会路由到类的 __getattr__。这允许在类上激活属性,并在类上具有同名的虚拟属性(有关示例,请参阅 Enum)。(由 Ethan Furman 在 bpo-19030 中贡献。)

urllib

现在,urllib.request 通过 DataHandler 类支持 data: URLs。(由 Mathias Panzenböck 在 bpo-16423 中贡献。)

现在可以通过在子类上设置 method 类属性来指定 Request 类将使用的 http 方法。(由 Jason R Coombs 在 bpo-18978 中贡献。)

现在,Request 对象是可重用的:如果修改了 full_urldata 属性,则所有相关的内部属性都会更新。这意味着,例如,现在可以在多个 OpenerDirector.open() 调用中使用同一个 Request 对象,并使用不同的 data 参数,或者修改 Requesturl,而不是从头开始重新计算它。还有一个新的 remove_header() 方法,可用于从 Request 中删除标头。(由 Alexey Kachayev 在 bpo-16464 中,Daniel Wozniak 在 bpo-17485 中,以及 Damien Brecht 和 Senthil Kumaran 在 bpo-17272 中贡献。)

现在,HTTPError 对象有一个 headers 属性,该属性提供了对与错误关联的 HTTP 响应标头的访问。(由 Berker Peksag 在 bpo-15701 中贡献。)

unittest

TestCase 类有一个新方法 subTest(),它生成一个上下文管理器,其 with 块将成为“子测试”。此上下文管理器允许测试方法通过例如在循环内调用 subTest 上下文管理器来动态生成子测试。因此,单个测试方法可以生成无数个单独标识和单独计数的测试,即使一个或多个测试失败,所有这些测试都将运行。例如

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

将导致六个子测试,每个子测试在 unittest 详细输出中以由变量名称 i 和该变量的特定值(i=0i=1 等)组成的标签来标识。有关此示例的完整版本,请参阅 使用子测试区分测试迭代。(由 Antoine Pitrou 在 bpo-16997 中贡献。)

现在,unittest.main() 接受 defaultTest 的测试名称的迭代器,而之前它只接受单个测试名称作为字符串。(由 Jyrki Pulliainen 在 bpo-15132 中贡献。)

如果在测试发现期间(即,在测试文件的模块级别)引发了 SkipTest,则现在将其报告为跳过而不是错误。(由 Zach Ware 在 bpo-16935 中贡献。)

discover() 现在对发现的文件进行排序,以提供一致的测试顺序。(由 Martin Melin 和 Jeff Ramnani 在 bpo-16709 中贡献。)

如果测试成功,则 TestSuite 现在会立即删除对测试的引用。在具有垃圾回收的 Python 解释器上,如果没有任何其他内容保留对测试的引用,则允许垃圾回收这些测试。可以通过创建一个定义自定义 _removeTestAtIndex 方法的 TestSuite 子类来覆盖此行为。(由 Tom Wardill、Matt McClure 和 Andrew Svetlov 在 bpo-11798 中贡献。)

一个新的测试断言上下文管理器 assertLogs() 将确保给定的代码块使用 logging 模块发出日志消息。默认情况下,消息可以来自任何记录器,并且优先级为 INFO 或更高,但可以指定记录器名称和替代的最小日志记录级别。可以查询上下文管理器返回的对象,以获取已记录的 LogRecord 和/或格式化消息。(由 Antoine Pitrou 在 bpo-18937 中贡献。)

测试发现现在适用于命名空间包(由 Claudiu Popa 在 bpo-17457 中贡献。)

现在,unittest.mock 对象在匹配调用时会检查其规范签名,这意味着现在可以按位置或名称而不是仅按位置来匹配参数。(由 Antoine Pitrou 在 bpo-17015 中贡献。)

mock_open() 对象现在具有 readlinereadlines 方法。(由 Toshio Kuratomi 在 bpo-17467 中贡献。)

venv

venv 现在包含 cshfish shell 的激活脚本。(由 Andrew Svetlov 在 bpo-15417 中贡献。)

EnvBuildercreate() 便利函数接受一个新的关键字参数 with_pip,默认为 False,它控制 EnvBuilder 是否确保 pip 安装在虚拟环境中。(由 Nick Coghlan 在 bpo-19552 中作为 PEP 453 实现的一部分贡献。)

wave

getparams() 方法现在返回一个 namedtuple,而不是一个普通的元组。(由 Claudiu Popa 在 bpo-17487 中贡献。)

wave.open() 现在支持上下文管理协议。(由 Claudiu Popa 在 bpo-17616 中贡献。)

wave 现在可以 将输出写入不可查找的文件。(由 David Jones、Guilherme Polo 和 Serhiy Storchaka 在 bpo-5202 中贡献。)

writeframesraw()writeframes() 方法现在接受任何 类字节对象。(由 Serhiy Storchaka 在 bpo-8311 中贡献。)

weakref

新的 WeakMethod 类模拟对绑定方法的弱引用。(由 Antoine Pitrou 在 bpo-14631 中贡献。)

新的 finalize 类可以注册一个回调,以便在对象被垃圾回收时调用,而无需仔细管理弱引用本身的生命周期。(由 Richard Oudkerk 在 bpo-15528 中贡献。)

ref 关联的回调(如果有)现在通过 __callback__ 属性公开。(由 Mark Dickinson 在 bpo-17643 中贡献。)

xml.etree

一个新的解析器 XMLPullParser 允许非阻塞应用程序解析 XML 文档。可以在 用于非阻塞解析的 Pull API 中看到示例。(由 Antoine Pitrou 在 bpo-17741 中贡献。)

xml.etree.ElementTreetostring()tostringlist() 函数,以及 ElementTreewrite() 方法,现在有一个 short_empty_elements 仅限关键字参数,用于控制是否以缩写形式 (<tag />) 或展开形式 (<tag></tag>) 写入没有内容的元素。(由 Ariel Poliak 和 Serhiy Storchaka 在 bpo-14377 中贡献。)

zipfile

writepy() 方法 PyZipFile 类有一个新的 filterfunc 选项,可以用来控制哪些目录和文件被添加到存档中。例如,这可以用来排除存档中的测试文件。(由 Christian Tismer 在 bpo-19274 中贡献。)

现在,ZipFilePyZipfileallowZip64 参数默认为 True。(由 William Mallard 在 bpo-17201 中贡献。)

CPython 实现更改

PEP 445:自定义 CPython 内存分配器

PEP 445 添加了新的 C 级接口,用于自定义 CPython 解释器中的内存分配。

另请参阅

PEP 445 – 添加新的 API 以自定义 Python 内存分配器

该 PEP 由 Victor Stinner 撰写和实现。

PEP 442:安全对象终结

PEP 442 消除了 CPython 中对象终结的当前限制和怪癖。有了它,具有 __del__() 方法的对象以及具有 finally 子句的生成器可以在它们是引用循环的一部分时被终结。

作为此更改的一部分,在大多数情况下,模块全局变量不再在解释器关闭期间被强制设置为 None,而是依赖于循环垃圾收集器的正常运行。这避免了一整类解释器关闭时错误,通常涉及 __del__ 方法,这些错误自引入循环 GC 以来就一直困扰着 Python。

另请参阅

PEP 442 – 安全对象终结

由 Antoine Pitrou 编写和实现的 PEP。

PEP 456:安全且可互换的哈希算法

PEP 456 跟进了之前在 Python 哈希算法上完成的安全修复工作,以解决某些面向公众的 API(受字典查找支持)可能受到的 DOS 攻击。(请参阅 bpo-14621 了解当前一轮改进的开始。)PEP 统一了 CPython 的哈希代码,以便封装器更容易替换不同的哈希算法,并将 Python 的默认实现切换为具有 64 位数据类型的平台上的 SipHash 实现。与旧的 FNV 算法相比,任何性能差异都是微不足道的。

PEP 将额外的字段添加到 sys.hash_info named tuple 中,以描述当前正在执行的二进制文件使用的哈希算法。否则,PEP 不会更改任何现有的 CPython API。

PEP 436:参数诊所

“参数诊所”(PEP 436)现在是 CPython 构建过程的一部分,可以用来简化定义和维护以 C 实现的内置函数和标准库扩展模块的准确签名的过程。

一些标准库扩展模块已转换为在 Python 3.4 中使用参数诊所,并且 pydocinspect 已相应更新。

预计用于程序内省的签名元数据将作为 Python 3.4 维护版本的一部分添加到 C 中实现的额外可调用对象中。

注意

参数诊所 PEP 与实现的当前状态不完全同步。在这种情况下,发布经理和核心开发团队认为这是可以接受的,因为参数诊所不会在 Python 3.4 中作为公共 API 提供给第三方使用。

另请参阅

PEP 436 – 参数诊所 DSL

由 Larry Hastings 编写和实现的 PEP。

其他构建和 C API 更改

  • 新的 PyType_GetSlot() 函数已添加到稳定的 ABI 中,允许在使用有限 API 时从命名类型槽检索函数指针。(由 Martin von Löwis 在 bpo-17162 中贡献。)

  • 新的 Py_SetStandardStreamEncoding() 预初始化 API 允许嵌入 CPython 解释器的应用程序可靠地强制标准流使用特定的编码和错误处理程序。(由 Bastien Montagne 和 Nick Coghlan 在 bpo-16129 中贡献。)

  • 大多数不改变字符串参数的 Python C API 现在都正确地标记为接受 const char * 而不是 char *。(由 Serhiy Storchaka 在 bpo-1772673 中贡献。)

  • 即使在没有 Python 解释器可用时(例如,在交叉编译场景中),也可以使用新的 shell 版本的 python-config

  • PyUnicode_FromFormat() 现在支持 %s%A%U%V%S%R 的宽度和精度规范。(由 Ysj Ray 和 Victor Stinner 在 bpo-7330 中贡献。)

  • 新函数 PyStructSequence_InitType2() 补充了现有的 PyStructSequence_InitType() 函数。不同之处在于,它在成功时返回 0,失败时返回 -1

  • 现在可以使用 GCC 和 clang 的最新版本的地址健全性检查功能编译 CPython 源代码:小型对象分配器中的误报已被消除。(由 Dhiru Kholia 在 bpo-18596 中贡献。)

  • Windows 构建现在使用地址空间布局随机化数据执行保护。(由 Christian Heimes 在 bpo-16632 中贡献。)

  • 新函数 PyObject_LengthHint()operator.length_hint() 的 C API 等效项。(由 Armin Ronacher 在 bpo-16148 中贡献。)

其他改进

  • python 命令有一个新的 选项 -I,这将使其在 “隔离模式” 下运行,这意味着 sys.path 既不包含脚本的目录,也不包含用户的 site-packages 目录,并且所有 PYTHON* 环境变量都被忽略(它同时暗示 -s-E)。未来可能还会应用其他限制,其目标是将脚本的执行与用户的环境隔离。例如,当 Python 用于运行系统脚本时,这是合适的。在大多数 POSIX 系统上,它可以在并且应该在系统脚本的 #! 行中使用。(由 Christian Heimes 在 bpo-16499 中贡献。)

  • 在支持 readline 的系统上,交互式解释器现在默认启用 Tab 补全。历史记录也默认启用,并写入(以及从中读取)文件 ~/.python-history。(由 Antoine Pitrou 和 Éric Araujo 在 bpo-5845 中贡献。)

  • 使用 --version 调用 Python 解释器现在将版本输出到标准输出而不是标准错误 (bpo-18338)。对 argparse (bpo-18920) 和其他具有类似脚本调用功能的模块 (bpo-18922) 进行了类似的更改。

  • CPython Windows 安装程序现在在注册扩展名时将 .py 添加到 PATHEXT 变量,允许用户通过仅键入其名称而不带 .py 扩展名在 Windows 命令提示符下运行 Python 脚本。(由 Paul Moore 在 bpo-18569 中贡献。)

  • 新的 make 目标 coverage-report 将构建 Python,运行测试套件,并使用 gcovlcov 为 C 代码库生成 HTML 覆盖率报告。

  • 现在,Python 回归测试套件-R 选项还会使用 sys.getallocatedblocks() 检查内存分配泄漏。(由 Antoine Pitrou 在 bpo-13390 中贡献。)

  • python -m 现在可以与命名空间包一起使用。

  • stat 模块现在用 C 实现,这意味着它从 C 头文件获取其常量的值,而不是像以前那样将这些值硬编码在 Python 模块中。

  • 现在可以正确加载来自单个操作系统模块(.so.dll)的多个 Python 模块(以前它会默默地返回文件中的第一个 Python 模块)。(由 Václav Šmilauer 在 bpo-16421 中贡献。)

  • 添加了一个新的操作码 LOAD_CLASSDEREF,以修复类主体中加载自由变量的错误,该错误可能会被某些 __prepare__ 的用法触发。(由 Benjamin Peterson 在 bpo-17853 中贡献。)

  • Victor Stinner 使用他基于 PEP 445pyfailmalloc 工具识别并修复了许多与 MemoryError 相关的崩溃 (bpo-18408, bpo-18520)。

  • pyvenv 命令现在接受一个 --copies 选项,即使在默认使用符号链接的系统上,也可以使用副本而不是符号链接。(由 Vinay Sajip 在 bpo-18807 中贡献。)

  • pyvenv 命令还接受一个 --without-pip 选项,以抑制否则会自动将 pip 引导到虚拟环境中。(由 Nick Coghlan 在 bpo-19552 中贡献,作为 PEP 453 实现的一部分。)

  • 现在,PYTHONIOENCODING 环境变量的值集中编码名称是可选的。这使得可以仅设置错误处理程序,而无需更改默认编码。(由 Serhiy Storchaka 在 bpo-18818 中贡献。)

  • bz2lzmagzip 模块的 open 函数现在支持 x(独占创建)模式。(由 Tim Heaney 和 Vajrasky Kok 在 bpo-19201bpo-19222bpo-19223 中贡献。)

重大优化

  • UTF-32 解码器现在快了 3 到 4 倍。(由 Serhiy Storchaka 在 bpo-14625 中贡献。)

  • 现在减少了集合的哈希冲突成本。每个哈希表探测现在会检查一系列连续的相邻键/哈希对,然后再继续在哈希表中进行随机探测。这利用了缓存局部性,使冲突解决的成本更低。冲突解决方法可以描述为线性探测和开放寻址的混合体。其他线性探测的数量默认为 9。可以通过在编译时将 LINEAR_PROBES 定义为任何值来更改此值。设置 LINEAR_PROBES=0 以完全关闭线性探测。(由 Raymond Hettinger 在 bpo-18771 中贡献。)

  • 解释器启动速度提高了约 30%。速度提升归因于几个措施。解释器在启动时加载的模块减少了,例如 recollectionslocale 模块及其依赖项不再默认导入。marshal 模块已得到改进,可以更快地加载已编译的 Python 代码。(由 Antoine Pitrou、Christian Heimes 和 Victor Stinner 在 bpo-19219bpo-19218bpo-19209bpo-19205bpo-9548 中贡献。)

  • bz2.BZ2File 在大多数情况下现在与 Python2 版本一样快或更快。lzma.LZMAFile 也进行了优化。(由 Serhiy Storchaka 和 Nadeem Vawda 在 bpo-16034 中贡献。)

  • 对于小整数(最常见的用例),random.getrandbits() 的速度提高了 20%-40%。(由 Serhiy Storchaka 在 bpo-16674 中贡献。)

  • 通过利用新的字符串存储格式,字符串的 pickle 操作现在明显更快。(由 Victor Stinner 和 Antoine Pitrou 在 bpo-15596 中贡献。)

  • io.FileIO.readall() 中的性能问题已解决。这尤其影响 Windows,并显着加快了通过 subprocess 管道传输大量数据的情况。(由 Richard Oudkerk 在 bpo-15758 中贡献。)

  • html.escape() 现在快了 10 倍。(由 Matt Bryant 在 bpo-18020 中贡献。)

  • 在 Windows 上,现在在 obmalloc 中使用原生 VirtualAlloc,而不是 CRT malloc。人工基准测试显示内存节省约 3%。

  • os.urandom() 现在使用延迟打开的持久性文件描述符,以避免在多个线程并行运行时使用大量文件描述符。(由 Antoine Pitrou 在 bpo-18756 中贡献。)

已弃用

本节介绍了 Python 3.4 中已弃用并在 Python 3.5 或更高版本中移除的各种 API 和其他功能。在大多数(但并非所有)情况下,使用已弃用的 API 会在启用弃用警告时(例如,通过使用 -Wd)运行解释器时产生 DeprecationWarning

Python API 中的弃用

  • 正如在 PEP 451:导入系统的 ModuleSpec 类型 中提到的,许多 importlib 方法和函数已被弃用:importlib.find_loader()importlib.util.find_spec() 取代;importlib.machinery.PathFinder.find_module()importlib.machinery.PathFinder.find_spec() 取代;importlib.abc.MetaPathFinder.find_module()importlib.abc.MetaPathFinder.find_spec() 取代;importlib.abc.PathEntryFinder.find_loader()find_module()importlib.abc.PathEntryFinder.find_spec() 取代;所有 xxxLoader ABC load_module 方法(importlib.abc.Loader.load_module()importlib.abc.InspectLoader.load_module()importlib.abc.FileLoader.load_module()importlib.abc.SourceLoader.load_module())不再应该被实现,而是加载器应该实现一个 exec_module 方法(importlib.abc.Loader.exec_module()importlib.abc.InspectLoader.exec_module()importlib.abc.SourceLoader.exec_module())并让导入系统处理其余部分;并且 importlib.abc.Loader.module_repr()importlib.util.module_for_loader()importlib.util.set_loader()importlib.util.set_package() 不再需要,因为它们的功能现在由导入系统自动处理。

  • imp 模块即将被弃用。为了保持与 Python 2/3 代码库的兼容性,该模块的移除目前未计划。

  • formatter 模块即将被弃用,并计划在 Python 3.6 中删除。

  • MD5 作为 hmac.new() 函数的默认 digestmod 已被弃用。Python 3.6 将需要一个显式的摘要名称或构造函数作为 digestmod 参数。

  • ftplib 模块中的内部 Netrc 类在其文档字符串中已被记录为弃用相当长的时间。它现在会发出 DeprecationWarning,并将在 Python 3.5 中完全删除。

  • subprocess.Popen.wait() 的未记录的 endtime 参数不应该被公开,并且希望没有被使用;它已被弃用,并且很可能会在 Python 3.5 中删除。

  • HTMLParserstrict 参数已被弃用。

  • plistlibreadPlist()writePlist()readPlistFromBytes()writePlistToBytes() 函数已被弃用,取而代之的是相应的新函数 load()dump()loads()dumps()Data() 已被弃用,取而代之的是直接使用 bytes 构造函数。

  • sysconfigSO 已被弃用,它已被 EXT_SUFFIX 取代。

  • 各种 open 函数接受的 U 模式已被弃用。在 Python3 中,它没有任何实际用途,应替换为适当使用 io.TextIOWrapper(如果需要)及其 newline 参数。

  • 已弃用 xml.etree.ElementTree.iterparse()parser 参数,以及 XMLParser()html 参数。为了准备移除后者,所有传递给 XMLParser 的参数都应通过关键字传递。

已弃用的特性

  • 使用 -n 标志(无子进程)运行 IDLE 已被弃用。但是,该功能将不会被移除,直到 bpo-18823 得到解决。

  • 如果存在,site 模块将“site-python”目录添加到 sys.path 中已弃用(bpo-19375)。

已移除

不再支持的操作系统

以下操作系统的支持已从源代码和构建工具中移除

  • OS/2 (bpo-16135)。

  • Windows 2000 (更改集 e52df05b496a)。

  • COMSPEC 指向 command.com 的 Windows 系统 (bpo-14470)。

  • VMS (bpo-16136)。

API 和功能移除

以下过时和之前已弃用的 API 和功能已被移除

  • 未维护的 Misc/TextMateMisc/vim 目录已被移除(有关替代方案的建议,请参阅 devguide)。

  • SO makefile 宏已移除(它已被 SHLIB_SUFFIXEXT_SUFFIX 宏取代)(bpo-16754)。

  • PyThreadState.tick_counter 字段已被移除;自从 Python 3.2 引入“新 GIL”以来,它的值已无意义 (bpo-19199)。

  • PyLoaderPyPycLoader 已从 importlib 中移除。(由 Taras Lyapun 在 bpo-15641 中贡献。)

  • HTTPConnectionHTTPSConnectionstrict 参数已被移除。不再支持 HTTP 0.9 风格的“简单响应”。

  • 已弃用的 urllib.request.Request getter 和 setter 方法 add_datahas_dataget_dataget_typeget_hostget_selectorset_proxyget_origin_req_hostis_unverifiable 已被移除(请使用直接属性访问代替)。

  • 已移除从 marshal 加载已弃用的 TYPE_INT64 的支持。(由 Dan Riti 在 bpo-15480 中贡献。)

  • inspect.Signature:现在要求仅位置参数具有有效的名称。

  • object.__format__() 不再接受非空格式字符串,现在会引发 TypeError。自 Python 3.2 以来,使用非空字符串已被弃用。进行此更改是为了防止在对象获得 __format__ 方法时,先前工作(但不正确)的代码开始失败的情况,这意味着如果使用不具有处理它的 __format__ 方法的对象使用 's' 格式代码,则代码现在可能会引发 TypeError。有关背景信息,请参阅 bpo-7994

  • difflib.SequenceMatcher.isbjunk()difflib.SequenceMatcher.isbpopular() 在 3.2 中已弃用,现在已被移除:请使用 x in sm.bjunkx in sm.bpopular,其中 smSequenceMatcher 对象 (bpo-13248)。

代码清理

  • 未使用的且未文档化的内部 Scanner 类已从 pydoc 模块中移除。

  • 私有的且实际上未使用的 _gestalt 模块已移除,以及私有的 platform 函数 _mac_ver_lookup_mac_ver_gstalt_bcd2str,它们只会曾在严重损坏的 OSX 系统上被调用(请参阅 bpo-18393)。

  • 已移除包含在 tarfile 模块命名空间中的某些 stat 常量的硬编码副本。

移植到 Python 3.4

本节列出了之前描述的更改和其他可能需要更改代码的错误修复。

“python”命令行为的更改

  • 在 posix shell 中,将 PATH 环境变量设置为空值等效于根本不设置它。但是,将 PYTHONPATH 设置为空值等效于根本不设置它:将 PYTHONPATH 设置为空值等效于将其设置为 .,这在类比 PATH 的工作方式时会导致混淆。该行为现在符合 PATH 的 posix 约定。

  • 默认情况下,现在关闭 CPython 解释器的调试 (--with-pydebug) 构建的 [X refs, Y blocks] 输出。可以使用 -X showrefcount 选项重新启用它。(由 Ezio Melotti 在 bpo-17323 中贡献。)

  • python 命令和大多数 stdlib 脚本(以及 argparse)现在将 --version 信息输出到 stdout 而不是 stderr (有关问题列表,请参见上面的 其他改进)。

Python API 的更改

  • importlib.abc 中定义的 ABC 现在会引发适当的异常或返回默认值,而不是盲目地引发 NotImplementedError。这只会影响调用 super() 并一直传递到 ABC 的代码。为了兼容性,请根据需要捕获 NotImplementedError 或适当的异常。

  • 模块类型现在默认将 __package____loader__ 属性初始化为 None。要确定这些属性是否以向后兼容的方式设置,请使用例如 getattr(module, '__loader__', None) is not None。(bpo-17115。)

  • importlib.util.module_for_loader() 现在无条件地设置 __loader____package__ 以正确支持重新加载。如果不需要这样做,则需要手动设置这些属性。您可以使用 importlib.util.module_to_load() 进行模块管理。

  • 导入现在在重新加载时无条件地重置相关属性(例如,__name____loader____package____file____cached__)。请注意,这恢复了 3.3 之前的行为,这意味着在重新加载时会重新找到模块(bpo-19413)。

  • 冻结包不再将 __path__ 设置为包含包名称的列表,而是将其设置为空列表。如果存在与冻结包名称相同的目录,则之前的行为可能会导致导入系统在子模块导入上执行错误的操作。确定模块是否是包的正确方法是使用 hasattr(module, '__path__')bpo-18065)。

  • 冻结模块不再定义 __file__ 属性。对于冻结模块来说,设置该属性在语义上是不正确的,因为它们不是从任何显式位置加载的。如果您必须知道模块来自冻结代码,则可以查看模块的 __spec__.location 是否设置为 'frozen',检查加载器是否是 importlib.machinery.FrozenImporter 的子类,或者如果需要 Python 2 兼容性,则可以使用 imp.is_frozen()

  • 如果 py_compile.compile() 要写入的文件路径是符号链接或非普通文件,则现在会引发 FileExistsError。这是为了发出警告,即导入会将这些文件覆盖为普通文件,而不管它们最初的文件路径类型是什么。

  • 当加载的源代码触发 SyntaxErrorUnicodeDecodeError 时,importlib.abc.SourceLoader.get_source() 不再引发 ImportError。因为 ImportError 仅在找不到源代码时才引发,但应该找到,因此当找到源代码但结构不正确时,感觉它是对该含义的过度使用/重载。如果您之前捕获了 ImportError,并且希望继续忽略语法或解码问题,请现在捕获所有三个异常。

  • functools.update_wrapper()functools.wraps() 现在正确地将 __wrapped__ 属性设置为被包装的函数,即使该函数也设置了其 __wrapped__ 属性。这意味着 __wrapped__ 属性现在正确地链接了一堆装饰函数,而不是链中的每个 __wrapped__ 属性都引用最内部的函数。假设之前的行为是有意为之的内省库可以使用 inspect.unwrap() 来访问链中没有 __wrapped__ 属性的第一个函数。

  • inspect.getfullargspec() 已在 inspect.signature() 之上重新实现,因此比过去处理更广泛的可调用对象。预计在 Python 3.4 系列的整个过程中,其他内置和扩展模块可调用对象将获得签名元数据。假设 inspect.getfullargspec() 将在非 Python 可调用对象上失败的代码可能需要进行相应的调整。

  • importlib.machinery.PathFinder 现在将当前工作目录传递给 sys.path_hooks 中的空字符串对象。这导致 sys.path_importer_cache 永远不包含 '',因此基于 sys.path 迭代 sys.path_importer_cache 不会找到所有键。在当前工作目录中导入时,模块的 __file__ 现在也将具有绝对路径,包括在使用 -m 和解释器时(除了当使用相对路径直接执行脚本时,__main__.__file__ 除外)(Brett Cannon 在 bpo-18416 中贡献)。在命令行中指定)(bpo-18416)。

  • 移除 HTTPConnectionHTTPSConnectionstrict 参数,如果你是按位置而不是按关键字指定剩余的参数,则会改变这些参数的含义。如果你一直关注弃用警告,你的代码应该已经通过关键字指定任何额外的参数。

  • 现在,from __future__ import ... 语句之间的字符串总是会引发 SyntaxError。 以前,如果没有前导文档字符串,则有时会忽略中间的字符串。 这使 CPython 符合语言规范;Jython 和 PyPy 已经符合。(bpo-17434)。

  • ssl.SSLSocket.getpeercert()ssl.SSLSocket.do_handshake() 现在当 SSLSocket 未连接时,会引发带有 ENOTCONNOSError,而不是之前的引发 AttributeError 的行为。此外,如果尚未完成握手,getpeercert() 将引发 ValueError

  • 现在,当输入字符串包含非 b32 字母表字符时,base64.b32decode() 会引发 binascii.Error,而不是 TypeError。当其他 TypeError 被转换时,这个特定的 TypeError 被遗漏了。(由 Serhiy Storchaka 在 bpo-18011 中贡献。)注意:此更改也无意中应用于 Python 3.3.3。

  • 现在,当创建 cgi.FieldStorage 实例被垃圾回收时,file 属性会自动关闭。 如果你将文件对象从 cgi.FieldStorage 实例中单独提取出来,并且没有保持实例处于活动状态,那么你应该存储整个 cgi.FieldStorage 实例,或者在 cgi.FieldStorage 实例被垃圾回收之前读取文件的内容。

  • 现在,对已关闭的 SSL 套接字调用 readwrite 会引发信息丰富的 ValueError,而不是先前更神秘的 AttributeErrorbpo-9177)。

  • slice.indices() 不再为巨大的值产生 OverflowError。 作为此修复的结果,如果给定负长度,slice.indices() 现在会引发 ValueError;之前它会返回无意义的值(bpo-14794)。

  • cmath 函数不同,complex 构造函数错误地接受了 float 值,如果对象的 __complex__ 特殊方法返回一个值。 现在,这会引发 TypeError。(bpo-16290。)

  • 3.2 和 3.3 中的 int 构造函数错误地接受了 base 参数的 float 值。 很少有人会这样做,但如果有人这样做,现在会引发 TypeErrorbpo-16772)。

  • 现在,关键字专用参数的默认值是在常规关键字参数的默认值之后求值的,而不是之前。 希望没有人编写任何依赖于以前错误行为的代码(bpo-16967)。

  • 现在,在 fork() 之后,会清除过时的线程状态。 这可能会释放一些以前被错误地永久保留的系统资源(例如,存储在线程本地存储中的数据库连接)。(bpo-17094。)

  • 现在,__annotations__ 字典中的参数名称会像 __kwdefaults__ 一样被正确地混淆。(由 Yury Selivanov 在 bpo-20625 中贡献。)

  • 现在,hashlib.hash.name 始终以小写形式返回标识符。 以前,某些内置哈希具有大写名称,但是既然它是一个正式的公共接口,则命名已保持一致(bpo-18532)。

  • 由于 unittest.TestSuite 现在在测试运行后会删除对测试的引用,因此,重复使用 TestSuite 来重新运行一组测试的测试框架可能会失败。 测试套件不应以这种方式重复使用,因为它意味着在测试运行之间保留了状态,从而破坏了 unittest 旨在提供的测试隔离。 但是,如果认为缺乏隔离是可以接受的,则可以通过创建定义一个不做任何事情的 _removeTestAtIndex 方法的 TestSuite 子类来恢复旧的行为(请参阅 TestSuite.__iter__())(bpo-11798)。

  • unittest 现在使用 argparse 进行命令行解析。 某些以前可以正常工作的无效命令形式现在不再允许; 从理论上讲,这不应导致向后兼容性问题,因为不允许的命令形式没有任何意义,并且不太可能被使用。

  • 当要匹配的字符串是 类字节对象 时,re.split()re.findall()re.sub() 函数,以及 match 对象的 group()groups() 方法现在始终返回一个 bytes 对象。 以前,返回类型与输入类型匹配,因此,如果你的代码依赖于返回值为,例如,bytearray,则你需要更改代码。

  • 如果传递字符串输入,audioop 函数现在会立即引发错误,而不是稍后随机失败(bpo-16685)。

  • 新的 convert_charrefs 参数对于 HTMLParser 类,目前为了向后兼容,默认值为 False,但最终会更改为默认值 True。建议你在代码中所有调用 HTMLParser 的地方都添加此关键字,并赋予适当的值 (bpo-13633)。

  • 由于 hmac.new() 函数的 digestmod 参数在未来将没有默认值,因此所有对 hmac.new() 的调用都应该修改为显式指定 digestmod (bpo-17276)。

  • 使用 SO 键调用 sysconfig.get_config_var(),或者在调用 sysconfig.get_config_vars() 的结果中查找 SO 是不推荐的。这个键应该根据上下文替换为 EXT_SUFFIXSHLIB_SUFFIX (bpo-19555)。

  • 所有指定了 Uopen 函数调用都应该修改。U 在 Python 3 中无效,如果使用最终会引发错误。根据函数的不同,可以使用 newline 参数来实现其旧的 Python 2 行为,或者如果需要,可以将流包装在 TextIOWrapper 中以使用其 newline 参数 (bpo-15204)。

  • 如果在脚本中使用 pyvenv 并且不希望安装 pip,则必须在命令调用中添加 --without-pip

  • 当指定缩进时,json.dump()json.dumps() 的默认行为已更改:它不再在行尾项分隔逗号后产生尾随空格。 只有当你的测试对这种输出进行空格敏感的比较时,这才会产生影响 (bpo-16333)。

  • doctest 现在会在扩展模块的 __doc__ 字符串中查找 doctest,因此如果你的 doctest 测试发现包含具有看起来像 doctest 的内容的扩展模块,那么在运行测试时可能会看到以前从未见过的测试失败 (bpo-3158)。

  • 作为 Python 启动改进的一部分,collections.abc 模块已稍作重构。因此,导入 collections 不再自动导入 collections.abc。 如果你的程序依赖于(未文档化的)隐式导入,则需要添加显式的 import collections.abc (bpo-20784)。

C API 中的更改

在 3.4.3 中更改

PEP 476:默认启用 stdlib HTTP 客户端的证书验证

http.client 以及使用它的模块,例如 urllib.requestxmlrpc.client,现在默认情况下会验证服务器是否提供由平台信任存储中的 CA 签名的证书,并且该证书的主机名与请求的主机名匹配,从而显著提高许多应用程序的安全性。

对于需要旧行为的应用程序,它们可以传递一个替代的上下文

import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)