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

对于 POSIX 系统上的 CPython 源代码构建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 模块部分已完全重新设计为简短的入门和常见问题文档。大多数打包文档现在已移至 Python 打包管理局维护的Python 打包用户指南以及各个项目的文档中。

然而,由于此迁移目前仍不完整,这些指南的旧版本仍然可用,例如使用 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)

最后,如以上示例所示,这些改进使得能够恢复非 Unicode 编解码器的便利别名,这些别名本身已在 Python 3.2 中恢复。这意味着现在可以将二进制数据编码和解码为其十六进制表示形式(例如)写成

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

标准库中提供的二进制和文本转换详见二进制转换文本转换

(由 Nick Coghlan 贡献,分别在 bpo-7475bpo-17827bpo-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 中贡献。)

  • 所有 UTF-* 编解码器(UTF-7 除外)现在在编码和解码期间都拒绝代理,除非使用 surrogatepass 错误处理程序,但 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 构造函数现在接受任何在其 *base* 参数中具有 __index__ 方法的对象。(由 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 – 异步 IO 支持重启:“asyncio” 模块

PEP 由 Guido van Rossum 撰写并领导实现。

确保安装pip

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

ensurepip 包含一个捆绑的 pip 副本,该副本与附带它的 CPython 版本的第一个发布候选版本同步(这适用于维护版本和功能版本)。ensurepip 不访问互联网。如果安装具有互联网访问权限,则在运行 ensurepip 后,可以使用捆绑的 pippip 升级到比捆绑版本更新的版本。(请注意,此升级版本的 pip 被视为单独安装的包,如果卸载 Python,则不会被删除。)

该模块命名为 *ensure*pip,因为如果在已安装 pip 的情况下调用它,它将不执行任何操作。它还具有一个 --upgrade 选项,该选项将在现有已安装的 pip 版本早于捆绑副本时安装捆绑的 pip 副本。

enum

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

参见

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

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

pathlib

新的 pathlib 模块提供了表示文件系统路径的类,这些路径具有适用于不同操作系统的语义。路径类分为 *纯路径*,它们提供纯计算操作而不涉及 I/O,以及 *具体路径*,它们继承自纯路径但也提供 I/O 操作。

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

参见

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

PEP 由 Antoine Pitrou 撰写和实现。

选择器

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

statistics

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

参见

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

PEP 由 Steven D’Aprano 撰写和实现

tracemalloc

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

  • 跟踪对象的分配位置

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

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

参见

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

PEP 由 Victor Stinner 撰写和实现

改进的模块

abc

新函数 abc.get_cache_token() 可用于了解何时使受对象图更改影响的缓存失效。(由 Łukasz Langa 在 bpo-16832 中贡献。)

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

aifc

getparams() 方法现在返回一个命名元组而不是普通元组。(由 Claudiu Popa 在 bpo-17818 中贡献。)

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

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

argparse

FileType 类现在接受 *encoding* 和 *errors* 参数,这些参数将传递给 open()。(由 Lucas Maystre 在 bpo-11175 中贡献。)

音频操作

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

新的 byteswap() 函数将大端序样本转换为小端序,反之亦然。(由 Serhiy Storchaka 在 bpo-19641 中贡献。)

所有 audioop 函数现在都接受任何类字节对象。不接受字符串:它们以前不起作用,现在它们会立即引发错误。(由 Serhiy Storchaka 在 bpo-16685 中贡献。)

base64

base64 中的编码和解码函数现在接受任何类字节对象,而以前它要求 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 中贡献。)

颜色系统

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 代码片段发出指令流。因此,现在可以编写一个程序,以不同于 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_instructions() 相同的参数(加上一个可选的 *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__ 字符串中查找 doctests。(由 Zachary Ware 在 bpo-3158 中贡献。)

email

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

添加了新方法 as_bytes(),用于生成消息的字节表示,其方式类似于 as_string 生成字符串表示。它不接受 *maxheaderlen* 参数,但接受 *unixfrom* 和 *policy* 参数。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 已添加。所有文档目前都在新模块中,该模块作为电子邮件新临时 API的一部分添加。这些类提供了许多新方法,使从电子邮件消息中提取内容和向其中插入内容变得更加容易。有关详细信息,请参阅 contentmanager 文档和 email: 示例。这些 API 添加完成了电子邮件 6 项目计划的大部分工作。目前临时 API 计划在 Python 3.5 中最终确定(可能在错误处理领域有一些小的添加)。(由 R. David Murray 在 bpo-18891 中贡献。)

文件比较

新函数 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 中贡献。)

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

gc

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

glob

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

hashlib

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

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

hmac

hmac 现在接受 bytearraybytes 作为 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 和编辑器,并且不打算被其他程序导入,因此它在每个版本中都得到了改进。有关自 3.3.0 以来的累计更改以及未来 3.4.x 版本中的更改,请参阅 Lib/idlelib/NEWS.txt。此文件也可通过 IDLE Help ‣ About IDLE 对话框获取。

