#Python 3.4 有什么新变化¶
转载:Python 3.4 有什么新变化 作者:R. David Murray [email protected] (Editor)
这篇文章介绍了 Python 3.4 相比 3.3 增加的新特性。 Python 3.4 发布于 2014 年 3 月 16 日。 对于完整的细节,请参见 更新日志。
参见
PEP 429 -- Python 3.4 发布计划
#摘要 - 发布重点¶
新的语法特性:
- Python 3.4 中没有增加新的语法特性。
其他的新特性
- pip 能够随时可用 (PEP 453).
- 新创建的文件描述符是不可继承的 (PEP 446)。
- 对应 隔离模式 的命令行选项 (bpo-16499)。
- 针对非文本编码格式的 编解码器处理方式的改进 (多个相关问题)。
- 针对导入系统的 ModuleSpec 类型 (PEP 451)。 (将影响导入器的作者。)
- marshal格式已被改进为 更为紧凑与高效 (bpo-16475)。
新的库模块:
- asyncio: 针对异步 IO 的新版暂定 API (PEP 3156)。
- ensurepip: 引导设置 pip 安装器 (PEP 453)。
- enum: 对枚举类型的支持 (PEP 435)。
- pathlib: 面向对象的文件系统路径 (PEP 428)。
- selectors: 高层级且高效率的 I/O 复用,在- select模块的基础之上建立(为 PEP 3156 的组成部分)。
- statistics: 基础 数字领域稳定统计库 (PEP 450)。
- tracemalloc: 追踪 Python 内存分配 (PEP 454)。
显著改进的库模块:
- functools中的 单一调度泛型函数 (PEP 443)。
- 新的 pickle协议 4 (PEP 3154)。
- multiprocessing现在包含 一个避免在 Unix 上使用 os.fork 的选项 (bpo-8713)。
- email增加新的子模块- contentmanager和新的子类- Message(- EmailMessage) 用以 简化 MIME 处理 (bpo-18891)。
- inspect和- pydoc模块现在能够自省更多种类的可调用对象,这改进了 Python- help()系统的输出。
- ipaddress模块 API 已被声明为稳定状态
安全改进:
- 安全且可互换的哈希算法 (PEP 456)。
- 将新创建的文件描述符设为不可继承 (PEP 446) 以避免将文件描述符泄露给子进程。
- 新增对应 隔离模式 的命令行选项。 (bpo-16499)。
- 现在 multiprocessing具有 一个在 Unix 上避免使用 os.fork 的选项。 spawn 和 forkserver 更为安全因为它们会避免与子进程共享数据。
- 在 Windows 上 multiprocessing子进程将不再继承父进程的所有可继承句柄,而仅继承必需的几个。
- 新增的 hashlib.pbkdf2_hmac()函数可提供 PKCS#5 基于口令的密钥派生函数 2。
- 在 ssl中对于 TLSv1.1 和 TLSv1.2 的支持。
- 在 ssl中对于 从 Windows 系统证书库获取证书的支持。
- 在 ssl中对于 服务端 SNI (Server Name Indication) 的支持。
- ssl.SSLContext类具有 大量改进。
- 标准库中所有支持 SSL 的模块现在都支持服务器证书验证,包括主机名匹配 (ssl.match_hostname()) 和 CRL (Certificate Revocation Lists,参见ssl.SSLContext.load_verify_locations())。
CPython 实现的改进:
- 安全的对象最终化 (PEP 442)。
- 通过应用 PEP 442,在大多数情况下 模块的 globals 在最终化期间将不再被设为 None (bpo-18214)。
- 可配置的内存分配器 (PEP 445)。
- Argument Clinic (PEP 436)。
请继续阅读有关针对用户的改变的完整清单,包括许多其他较小的改进、CPython 优化、弃用以及潜在的移植问题。
#新的特性¶
#PEP 453: 在 Python 安装版中对 PIP 的显式初始设置¶
#默认对 pip 进行初始设置¶
新增的 ensurepip 模块(在 PEP 453 中定义)提供了一个在 Python 安装版和虚拟环境中初始设置 pip 安装器的标准跨平台机制。 包括在 Python 3.4.0 中的 pip 版本是 pip 1.5.4,未来的 3.4.x 维护发布版会将附带版本升级为创建候选发布版时的 pip 最新版本。
在默认情况下,将在所有平台上安装 pipX 和 pipX.Y 等命令(其中 X.Y 表示 Python 安装包的版本),并包括 pip Python 包及其依赖。 在 Windows 中以及所有平台的虚拟环境中,还将安装不带版本号的 pip 命令。 在其他平台中,系统层级上不带版本号的 pip 命令通常是指向单独安装的 Python 2 版本。
pyvenv 命令行工具和 venv 模块可利用 ensurepip 模块在虚拟环境中准备好 pip。 当使用命令行工具时,会默认安装 pip,而当使用 venv 模块的 API 安装版时必须显式地安装 pip。
对于 CPython 在 POSIX 系统上的源代码编译版,make install 和 make altinstall 命令默认会初始设置 pip。 此行为可通过配置选项来控制,并通过 Makefile 选项来重写。
在 Windows 和 Mac OS X 上,现在 CPython 安装程序默认会将 pip 与 CPython 本身一同安装(用户可以在安装过程中选择不安装它)。 Window 用户需要选择执行 PATH 修改以使 pip 在命令行中默认可用,在其他情况下它仍然可以通过 Windows 版 Python 启动器以 py -m pip 的方式使用。
正如 在 PEP 中已讨论的 那样平台打包者可以选择不默认安装这些命令,只需在它们被唤起时,能够提供有关如何在该平台上安装它们的简单清晰的指引(通常是使用系统的包管理器)。
备注
为了避免同时存在的 Python 2 和 Python 3 安装版之前的冲突,当 ensurepip 被直接唤起时默认只会初始设置带版本号的 pip3 和 pip3.4 命令 —— 需要添加 --default-pip 选项来请求设置不带版本号的 pip 命令。 pyvenv 和 Windows 安装程序会确保未限定版本的 pip 命令在环境中可用,并且 pip 始终可以通过 -m 选项开关而不是直接唤起以避免在具有多个 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 将新创建的文件描述符设为 不可继承的。 通常,这就是应用程序所需要的行为:当启动一个新进程时,让当前打开的文件也在新进程里打开可能导致各种难以查找的程序错误以及潜在的安全问题。
不过,也存在一些需要继承行为的情况。 为了支持这些情况,可以使用以下的新增函数和方法:
- os.get_inheritable(),- os.set_inheritable()
- os.get_handle_inheritable(),- os.set_handle_inheritable()
- socket.socket.get_inheritable(),- socket.socket.set_inheritable()
参见
PEP 446 -- 将新创建的文件描述符设为不可继承 : PEP 由 Victor Stinner 撰写并实现。
#编解码器处理方式的改进¶
自首次被引入以来,codecs 模块始终是作为一个类型中立的动态编码和解码系统来运作的。 然而,它与 Python 文本模型,尤其是内置 str、bytes 和 bytearray 类型上的限定类型的便捷方法的紧密耦合,在历史上掩盖了这一事实。
作为明晰情况的关键一步,现在 codecs.encode() 和 codecs.decode() 便捷函数在 Python 2.7、3.3 和 3.4 中都正确地写入了文档。 自 Python 2.4 以来这些函数即已存在于 codecs 模块中(并已被回归测试套件所覆盖),但在此前只能通过运行时自省才能发现。
不同于 str, bytes 和 bytearray 上的便捷方法,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-7475, bpo-17827, bpo-17828 和 bpo-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 中贡献。)
- 新增 German EBCDIC 编解码器 cp273。 (由 Michael Bierenfeld 和 Andrew Kuchling 在 bpo-1097797 中贡献。)
- 新增 Ukrainian 编解码器 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被注册为序列,并支持reversed()内置函数。 (由 Nick Coghlan 和 Claudiu Popa 在 bpo-18690 和 bpo-19078 中贡献。)
- 作为对引入 Argument Clinic 以及对 inspect和pydoc模块的其他修改的结果,在各种场合下由help()所报告的签名信息已获得修改和提升。
- 现在 __length_hint__()已成为正式语言规范的一部分 (参见 PEP 424)。 (由 Armin Ronacher 在 bpo-16148 中贡献。)
#新增模块¶
#asyncio¶
新增的 asyncio 模块(在 PEP 3156 中定义)为 Python 提供了一个标准的可插入事件循环模型,在标准库中提供了坚实的异步 IO 支持,并使得其他事件循环的实现与标准库和其他库的相互操作更为容易。
对于 Python 3.4,此模块被视为属于 provisional API。
参见
PEP 3156 -- 异步 IO 支持的重启: "asyncio" 模块 : PEP 由 Guido van Rossum 领导编写和实现。
#ensurepip¶
新增的 ensurepip 模块是用于 PEP 453 实现的主要基础设施。 在正常情况下最终用户不需要与此模块进行交互,但如果对安装版或虚拟环境的自动初始设置遭到拒绝则可使用它来手动初始设置 pip。
ensurepip 包括了一个捆绑的 pip 副本,其版本更新时间即 CPython 发布包的第一个候选发布版的发布时间(此规则同样适用于维护发布版和新特性发布版)。 ensurepip 不会访问因特网。 如果安装版可以访问因特网,则在运行 ensurepip 之后可以使用所捆绑的 pip 来将 pip 升级为比所捆绑版本更高的版本。 (请注意这样得到的 pip 升级版本将被视为一个单独安装的软件包并且在 Python 被卸载时将不会被移除。)
该模块被命名为 ensurepip 是因为如果在已安装 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,此模块被视为属于 provisional API。
参见
PEP 428 -- pathlib 模块 -- 面向对象的文件系统路径 : PEP 由 Antoine Pitrou 撰写并实现
#selectors¶
新增的 selectors 模块(作为 PEP 3156 实现的一部分被创建)允许高层级且高效的 I/O 多路复用,它是在 select 模块的基础上构建的。
#statistics¶
新增的 statistics 模块(在 PEP 450 中定义)直接在标准库中提供了一些核心统计功能。 该模块支持计算数据系列的平均值、中位数、模式、方差和标准差等。
参见
PEP 450 -- 为标准库增加 statistics 模块 : PEP 由 Steven D'Aprano 撰写并实现。
#tracemalloc¶
新增的 tracemalloc 模块(在 PEP 454 中定义)是用于追踪由 Python 所分配的内存块的调试工具。 它提供了以下信息:
- 追踪对象被分配所在的位置
- 按文件、按行统计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() 方法将接受任意 bytes-like object。 (由 Serhiy Storchaka 在 bpo-8311 中贡献。)
#argparse¶
现在 FileType 类可接受 encoding 和 errors 参数,它们将被传递给 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 或 bytearray 实例的场合下均接受任意 bytes-like object。 (由 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_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__ 字符串中查找文档测试。 (由 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 的子类 (EmailMessage 和 MIMEPart),以及新的子模块 contentmanager 和新的 policy 属性 content_manager。 所有文档目前都在新模块中,它是作为 email 的新 provisional 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 中贡献。)
现在标准库中增加了 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 中贡献。)
现在 hashlib 哈希对象的 name 属性已成为受正式支持的接口。 它一直存在于 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_size 和 name 属性 (以及 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 中贡献。)
现在 HTMLParser 的 strict 参数已被弃用。 (由 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 命令行界面和编辑器且不应被其他程序导入,它将随每个发布版获得改进。 请参阅 Lib/idlelib/NEWS.txt 查看 3.3.0 以来的累积变化列表,以及未来 3.4.x 发布版即将发生的变化。 此文件也可通过 IDLE Help ‣ About 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 将以符合 InspectLoader ABC 的方式初始设置 NamespaceLoader,这意味着 runpy `` 和 ``python -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-18929 和 bpo-19030 中贡献。)
现在 getfullargspec() 和 getargspec() 将使用 signature() API。 这允许它们支持更多种类的可调用对象,包括具有 __signature__ 属性的、具有通过 argument clinic 提供元数据的、functools.partial() 对象等等。 请注意,不同于 signature(),这些函数仍然会忽略 __wrapped__ 属性,并会报告绑定方法已绑定的第一个参数,所以如果想要这些特性的话你仍然需要更新你的代码以直接使用 signature()。 (由 Yury Selivanov 在 bpo-17481 中贡献。)
现在 signature() 支持 CPython 函数的鸭子类型,它增加了对使用 Cython 编译的函数的支持。 (由 Stefan Behnel 和 Yury Selivanov 在 bpo-17159 中贡献。)
#ipaddress¶
ipaddress 已在 Python 3.3 中作为 provisional API 被添加到标准库。 随着 Python 3.4 的发布,此限定已被移除:现在 ipaddress 属于稳定 API,由常规的标准库需求所覆盖以维护向下兼容性。
如果一个地址是全局可路由的则新增的 is_global 属性将为 True。 (由 Peter Moody 在 bpo-17400 中贡献。)
#logging¶
TimedRotatingFileHandler 新增的 atTime 形参可被用于指定每日要执行日志文件轮转的时间。 (由 Ronald Oussoren 在 bpo-9556 中贡献。)
现在 SocketHandler 和 DatagramHandler 已支持 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 行为即只记录内联字符串的一份副本并在反序列化时保留内联状态,并将此“一份副本”功能扩展到任何对象类型(包括处理递归引用)。 这既减少了 .pyc 文件的大小也减少了模块从 .pyc (或 .pyo) 文件加载时占用的内存量。 (由 Kristján Valur Jónsson 在 bpo-16475 中贡献,并由 Antoine Pitrou 在 bpo-19219 中提供进一步的加速。)
#mmap¶
现在 mmap 对象将是 可弱引用的。 (由 Valerie Lambert 在 bpo-4885 中贡献。)
#multiprocessing¶
在 Unix 上新增了两个 启动方法 spawn 和 forkserver 可使用 multiprocessing 来启动进程。 这两个方法使得进程和线程的混合更为健壮,并且 spawn 方法可以匹配 multiprocessing 在 Windows 上一直使用的语法。 新增的函数 get_all_start_methods() 可报告平台上可用的所有启动方法,get_start_method() 可报告当前的启动方法,而 set_start_method() 可设置启动方法。 (由 Richard Oudkerk 在 bpo-8713 中贡献。)
现在 multiprocessing 还具有 上下文 的概念,它决定了子进程的创建方式。 新增的函数 get_context() 可返回一个使用指定启动方法的上下文。 它具有与 multiprocessing 模块本身一致的 API,因此你可以使用它来创建 Pool 和其他在上下文中执行操作的对象。 这允许一个框架和某个应用程序或相同应用程序的不同部分使用多进程而不会彼此干扰。 (由 Richard Oudkerk 在 bpo-18999 中贡献。)
除非是在使用旧的 fork 启动方法,子进程将不再从其父进程继承不需要的句柄/文件描述符 (bpo-8713 的一部分)。
现在当使用 spawn 或 forkserver 启动方法时 multiprocessing 依赖于 runpy (它实现了 -m 开关) 在子进程中正确地初始化 __main__。 这解决了一些合并多进程操作中,-m 命令行开关和显式相对导入可能在子进程中导致失败的边缘场景问题。 (由 Nick Coghlan 在 bpo-19946 中贡献。)
#operator¶
新增的函数 length_hint() 提供了应当如何使用 __length_hint__() 特殊方法的规范实现,作为该语言特性的 PEP 424 正式规范说明的一部分。 (由 Armin Ronacher 在 bpo-16148 中贡献。)
现在提供了一个纯 Python 版本的 operator 模块,可用于参考并由 Python 的其他实现使用。 (由 Zachary Ware 在 bpo-16694 中贡献。)
#os¶
新增一些函数用于获取和设置文件描述符或 Windows 句柄的 可继承旗标 (os.get_inheritable(), os.set_inheritable()) 或 (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 发布版仅在具有 uapi 标头的内核版本 3.11 或更新的 Linux 系统上可用)。 (分别由 Christian Heimes 在 bpo-18673 中以及 Benjamin Peterson 贡献。)
#pdb¶
pdb 已被增强以通过更有用的方式来处理生成器, yield 和 yield from。 这在调试基于 asyncio 的程序时特别有帮助。 (由 Andrew Svetlov 和 Xavier de Gaye 在 bpo-16596 中贡献。)
print 命令已从 pdb 中移除,恢复了从 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 协议 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 服务器公开的功能列表,以及 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 已有的直接修改,它对自定义 __dir__ 方法和各种描述器行为的处理也通过对下层 inspect 模块的修改获得了显著的改进。
由于 help() 内置函数是基于 pydoc 的,上述的变化也会影响 help() 的行为。
#re¶
新增的 fullmatch() 函数和 Pattern.fullmatch() 方法可将模式锚定到要匹配的字符串的两端。 这提供了一种显式匹配目标的方式,从而避免了一类微妙的错误错误,即在代码更改或为现有正则表达式添加替代项时丢失 $ 字符。 (由 Matthew Barnett 在 bpo-16203 中贡献。)
正则表达式对象 的 repr 现在将包括模式和旗标;匹配对象 的 repr 现在将包括已匹配字符串的开头、末尾和组成。 (由 Hugo Lopes Tavares 和 Serhiy Storchaka 在 bpo-13592 和 bpo-17087 中贡献。)
#resource¶
新增的 prlimit() 函数,在内核版本 2.6.36 以上的 Linux 平台及 glibc 版本 2.13 以上可用,提供了查询或设置执行调用的进程以外的进程的资源限制的功能。 (由 Christian Heimes 在 bpo-16595 中贡献。)
在内核版本 2.6.36 以上的 Linux 上,新增了一些 Linux 专属的常量: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME 和 RLIMIT_SIGPENDING。 (由 Christian Heimes 在 bpo-19324 中贡献。)
在版本 9 以上的 FreeBSD 上,新增了一些 FreeBSD 专属的常量: RLIMIT_SBSIZE, RLIMIT_SWAP 和 RLIMIT_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¶
现在 SMTPServer 和 SMTPChannel 类接受一个 map 关键字参数,如果指定了该参数,它将被传给 asynchat.async_chat 作为其 map 参数。 这允许应用程序避免影响全局套接字映射表。 (由 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_1 和 PROTOCOL_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 的 contex 参数传入。 (由 Christian Heimes 在 bpo-19689 中贡献。)
SSLContext 方法 load_verify_locations() 接受新增的可选参数 cadata,它可被来分别通过字符串或字节串来直接提供 PEM 或 DER 编码的证书。 (由 Christian Heimes 在 bpo-18138 中贡献。)
新增的函数 get_default_verify_paths() 可返回一个由路径和环境变量组成的具名元组, 供 set_default_verify_paths() 方法用来设置 OpenSSL 的默认 cafile 和 capath。 这有助于对默认的验证问题进行调试。 (由 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_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN 或 VERIFY_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 (Server Name Indication)。 (由 Daniel Black 在 bpo-8109 中贡献。)
由 SSLSocket.getpeercert() 返回的字典包含额外的 X509v3 扩展条目: crlDistributionPoints, calIssuers 和 OCSP URI。 (由 Christian Heimes 在 bpo-18379 中贡献。)
#stat¶
现在 stat 模块以 _stat 中的 C 实现作为后端。 C 实现是必需的因为大多数值都未被标准化并且依赖于平台。 (由 Christian Heimes 在 bpo-11016 中贡献。)
该模块支持新的 ST_MODE 旗标, S_IFDOOR, S_IFPORT 和 S_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() 方法将接受任意 bytes-like object。 (由 Serhiy Storchaka 在 bpo-8311 中贡献。)
#sys¶
新增函数 sys.getallocatedblocks() 可返回当前由解释器所分配的内存块数量。 (在使用默认 --with-pymalloc 设置的 CPython 中,这将是通过 PyObject_Malloc() API 执行的分配。) 这在追踪内存泄漏时会很有用处,特别是对于通过测试套件自动追踪的场景。 (由 Antoine Pitrou 在 bpo-13390 中贡献。)
当 Python 解释器以 交互模式 启动时,它会检查 sys 模块中的 __interactivehook__ 属性。 如果该属性存在,它的值将在交互模式启动之前不附带参数地被调用。 这个检查是在读取 PYTHONSTARTUP 文件之后进行的,因此可以在那里设置它。 site 模块会在平台支持 readline 的情况下 把它设置为 一个启用制表符补全和历史记录保存(在 ~/.python-history 中)的函数。 如果你不想要这个(新增的)行为,可以通过从 sys 中删除这个属性(或将其设为其他可调用对象)在 PYTHONSTARTUP, sitecustomize 或 usercustomize 中覆盖它。 (由 Éric Araujo 和 Antoine Pitrou 在 bpo-5845 中贡献。)
#tarfile¶
现在 tarfile 模块当直接作为脚本或通过 -m 调用时将支持简单的 命令行接口。 这可被用来创建和提取 tar 归档文件。 (由 Berker Peksag 在 bpo-13477 中贡献。)
#textwrap¶
TextWrapper 类新增了两个属性/构造器参数: max_lines,用来限制输出的行数,以及 placeholder,它是一个当输出由于 max_lines 限制被截断时将出现在输出末尾处的字符串。 一个在此功能之上新增的便捷函数 shorten() 可将输入中的所有空格压缩为单个空格并产生一个宽度为 width 并以 placeholder (默认为 [...]) 结束的单独行。 (由 Antoine Pitrou 和 Serhiy Storchaka 在 bpo-18585 和 bpo-18725 中贡献。)
#threading¶
代表可通过新增的 main_thread() 函数来获取的主线程的 Thread 对象。 在通常条件下这将是启动 Python 解释器所在的线程。 (由 Andrew Svetlov 在 bpo-18882 中贡献。)
#回溯¶
新增的 traceback.clear_frames() 函数可接受一个回溯对象清除它所引用的所有帧中的局部变量,以减少内存消耗量。 (由 Andrew Kuchling 在 bpo-1565525 中贡献。)
#types¶
新增的 DynamicClassAttribute() 描述器提供了一种定义属性的方式,这种属性可正常地在实例对象中查找,但在类中查找时会被导向 类的 __getattr__。 这将允许设置在类上激活的特征属性,并在相同名称的类上具有虚拟属性(参见 enum 的例子)。 (由 Ethan Furman 在 bpo-19030 中贡献。)
#urllib¶
现在 urllib.request 支持 data: 使用 DataHandler 类的 URL。 (由 Mathias Panzenböck 在 bpo-16423 中贡献。)
由 Request 类使用的 http 方法现在可通过在子类上设置 method 类属性来指定。 (由 Jason R Coombs 在 bpo-18978 中贡献。)
现在 Request 对象是可重用的:如果 full_url 或 data 属性被修改,所有相关的内部特征属性都将被更新。 例如,这意味着现在可以在多个使用不同 data 参数的 OpenerDirector.open() 调用中使用相同的 Request 对象,或者修改 Request 的 url 而不必从头重新计算它们。 此外还有新增的 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)
将得到六个子测试,在单元测试详细输出中各自以变量名 i 加该变量专属的值来标识 (i=0, i=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() 对象具有 readline 和 readlines 方法。 (由 Toshio Kuratomi 在 bpo-17467 中贡献。)
#venv¶
现在 venv 包括了用于 csh 和 fish shell 的激活脚本。 (由 Andrew Svetlov 在 bpo-15417 中贡献。)
EnvBuilder 和 create() 便捷函数接受新的关键字参数 with_pip,默认值为 False,它控制 EnvBuilder 是否确保 pip 在虚拟环境中安装。 (作为 PEP 453 实现的组成部分由 Nick Coghlan 在 bpo-19552 中贡献。)
#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 文档。 相关示例可参见 用于非阻塞解析的拉取 API。 (由 Antoine Pitrou 在 bpo-17741 中贡献。)
现在 xml.etree.ElementTree tostring() 和 tostringlist() 函数,以及 ElementTree 的 write() 方法都具有一个 short_empty_elements 仅限关键字形参 用来提供对于无内容的元素要采取缩写 (<tag />) 还是扩展 (<tag></tag>) 形式的控制。 (由 Ariel Poliak 和 Serhiy Storchaka 在 bpo-14377 中贡献。)
#zipfile¶
PyZipFile 类的 writepy() 方法新增的 filterfunc 选项可用来控制要将哪些目录添加到归档中。 例如,可以用它将测试文件排除在归档之外。 (由 Christian Tismer 在 bpo-19274 中贡献。)
现在 ZipFile 和 PyZipFile 的 allowZip64 形参默认值为 True。 (由 William Mallard 在 bpo-17201 中贡献。)
#CPython 实现的变化¶
#PEP 445: 自定义 CPython 内存分配器¶
PEP 445 添加了新的 C 层级接口用来在 CPython 解释器中对内存分配进行自定义。
参见
PEP 445 -- 新增用于自定义 Python 内存分配器的 API : PEP 由 Victor Stinner 撰写并实现。
#PEP 442: 安全的对象最终化¶
PEP 442 移除了 CPython 中有关对象终结的限制和特殊处理。 有了它,具有 __del__() 方法的对象,以及具有 finally 子句的生成器在有循环引用的情况下也可以被最终化。
作为此项改变的一部分,大多数情况下在解释器关闭期间模块的全局变量不会被强制设为 None,而是取决于循环垃圾回收器的正常操作。 这避免了大量的解释器关闭时错误,这类错误通常都涉及 __del__ 方法,它们自循环 GC 首次被引入起就一直困扰着 Python。
参见
PEP 442 -- 安全的对象最终化 : PEP 由 Antoine Pitrou 撰写并实现
#PEP 456: 安全且可互换的哈希算法¶
PEP 456 在早先对 Python 的哈希算法所做安全修复上更进一步以解决特定的 DOS 攻击问题,以字典查找为基础的对外公开的 API 可能面临此种攻击。(请参阅 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,而 pydoc 和 inspect 也进行了相应的更新。
预期针对程序化内省的签名元数据将被添加到更多的以 C 实现的可调用对象中作为 Python 3.4 维护发布版的组成部分。
备注
Argument Clinic PEP 尚未完整更新到与具体实现的状态相一致。 这种情况被发布版管理者和核心开发团队认为是可接受的,因为 Argument Clinic 在 Python 3.4 中将不会作为公有 API 提供给第三方。
参见
PEP 436 -- The 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 中贡献。)
- 一个新的 python-config的 shell 版本即使在 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)。 对于argparse(bpo-18920) 和其他具有脚本类唤起功能的模块也做了类似的修改 (bpo-18922)。
- 现在 CPython Windows 安装程序会在注册扩展名时将 .py添加到PATHEXT变量,以允许用户在 windows 命令提示符下直接键入不带.py扩展名的 python 脚本名称来运行它。 (由 Paul Moore 在 bpo-18569 中贡献。)
- 新的 make目标 coverage-report 将使用gcov和 lcov 基于 C 代码库构建 python,运行测试套件并生成 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 中贡献。)
- 多个有关 MemoryError 的崩溃问题被 Victor Stinner 使用他基于 PEP 445 的 pyfailmalloc工具加以确定并修复 (bpo-18408, bpo-18520)。
- 现在 pyvenv命令接受一个--copies选项以使用拷贝而不是符号链接,即使在默认使用符号链接的系统上也是如此。 (由 Vinay Sajip 在 bpo-18807 中贡献。)
- pyvenv命令也接受一个- --without-pip选项用来抑制在其他情况下将自动将 pip 初始设置到虚拟环境中。 (作为 PEP 453 实现的一部分由 Nick Coghlan 在 bpo-19552 中贡献。)
- 现在编码格式名称在 PYTHONIOENCODING环境变量的设置值中将为可选项。 这使得只设置错误处理器而不改变默认编码格式成为可能。 (由 Serhiy Storchaka 在 bpo-18818 中贡献。)
- 现在 bz2,lzma, andgzip模块的open函数已支持x(独占式创建) 模式。 (由 Tim Heaney 和 Vajrasky Kok 在 bpo-19201, bpo-19222 和 bpo-19223 中贡献。)
#显著的优化¶
- 现在 UTF-32 解码器获得了 3x 至 4x 的提速。 (由 Serhiy Storchaka 在 bpo-14625 中贡献。)
- 针对集合的哈希碰撞的耗费现在已被降低。 每次哈希表检测现在会先检查一系列连续的、相邻的键/哈希值对再继续对整个哈希表执行随机检测。 这将利用缓存本地化来使得碰撞求解付出较少代价。 这种碰撞求解方案可被描述为线性检测和开放寻址的结合。 额外的线性检测数默认为九次。 这可以在编译时通过将 LINEAR_PROBES 定义为任意值来修改。 设置 LINEAR_PROBES=0 可完全关闭线性检测。 (由 Raymond Hettinger 在 bpo-18771 中贡献。)
- 解释器启动速度加快了约 30%。 多项措施促成了此次加速。 解释器在启动时加载的模块有所减少,例如 re,collections和locale模块及其依赖默认不再被导入。 marshal 模块得到改进以便更快速地加载已编译的 Python 代码。 (由 Antoine Pitrou, Christian Heimes 和 Victor Stinner 在 bpo-19219, bpo-19218, bpo-19209, bpo-19205 和 bpo-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()获得了 10x 速度提升。 (由 Matt Bryant 在 bpo-18020 中贡献。)
- 在 Windows 上,现在将使用原生的 VirtualAlloc而不是obmalloc中的 CRTmalloc。 人工基准测试显示可节省约 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()替代; 所有的xxxLoaderABCload_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 中移除。
- HTMLParser的 strict 参数已被弃用。
- plistlib- readPlist()、- writePlist()、- readPlistFromBytes()和- writePlistToBytes()等函数已被弃用,应改用相应的新函数- load()、- dump()、- loads()和- dumps()。- Data()已被弃用,应直接使用- bytes构造器。
- sysconfig的键- SO已被弃用,它已被- EXT_SUFFIX所替代。
- 各种 open函数所接受的U模式已被弃用。 在 Python3 中它已不再有任何实际作用,并应当改用适当的io.TextIOWrapper(如有必要) 及其 newline 参数。
- xml.etree.ElementTree.iterparse()的 parser 参数,就如- XMLParser()的 html 参数一样。 要对后者的移除做好准备,所有- XMLParser的参数都应当以关键字形式传入。
#弃用的特性¶
- 运行 IDLE --- Python 编辑器和 shell 时附带 -n旗标(无子进程)的做法已被弃用。 但是,该特性在 bpo-18823 解决之前将不会被移除。
- site 模块在 "site-python" 目录存在的情况下 sys.path 添加该目录的做法已被弃用 (bpo-19375)。
#移除¶
#不再支持的操作系统¶
从源代码和构建工具中删除了对以下操作系统的支持:
- OS/2 (bpo-16135).
- Windows 2000(变更集e52df05b496a)。
- Windows系统中 COMSPEC指向command.com的版本( bpo-14470 )。
- VMS (bpo-16136).
#API 与特性的移除¶
以下过时并在之前版本中弃用的 API 和特性现已被移除:
- 不再继续维护的 Misc/TextMate和Misc/vim目录已被移除(请参阅 devguide 了解相关替代器的使用建议)。
- SOmakefile 宏已被移除(被- SHLIB_SUFFIX和- EXT_SUFFIX宏所替代) (bpo-16754)。
- PyThreadState.tick_counter字段已被移除;该字段值自 Python 3.2 即 "新 GIL" 被引入时起就不再有意义了 (bpo-19199)。
- PyLoader和- PyPycLoader已从- importlib中移除。 (由 Taras Lyapun 在 bpo-15641 中贡献。)
- HTTPConnection和- HTTPSConnection的 strict 参数已被移除。 HTTP 0.9 风格的 "简单响应" 不再受到支持。
- 被弃用的 urllib.request.Request读取和设置方法add_data,has_data,get_data,get_type,get_host,get_selector,set_proxy,get_origin_req_host和is_unverifiable已被移除(请改为直接属性访问)。
- 对加载已弃用的 TYPE_INT64的支持已从marshal中被移除。 (由 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.bjunk和- x in sm.bpopular,其中 sm 是一个- SequenceMatcher对象 (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运作方式来进行理解时会导致困惑。 现在的行为将与 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()进行模块管理。
- 当重载时 import 操作现在会无条件地重置相关属性 (例如 __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。 这是为了提示导入系统将用一个常规文件覆盖相应文件而不管原始文件路径是什么类型而发出的警告。
- 当被加载的源代码触发了 SyntaxError或UnicodeDecodeError时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)。
- 传给 HTTPConnection和HTTPSConnection的 strict 参数被移除会改变剩余参数的含义,如果你是以位置参数而不是关键字参数方式指定它们的话。 如果你已经注意到弃用警告那么你的代码应当已经通过关键字参数方式指定所有额外参数了。
- 现在 from __future__ import ...语句之间的字符串 总是 会引发SyntaxError。 在之前版本中如果没有开头的文档字符串,则中间的字符串有时会被忽略。 这使得 CPython 与语言规范保持一致;Jython 和 PyPy 已经是这样了。 (bpo-17434)。
- 当 SSLSocket未连接时ssl.SSLSocket.getpeercert()和ssl.SSLSocket.do_handshake()现在会引发OSError并附带ENOTCONN,而非如之前版本的行为那样引发AttributeError。 此外,当握手尚未完成时getpeercert()将会引发ValueError。
- 当输入字符串包含 non-b32-alphabet 字符时 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 套接字上调用 read或write现在会引发更具信息量的ValueError而非之前更令人困惑的AttributeError(bpo-9177)。
- 对于巨大数值 slice.indices()将不再产生OverflowError。 作为此项修复的结果,当给予负的长度时slice.indices()现在会引发ValueError;在之前版本中它会返回无意义的值 (bpo-14794)。
- 与 cmath中的函数不同,当一个对象的__complex__特殊方法返回float值时complex构造器会不正确地接受它。 现在这会引发TypeError。 (bpo-16290。)
- 在 3.2 和 3.3 中的 int构造器会错误地接受float值作为 base 形参。 多数人不太可能这样做,但如果真的如此,现在它将引发TypeError(bpo-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()的调用都应当修改为显式地指定 digestmod (bpo-17276)。
- 附带 SO键调用sysconfig.get_config_var(),或者在对sysconfig.get_config_vars()的调用结果中查找SO的做法已被弃用。 该键应当被EXT_SUFFIX或SHLIB_SUFFIX替代,由具体场景决定 (bpo-19555)。
- 任何指定了 U的open函数调用都应当被修改。U在 Python3 将没有效果并且最终会在被使用时引发错误。 对于该函数,要得到与它的旧 Python2 行为相同的效果可以使用 newline 参数,或者在必要时将流包装在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 的变化¶
- 现在 PyEval_EvalFrameEx(),PyObject_Repr()和PyObject_Str()以及其他一些内部 C API 都包括了一个调试断言,以确保它们不会在可能会静默地丢弃当前活动异常的情况下使用。 在预期并且希望丢弃活动异常的情况下(例如,由于已通过PyErr_Fetch()将其保存在本地或是有意将其替换为不同的异常 ),则需调用显式的PyErr_Clear()以避免在(直接或间接)唤起这些操作和针对启用断言编译的 Python 的版本运行时触发断言。
- 现在 PyErr_SetImportError()在其 msg 参数未被设置时会设置TypeError。 在之前版本中仅会返回NULL而不设置异常。
- 现在 PyOS_ReadlineFunctionPointer回调的结果必须是一个由PyMem_RawMalloc()或PyMem_RawRealloc()分配的字符串,或者如果发生错误则为NULL,而不是由PyMem_Malloc()或PyMem_Realloc()分配的字符串 (bpo-16742)
- 现在 PyThread_set_key_value()总是会设置值。 在 Python 3.3 中,如果键已存在(如果当前值为非NULL指针)该函数将不执行任何操作。
- PyFrameObject结构体的- f_tstate(线程状态) 字段已被移除以修复一个程序错误;相关理由参见 bpo-14432。
#3.4.3 的变化¶
#PEP 476: 默认为 stdlib http 客户端启用证书验证¶
http.client 及其他依赖它的模块,比如 urllib.request 和 xmlrpc.client,现在将验证服务器是否提供了由平台信任的仓库中的 CA 签名的证书并且其主机名与默认被请求的主机名相匹配,这将显著提升许多应用程序的安全性。
对于需要之前版本的旧有行为的应用程序,可以传入一个替代的上下文:
import urllib.request
import ssl
# 这将禁用所有验证
context = ssl._create_unverified_context()
# 这将允许为主机使用指定证书,
# 它无须位于受信任的证书存储库中
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)