Python 3.4 有什么新变化
***********************

作者:
   R. David Murray <rdmurray@bitdance.com> (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 被卸载时将不会被移除。）

该模块被命名为 *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，此模块被视为属于 *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" 证书数量和证书吊销列表 ("crl"s)，以及
"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", and "gzip" 模块的 "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" 中
  的 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()" 替代; 所有的
  "*xxx*Loader" 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 中移除。

* "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 了解相关替代器的使用建议）。

* "SO" makefile 宏已被移除（被 "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)