importlib

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

InspectLoader 现在也为 get_code() 方法提供了默认实现。然而,出于性能原因,通常希望覆盖默认实现。(由 Brett Cannon 在 bpo-18072 中贡献。)

reload() 函数已从 imp 移至 importlib,作为 imp 模块弃用的一部分。(由 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 抽象基类,这意味着 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__ 属性的对象、具有参数 clinic 提供的元数据的对象、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 在 commit ce46195b56a9 中贡献。)

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

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

marshal

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

mmap

mmap 对象现在是 弱引用able 的。(由 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 和其他在该上下文下操作的对象。这允许框架和应用程序或同一应用程序的不同部分使用多进程而不相互干扰。(由 Richard Oudkerk 在 bpo-18999 中贡献。)

除了使用旧的 *fork* 启动方法外,子进程不再继承父进程不必要的句柄/文件描述符(bpo-8713 的一部分)。

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

operator

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

现在有一个 operator 模块的纯 Python 版本,可供参考和供 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 中贡献。)

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

pickle

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

参见

PEP 3154 – Pickle protocol 4

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

plistlib

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

poplib

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

pprint

pprint 模块的 PrettyPrinter 类及其 pformat()pprint() 函数有一个新选项 compact,它控制输出的格式。目前,将 compact 设置为 True 意味着序列将以每行(缩进)可容纳的尽可能多的序列元素打印。(由 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()Pattern.fullmatch() 方法将模式锚定在字符串的两端以进行匹配。这提供了一种明确匹配目标的方法,避免了因代码更改或向现有正则表达式添加替代项而导致 $ 字符丢失的一类细微错误。(由 Matthew Barnett 在 bpo-16203 中贡献。)

正则表达式对象 的 repr 现在包含模式和标志;匹配对象 的 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 中贡献。)

Socket 对象有新的方法来获取或设置其 可继承标志,即 get_inheritable()set_inheritable()

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

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

inet_pton()inet_ntop() 现在在 Windows 上受支持。(由 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 的标准库的新推荐最佳实践是使用 create_default_context() 获取 SSLContext 对象,根据需要进行修改,然后将其作为适当标准库 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 证书和证书吊销列表(crls)的数量,以及一个 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 证书存储区检索证书、证书信息和 CRLs 的能力。(由 Christian Heimes 在 bpo-17134 中贡献。)

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

SSLSocket.getpeercert() 返回的字典包含额外的 X509v3 扩展项:crlDistributionPointscalIssuersOCSP URIs。(由 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 中贡献。)

getoutput()getstatusoutput() 现在在 Windows 上工作。此更改实际上是在 3.3.4 中无意中进行的。(由 Tim Golden 在 bpo-10197 中贡献。)

sunau

getparams() 方法现在返回一个命名元组而不是普通元组。(由 Claudiu Popa 在 bpo-18901 中贡献。)

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

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

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

sys

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

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

tarfile

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

textwrap

TextWrapper 类有两个新的属性/构造函数参数:max_lines,它限制了输出的行数;以及 placeholder,如果输出因 max_lines 而被截断,该字符串将出现在输出的末尾。在此基础上,新增了一个便捷函数 shorten(),它将输入中的所有空白折叠为单个空格,并生成一行给定 width 的文本,以 placeholder(默认为 [...])结尾。(由 Antoine Pitrou 和 Serhiy Storchaka 在 bpo-18585bpo-18725 中贡献。)

threading

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

traceback

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

types

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

urllib

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

Request 类将使用的 http 方法现在可以通过在其子类上设置 method 类属性来指定。(由 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 中贡献。)

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

wave

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

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

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

writeframesraw()writeframes() 方法现在接受任何 bytes-like object。(由 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

PyZipFile 类的 writepy() 方法新增了一个 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,而是依赖于循环垃圾收集器的正常操作。这避免了自循环 GC 首次引入以来一直困扰 Python 的一整类解释器关闭时错误,这些错误通常涉及 __del__ 方法。

参见

PEP 442 —— 安全对象终结化

PEP 由 Antoine Pitrou 撰写和实现。

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

PEP 456 延续了之前对 Python 哈希算法进行的安全修复工作,旨在解决面向公众的 API(由字典查找支持)可能遭受的某些 DOS 攻击。(有关当前改进轮次的开始,请参阅 bpo-14621。)该 PEP 统一了 CPython 的哈希代码,使得打包者更容易替换不同的哈希算法,并在具有 64 位数据类型的平台上将 Python 的默认实现切换到 SipHash 实现。与旧的 FNV 算法相比,性能差异微不足道。

该 PEP 向 sys.hash_info 命名元组添加了额外的字段,以描述当前正在执行的二进制文件所使用的哈希算法。除此之外,该 PEP 不会更改任何现有的 CPython API。

PEP 436: Argument Clinic

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

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

预计在 Python 3.4 维护版本中,将向在 C 中实现的其他可调用对象添加用于程序化自省的签名元数据。

备注

Argument Clinic PEP并未完全更新到实现的最新状态。在这种情况下,版本管理器和核心开发团队认为这是可以接受的,因为 Argument Clinic在 Python 3.4 中不会作为公共 API 提供给第三方使用。

参见

PEP 436 —— Argument Clinic DSL

PEP 由 Larry Hastings 撰写和实现。

其他构建和 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 中贡献。)

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

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

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

  • CPython 源代码现在可以使用最新版本 GCC 和 clang 的地址健全性检查功能进行编译:小型对象分配器中的误报已被消除。(由 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)。argparsebpo-18920)和其他具有类似脚本调用能力的模块也进行了类似的更改(bpo-18922)。

  • CPython Windows 安装程序现在在注册扩展时将 .py 添加到 PATHEXT 变量中,允许用户在 Windows 命令提示符下仅通过键入脚本名称而无需 .py 扩展名来运行 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 模块中硬编码这些值。

  • 从单个 OS 模块(.so.dll)加载多个 python 模块现在可以正常工作(以前它会静默返回文件中的第一个 python 模块)。(由 Václav Šmilauer 在 bpo-16421 中贡献。)

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

  • Victor Stinner 使用他基于 PEP 445pyfailmalloc 工具识别并修复了许多与 MemoryError 相关的崩溃(bpo-18408bpo-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 中贡献。)

  • 现在集合的哈希冲突成本降低了。每次哈希表探测都会在继续通过哈希表进行随机探测之前,检查一系列连续的相邻键/哈希对。这利用了缓存局部性,使冲突解决的成本更低。冲突解决方案可以描述为线性探测和开放寻址的混合体。附加线性探测的数量默认为九个。这可以在编译时通过将 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 和其他功能。在大多数(但非全部)情况下,当解释器在启用弃用警告的情况下运行(例如,通过使用 -Wd)时,使用已弃用的 API 将产生 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 的所有参数都应通过关键字传递。

已弃用的功能

已移除

不再支持的操作系统

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

  • OS/2 (bpo-16135)。

  • Windows 2000 (变更集 e52df05b496a)。

  • 在 Windows 系统中,当 COMSPEC 指向 command.com 时(bpo-14470)。

  • VMS (bpo-16136)。

API 和功能移除

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

  • 未维护的 Misc/TextMateMisc/vim 目录已被移除(请参阅 开发指南 以获取替代建议)。

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

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

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

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

  • urllib.request.Request 已弃用的 getter 和 setter 方法 add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_host, 和 is_unverifiable 已被移除(请改为直接访问属性)。

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

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

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

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

代码清理

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

  • 私有的、实际上未使用的 _gestalt 模块已被移除,同时移除了私有的 platform 函数 _mac_ver_lookup, _mac_ver_gstalt_bcd2str,这些函数只会在严重损坏的 OSX 系统上被调用(参见 bpo-18393)。

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

迁移到 Python 3.4

本节列出了前面描述过的变更以及其他可能需要修改代码的 bug 修复。

“python”命令行为的更改

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

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

  • python 命令和大多数标准库脚本(以及 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。这是为了警告导入系统将用正则文件覆盖这些文件,无论它们最初是什么类型的文件路径。

  • importlib.abc.SourceLoader.get_source() 不再在加载的源代码触发 SyntaxErrorUnicodeDecodeError 时引发 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

  • base64.b32decode() 现在在输入字符串包含非 b32 字母表字符时引发 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)。

  • complex 构造函数,与 cmath 函数不同,之前错误地接受了 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-like object 时,现在总是返回一个 bytes 对象。以前返回类型与输入类型匹配,因此如果您的代码依赖于返回值为,例如 bytearray,您将需要更改您的代码。

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

  • HTMLParser 的新参数 convert_charrefs 目前默认为 False 以实现向后兼容性,但最终将更改为默认为 True。建议您将此关键字(带适当的值)添加到代码中的任何 HTMLParser 调用中(bpo-13633)。

  • 由于 hmac.new() 函数的 digestmod 参数将来不会有默认值,因此所有对 hmac.new() 的调用都应更改为显式指定 digestmodbpo-17276)。

  • 调用 sysconfig.get_config_var() 时使用 SO 键,或在 sysconfig.get_config_vars() 调用的结果中查找 SO 已被弃用。此键应根据上下文替换为 EXT_SUFFIXSHLIB_SUFFIXbpo-19555)。

  • 任何指定 Uopen 函数调用都应修改。U 在 Python3 中无效,如果使用最终会引发错误。根据函数,可以通过使用 newline 参数,或者必要时通过将流包装在 TextIOWrapper 中以使用其 newline 参数来实现其旧 Python2 行为的等效效果(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.abcbpo-20784)。

C API 的变化

在 3.4.3 中更改

PEP 476:为标准库 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)