Python 3.4 新特性¶
- 作者:
R. David Murray <rdmurray@bitdance.com> (编辑)
本文介绍了 Python 3.4 相对于 3.3 的新特性。Python 3.4 于 2014 年 3 月 16 日发布。有关详细信息,请参阅变更日志。
另请参阅
PEP 429 – Python 3.4 发布计划
摘要 – 版本亮点¶
新语法特性
Python 3.4 中没有添加新的语法特性。
其他新特性
改进了对非文本编码的编解码器处理(多个问题)。
导入系统的ModuleSpec 类型 (PEP 451)。(影响导入器作者。)
新的库模块
selectors
:高级和高效的 I/O 多路复用,建立在select
模块原语之上(PEP 3156 的一部分)。statistics
:一个基本的数值稳定的统计库 (PEP 450)。
显著改进的库模块
email
有一个新的子模块contentmanager
和一个新的Message
子类 (EmailMessage
),它简化了 MIME 处理 (bpo-18891)。inspect
和pydoc
模块现在能够正确地内省更多种类的可调用对象,这改进了 Pythonhelp()
系统的输出。ipaddress
模块的 API 已声明为稳定。
安全改进
使新创建的文件描述符不可继承 (PEP 446) 以避免将文件描述符泄漏给子进程。
multiprocessing
现在有 一个避免在 Unix 上使用 os.fork 的选项。 spawn 和 forkserver 更加安全,因为它们避免了与子进程共享数据。Windows 上的
multiprocessing
子进程不再继承父进程的所有可继承句柄,而只继承必要的句柄。新的
hashlib.pbkdf2_hmac()
函数提供了 PKCS#5 基于密码的密钥派生函数 2。标准库中所有支持 SSL 的模块现在都支持服务器证书验证,包括主机名匹配 (
ssl.match_hostname()
) 和 CRL(证书吊销列表,请参阅ssl.SSLContext.load_verify_locations()
)。
CPython 实现改进
利用 PEP 442,在大多数情况下,模块全局变量在终结期间不再设置为 None (bpo-18214)。
请继续阅读,以获取面向用户的更改的完整列表,包括许多其他较小的改进、CPython 优化、弃用和潜在的移植问题。
新功能¶
PEP 453:在 Python 安装中显式引导 PIP¶
默认引导 pip¶
新的 ensurepip
模块(在 PEP 453 中定义)提供了一个标准的跨平台机制,用于将 pip 安装程序引导到 Python 安装和虚拟环境中。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 本身(用户可以选择在安装过程中不安装它)。Windows 用户需要选择加入自动 PATH
修改,才能默认从命令行使用 pip
,否则仍然可以通过 Windows 的 Python 启动器作为 py -m pip
访问。
如 PEP 中所述,平台打包者可以选择不默认安装这些命令,只要在调用时,它们提供关于如何在该平台上安装这些命令的清晰而简单的指导(通常使用系统包管理器)。
注意
为了避免并行 Python 2 和 Python 3 安装之间的冲突,当直接调用 ensurepip
时,默认只引导版本化的 pip3
和 pip3.4
命令 - 还需要 --default-pip
选项来请求未版本化的 pip
命令。pyvenv
和 Windows 安装程序确保在这些环境中可以使用非限定的 pip
命令,并且始终可以通过 -m
开关而不是直接调用 pip
,以避免在具有多个 Python 安装的系统上出现歧义。
文档更改¶
作为此更改的一部分,文档的安装 Python 模块和分发 Python 模块部分已完全重新设计为简短的入门和 FAQ 文档。大多数打包文档现在已移至 Python Packaging Authority 维护的 Python Packaging User Guide 和各个项目的文档中。
但是,由于此迁移目前仍未完成,这些指南的旧版本仍然可以作为使用 setuptools 构建 C 和 C++ 扩展和使用 setuptools 构建 C 和 C++ 扩展使用。
另请参阅
- PEP 453 – 在 Python 安装中显式引导 pip
该 PEP 由 Donald Stufft 和 Nick Coghlan 撰写,由 Donald Stufft、Nick Coghlan、Martin von Löwis 和 Ned Deily 实现。
PEP 446:新创建的文件描述符不可继承¶
PEP 446 使新创建的文件描述符不可继承。一般来说,这是应用程序需要的行为:当启动新进程时,让当前打开的文件也在新进程中打开可能会导致各种难以发现的错误,并可能导致安全问题。
但是,在某些情况下需要继承。为了支持这些情况,可以使用以下新函数和方法
另请参阅
- PEP 446 – 使新创建的文件描述符不可继承
该 PEP 由 Victor Stinner 撰写和实现。
编解码器处理的改进¶
自从首次引入以来,codecs
模块一直旨在作为类型中立的动态编码和解码系统运行。然而,它与 Python 文本模型的紧密耦合,特别是内置的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)
最后,如以上示例所示,这些改进允许恢复在 Python 3.2 中恢复的非 Unicode 编解码器的便利别名。这意味着现在可以将二进制数据编码为十六进制表示形式(例如)并从中解码,如下所示
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
标准库中提供的二进制和文本转换在二进制转换和文本转换中详细说明。
(由 Nick Coghlan 在 bpo-7475, bpo-17827, bpo-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 中贡献。)除非使用
surrogatepass
错误处理程序,否则所有 UTF-* 编解码器(UTF-7 除外)现在在编码和解码期间都拒绝代理项,但 UTF-16 解码器除外(它接受有效的代理项对)和 UTF-16 编码器(它在编码非 BMP 字符时会生成它们)。(由 Victor Stinner、Kang-Hao (Kenny) Lu 和 Serhiy Storchaka 在 bpo-12892 中贡献。)新的德语 EBCDIC 编解码器
cp273
。(由 Michael Bierenfeld 和 Andrew Kuchling 在 bpo-1097797 中贡献。)bytes
.join() 和bytearray
.join() 现在接受任意缓冲区对象作为参数。(由 Antoine Pitrou 在 bpo-15958 中贡献。)int
构造函数现在接受任何具有__index__
方法作为其 *base* 参数的对象。(由 Mark Dickinson 在 bpo-16772 中贡献。)帧对象现在有一个
clear()
方法,用于清除帧中对局部变量的所有引用。(由 Antoine Pitrou 在 bpo-17934 中贡献。)memoryview
现在被注册为一个Sequence
,并支持reversed()
内置函数。(由 Nick Coghlan 和 Claudiu Popa 在 bpo-18690 和 bpo-19078 中贡献。)由于 Argument Clinic 的引入以及对
inspect
和pydoc
模块的其他更改,help()
报告的签名在几种情况下得到了修改和改进。__length_hint__()
现在是正式语言规范的一部分(请参阅 PEP 424)。(由 Armin Ronacher 在 bpo-16148 中贡献。)
新模块¶
asyncio¶
新的 asyncio
模块(在 PEP 3156 中定义)为 Python 提供了一个标准的、可插拔的事件循环模型,在标准库中提供了可靠的异步 I/O 支持,并使其他事件循环实现更容易与标准库和彼此之间进行互操作。
对于 Python 3.4,此模块被认为是临时 API。
另请参阅
- PEP 3156 – 异步 I/O 支持重启:“asyncio”模块
由 Guido van Rossum 编写和领导实现的 PEP。
ensurepip¶
新的 ensurepip
模块是 PEP 453 实现的主要基础设施。在正常情况下,最终用户不需要与此模块交互,但如果拒绝将 pip
自动引导到安装或虚拟环境中,则可以使用它手动引导 pip
。
ensurepip
包括 pip
的捆绑副本,该副本与它所附带的 CPython 版本的第一个候选版本一样是最新的(这适用于维护版本和功能版本)。ensurepip
不会访问互联网。如果安装可以访问互联网,则在运行 ensurepip
后,可以使用捆绑的 pip
将 pip
升级到比捆绑版本更新的版本。(请注意,这样一个升级版本的 pip
被认为是单独安装的软件包,如果卸载 Python,则不会被删除。)
该模块名为 *ensure*pip,因为如果在已经安装 pip
时调用它,它什么也不做。它还有一个 --upgrade
选项,如果已安装的 pip
版本比捆绑副本旧,则会使它安装 pip
的捆绑副本。
enum¶
新的 enum
模块(在 PEP 435 中定义)提供了枚举类型的标准实现,允许其他模块(例如 socket
)通过用向后兼容的枚举值替换不透明的整数常量来提供更丰富的信息性错误消息和更好的调试支持。
另请参阅
- PEP 435 – 向 Python 标准库添加枚举类型
由 Barry Warsaw、Eli Bendersky 和 Ethan Furman 编写的 PEP,由 Ethan Furman 实现。
pathlib¶
新的 pathlib
模块提供表示文件系统路径的类,这些路径具有适用于不同操作系统的语义。路径类分为*纯路径*(提供纯粹的计算操作,没有 I/O)和*具体路径*(继承自纯路径,但也提供 I/O 操作)。
对于 Python 3.4,此模块被认为是临时 API。
另请参阅
- PEP 428 – pathlib 模块 – 面向对象的文件系统路径
由 Antoine Pitrou 编写和实现的 PEP。
selectors¶
新的 selectors
模块(作为实现 PEP 3156 的一部分而创建)允许基于 select
模块原语构建高级且高效的 I/O 多路复用。
statistics¶
新的 statistics
模块(在 PEP 450 中定义)直接在标准库中提供一些核心统计功能。此模块支持计算数据序列的平均值、中位数、众数、方差和标准差。
另请参阅
- PEP 450 – 向标准库添加统计模块
由 Steven D’Aprano 编写和实现的 PEP
tracemalloc¶
新的 tracemalloc
模块(在 PEP 454 中定义)是一个用于跟踪 Python 分配的内存块的调试工具。它提供以下信息
跟踪对象分配的位置
按文件名和行号划分的已分配内存块的统计信息:已分配内存块的总大小、数量和平均大小
计算两个快照之间的差异以检测内存泄漏
另请参阅
- PEP 454 – 添加新的 tracemalloc 模块以跟踪 Python 内存分配
由 Victor Stinner 编写和实现的 PEP
改进的模块¶
abc¶
可以使用新函数 abc.get_cache_token()
来知道何时使受对象图更改影响的缓存失效。(Łukasz Langa 在 bpo-16832 中贡献了此功能。)
新类 ABC
以 ABCMeta
作为其元类。使用 ABC
作为基类与指定 metaclass=abc.ABCMeta
具有基本相同的效果,但键入更简单,更易于阅读。(Bruno Dupuis 在 bpo-16049 中贡献了此功能。)
aifc¶
getparams()
方法现在返回一个 namedtuple 而不是普通元组。(Claudiu Popa 在 bpo-17818 中贡献了此功能。)
aifc.open()
现在支持上下文管理协议:当在 with
代码块中使用时,返回对象的 close()
方法将在代码块结束时自动调用。(Serhiy Storchacha 在 bpo-16486 中贡献了此功能。)
writeframesraw()
和 writeframes()
方法现在接受任何 bytes-like object。(Serhiy Storchaka 在 bpo-8311 中贡献了此功能。)
argparse¶
FileType
类现在接受 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-like object,而以前需要 bytes
或 bytearray
实例。(Nick Coghlan 在 bpo-17839 中贡献了此功能。)
新函数 a85encode()
、 a85decode()
、 b85encode()
和 b85decode()
提供了将二进制数据编码和解码为 Ascii85
和 git/mercurial Base85
格式的能力。 a85
函数具有可用于使其与 Ascii85
编码的变体兼容的选项,包括 Adobe 变体。(Martin Morrison、Mercurial 项目、Serhiy Storchaka 和 Antoine Pitrou 在 bpo-17618 中贡献了此功能。)
collections¶
ChainMap.new_child()
方法现在接受 m 参数,该参数指定要添加到链的子映射。这允许将现有映射和/或自定义映射类型用于子项。(Vinay Sajip 在 bpo-16613 中贡献了此功能。)
colorsys¶
RGB — YIQ 转换的系数位数已扩展,以便与 FCC NTSC 版本匹配。结果的变化应小于 1%,并且可能更好地匹配其他地方找到的结果。(Brian Landers 和 Serhiy Storchaka 在 bpo-14323 中贡献了此功能。)
contextlib¶
新的 contextlib.suppress
上下文管理器有助于澄清故意抑制单个语句中异常的代码的意图。(Raymond Hettinger 在 bpo-15806 和 Zero Piraeus 在 bpo-19266 中贡献了此功能。)
新的 contextlib.redirect_stdout()
上下文管理器使实用程序脚本更容易处理将其输出写入 sys.stdout
并且不提供任何重定向选项的非灵活 API。使用上下文管理器,sys.stdout
输出可以重定向到任何其他流,或者与 io.StringIO
结合使用,可以重定向到字符串。后者可能特别有用,例如,从一个旨在实现命令行界面的函数捕获输出。建议仅用于实用程序脚本,因为它会影响 sys.stdout
的全局状态。(Raymond Hettinger 在 bpo-15805 中贡献了此功能。)
contextlib
文档也已更新,以包括对单次使用、可重用和可重入上下文管理器之间差异的 讨论 。
dbm¶
dbm.open()
对象现在支持上下文管理协议。当在 with
语句中使用时,数据库对象的 close
方法将在代码块结束时自动调用。(Claudiu Popa 和 Nick Coghlan 在 bpo-19282 中贡献了此功能。)
dis¶
函数 show_code()
、 dis()
、 distb()
和 disassemble()
现在接受一个仅限关键字的 file 参数,该参数控制它们在何处写入其输出。
dis
模块现在围绕 Instruction
类构建,该类提供对每个单独字节码操作的详细信息的面向对象访问。
新方法 get_instructions()
提供了一个迭代器,该迭代器为给定的 Python 代码段发出 Instruction 流。因此,现在可以编写一个程序,以与 dis
模块本身提供的方式不同的方式来检查和操作字节码对象。例如
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
dis
模块中的各种显示工具已被重写以使用这些新组件。
此外,一个新的应用友好的类 Bytecode
提供了一个面向对象的 API,用于以人类可读的形式检查字节码以及迭代指令。Bytecode
构造函数接受与 get_instruction()
相同的参数(外加一个可选的 current_offset),并且可以迭代生成的对象以产生 Instruction
对象。但它也有一个 dis
方法,等价于在构造函数参数上调用 dis
,但以多行字符串的形式返回。
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode
还有一个类方法 from_traceback()
,它提供了操作回溯的能力(也就是说,print(Bytecode.from_traceback(tb).dis())
等价于 distb(tb)
)。
(由 Nick Coghlan、Ryan Kelly 和 Thomas Kluyver 在 bpo-11816 和 Claudiu Popa 在 bpo-17916 中贡献。)
新函数 stack_effect()
计算给定操作码和参数对 Python 堆栈的影响,这是其他方式无法获得的信息。(由 Larry Hastings 在 bpo-19722 中贡献。)
doctest¶
一个新的 选项标志,FAIL_FAST
,在检测到第一个失败时立即停止测试运行。(由 R. David Murray 和 Daniel Urban 在 bpo-16522 中贡献。)
doctest
命令行接口现在使用 argparse
,并有两个新选项,-o
和 -f
。-o
允许在命令行上指定 doctest 选项,而 -f
是 -o FAIL_FAST
的简写(与 unittest
CLI 支持的类似选项并行)。(由 R. David Murray 在 bpo-11390 中贡献。)
doctest
现在将在扩展模块的 __doc__
字符串中查找 doctest。(由 Zachary Ware 在 bpo-3158 中贡献。)
email¶
as_string()
现在接受一个 policy 参数,以便在生成字符串表示形式时覆盖消息的默认策略。这意味着现在可以在更多情况下使用 as_string
,而不必为了将格式化参数传递给其 flatten
方法而创建和使用 generator
。(由 R. David Murray 在 bpo-18600 中贡献。)
添加了新方法 as_bytes()
,以生成消息的字节表示形式,其方式类似于 as_string
生成字符串表示形式的方式。它不接受 maxheaderlen 参数,但接受 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 新的 临时 API 的一部分添加的。这些类提供了许多新方法,使从电子邮件消息中提取内容和向其中插入内容变得更加容易。有关详细信息,请参阅 contentmanager
文档和 email: 示例。这些 API 添加完成了作为 email6 项目一部分计划的大部分工作。当前临时 API 计划在 Python 3.5 中最终确定(可能在错误处理领域进行一些小的补充)。(由 R. David Murray 在 bpo-18891 中贡献。)
filecmp¶
新的 clear_cache()
函数提供了清除 filecmp
比较缓存的能力,该缓存使用 os.stat()
信息来确定自上次比较以来文件是否已更改。例如,如果文件可能已更改并在比特定文件系统的文件修改时间字段的分辨率更短的时间内重新检查,则可以使用此功能。(由 Mark Levitt 在 bpo-18149 中贡献。)
新的模块属性 DEFAULT_IGNORES
提供了用作 dircmp()
函数的 ignore 参数默认值的目录列表。(由 Eli Bendersky 在 bpo-15442 中贡献。)
functools¶
新的 partialmethod()
描述符将部分参数应用于描述符,就像 partial()
为普通可调用对象提供的那样。当包含在类定义中时,新的描述符还可以更轻松地使任意可调用对象(包括 partial()
实例)的行为类似于普通实例方法。(由 Alon Horev 和 Nick Coghlan 在 bpo-4331 中贡献。)
新的 singledispatch()
装饰器为 Python 标准库带来了对单分派泛型函数的支持。面向对象编程侧重于将对一组公共数据的多个操作分组到一个类中,而泛型函数则侧重于对操作的多种实现进行分组,使其能够处理不同类型的数据。
另请参阅
- PEP 443 – 单分派泛型函数
该 PEP 由 Łukasz Langa 编写并实现。
total_ordering()
现在支持从底层比较函数返回 NotImplemented
的返回值。(由 Katie Miller 在 bpo-10042 中贡献。)
现在,stdlib 中包含 partial()
函数的纯 Python 版本;在 CPython 中,它被 C 加速版本覆盖,但其他实现可以使用它。(由 Brian Thorne 在 bpo-12428 中贡献。)
gc¶
新函数 get_stats()
返回一个包含自解释器启动以来收集统计信息的三代字典列表。(由 Antoine Pitrou 在 bpo-16351 中贡献。)
glob¶
新函数 escape()
提供了一种转义文件名中特殊字符的方法,使其不会成为 glob 扩展的一部分,而是按字面匹配。(由 Serhiy Storchaka 在 bpo-8402 中贡献。)
hashlib¶
新的 hashlib.pbkdf2_hmac()
函数提供了 PKCS#5 基于密码的密钥派生函数 2。(由 Christian Heimes 在 bpo-18582 中贡献。)
name
属性的 hashlib
哈希对象现在是一个正式支持的接口。它一直存在于 CPython 的 hashlib
中(尽管它没有为所有支持的哈希返回小写名称),但它不是一个公共接口,因此其他一些 Python 实现以前不支持它。(由 Jason R. Coombs 在 bpo-18532 中贡献。)
hmac¶
hmac
现在接受 bytearray
以及 bytes
作为 new()
函数的 key 参数,并且 new()
函数和 update()
方法的 msg 参数现在接受 hashlib
模块支持的任何类型。(由 Jonas Borgström 在 bpo-18240 中贡献。)
hmac.new()
函数的 digestmod 参数现在可以是 hashlib
识别的任何哈希摘要名称。此外,当前将 digestmod 的值默认为 MD5
的行为已弃用:在未来的 Python 版本中将没有默认值。(由 Christian Heimes 在 bpo-17276 中贡献。)
随着 block_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 shell 和编辑器,并且不打算被其他程序导入,因此每次发布都会对其进行改进。请参阅 Lib/idlelib/NEWS.txt
,其中包含自 3.3.0 以来的累积更改列表,以及未来 3.4.x 版本中的更改。也可以从 IDLE 对话框中获取此文件。
importlib¶
InspectLoader
ABC 定义了一个新方法 source_to_code()
,它接受源数据和路径,并返回代码对象。默认实现等效于 compile(data, path, 'exec', dont_inherit=True)
。(由 Eric Snow 和 Brett Cannon 在 bpo-15627 中贡献。)
InspectLoader
现在还具有 get_code()
方法的默认实现。但是,出于性能原因,通常需要覆盖默认实现。(由 Brett Cannon 在 bpo-18072 中贡献。)
作为 imp
模块弃用的一部分,reload()
函数已从 imp
移动到 importlib
。(由 Berker Peksag 在 bpo-18193 中贡献。)
importlib.util
现在有一个 MAGIC_NUMBER
属性,用于访问字节码版本号。这取代了已弃用的 imp
模块中的 get_magic()
函数。(由 Brett Cannon 在 bpo-18192 中贡献。)
新的 importlib.util
函数 cache_from_source()
和 source_from_cache()
取代了已弃用的 imp
模块中同名的函数。(由 Brett Cannon 在 bpo-18194 中贡献。)
importlib
引导程序 NamespaceLoader
现在符合 InspectLoader
ABC,这意味着 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__
属性的对象、那些具有参数诊所提供的元数据的对象、functools.partial()
对象等等。请注意,与 signature()
不同,这些函数仍然忽略 __wrapped__
属性,并报告绑定方法的已绑定第一个参数,因此如果需要这些功能,仍然需要更新您的代码以直接使用 signature()
。(由 Yury Selivanov 在 bpo-17481 中贡献。)
signature()
现在支持 CPython 函数的鸭子类型,这增加了对使用 Cython 编译的函数的支持。(由 Stefan Behnel 和 Yury Selivanov 在 bpo-17159 中贡献。)
ipaddress¶
ipaddress
在 Python 3.3 中作为 临时 API 添加到标准库。随着 Python 3.4 的发布,此限定已删除:ipaddress
现在被认为是稳定的 API,受制于维护向后兼容性的正常标准库要求。
如果地址是全局可路由的,则新的 is_global
属性为 True
。(由 Peter Moody 在 bpo-17400 中贡献。)
logging¶
TimedRotatingFileHandler
有一个新的 atTime 参数,可用于指定应发生滚动的时间。(由 Ronald Oussoren 在 bpo-9556 中贡献。)
SocketHandler
和 DatagramHandler
现在支持 Unix 域套接字(通过将 port 设置为 None
)。(由 Vinay Sajip 在提交 ce46195b56a9 中贡献。)
fileConfig()
现在接受 configparser.RawConfigParser
子类实例作为 fname 参数。这有助于在日志配置只是整个应用程序配置的一部分时使用配置文件,或者在应用程序将配置传递给 fileConfig()
之前修改配置时使用配置文件。(由 Vinay Sajip 在 bpo-16110 中贡献。)
现在可以通过提供验证函数作为新 verify 关键字参数的参数,在通过 logging.config.listen()
函数从套接字接收到的日志配置数据进行处理之前对其进行验证。(由 Vinay Sajip 在 bpo-15452 中贡献。)
marshal¶
默认的 marshal
版本已提升到 3。实现新版本的代码恢复了 Python2 的行为,即仅记录一份内部字符串的副本并在反序列化时保留内部化,并将此“一份副本”的功能扩展到任何对象类型(包括处理递归引用)。这减少了 .pyc
文件的大小以及模块从 .pyc
(或 .pyo
)文件加载时在内存中占用的内存量。(由 Kristján Valur Jónsson 在 bpo-16475 中贡献,Antoine Pitrou 在 bpo-19219 中进行了额外的加速。)
mmap¶
multiprocessing¶
在 Unix 系统上,为使用multiprocessing
启动进程,添加了两种新的启动方法,spawn
和 forkserver
。这些方法使进程与线程的混合更加健壮,并且 spawn
方法与 multiprocessing 在 Windows 上一直使用的语义相匹配。新函数 get_all_start_methods()
报告平台上可用的所有启动方法,get_start_method()
报告当前的启动方法,而 set_start_method()
设置启动方法。(由 Richard Oudkerk 在 bpo-8713 中贡献。)
multiprocessing
现在还引入了 context
的概念,它决定了子进程的创建方式。新函数 get_context()
返回一个使用指定启动方法的上下文。它具有与 multiprocessing
模块本身相同的 API,因此你可以使用它来创建将在该上下文中运行的 Pool
和其他对象。这使得框架和应用程序或同一应用程序的不同部分可以互相不干扰地使用 multiprocessing。(由 Richard Oudkerk 在 bpo-18999 中贡献。)
除非使用旧的 fork 启动方法,否则子进程不再从其父进程继承不需要的句柄/文件描述符(bpo-8713 的一部分)。
现在,multiprocessing
依赖于 runpy
(它实现了 -m
开关)在使用 spawn
或 forkserver
启动方法时,在子进程中正确地初始化 __main__
。这解决了在子进程中,将 multiprocessing、-m
命令行开关和显式相对导入结合使用可能导致模糊故障的一些边缘情况。(由 Nick Coghlan 在 bpo-19946 中贡献。)
operator¶
新函数 length_hint()
提供了如何使用 __length_hint__()
特殊方法的规范实现,这是该语言功能的 PEP 424 正式规范的一部分。(由 Armin Ronacher 在 bpo-16148 中贡献。)
现在有一个纯 Python 版本的 operator
模块,可供参考和供 Python 的其他实现使用。(由 Zachary Ware 在 bpo-16694 中贡献。)
os¶
有一些新函数可以获取和设置文件描述符(os.get_inheritable()
、os.set_inheritable()
)或 Windows 句柄(os.get_handle_inheritable()
、os.set_handle_inheritable()
)的可继承标志。
新函数 cpu_count()
报告 Python 正在运行的平台上可用的 CPU 数量(如果无法确定计数,则为 None
)。现在,multiprocessing.cpu_count()
函数是根据此函数实现的。(由 Trent Nelson、Yogesh Chaudhari、Victor Stinner 和 Charles-François Natali 在 bpo-17914 中贡献。)
os.path.samestat()
现在在 Windows 平台上可用(并且 os.path.samefile()
实现现在在 Unix 和 Windows 之间共享)。(由 Brian Curtin 在 bpo-11939 中贡献。)
现在,os.path.ismount()
可以识别 Windows 上驱动器根目录下的卷。(由 Tim Golden 在 bpo-9035 中贡献。)
os.open()
在提供它们的平台上支持两个新标志,O_PATH
(未打开的文件描述符)和 O_TMPFILE
(未命名的临时文件;截至 3.4.0 版本,仅在 Linux 系统上可用,这些系统的内核版本为 3.11 或更新版本,并且具有 uapi 标头)。(分别由 Christian Heimes 在 bpo-18673 和 Benjamin Peterson 贡献。)
pdb¶
pdb
经过增强,可以更有效地处理生成器、yield
和 yield from
。在调试基于 asyncio
的程序时,这尤其有用。(由 Andrew Svetlov 和 Xavier de Gaye 在 bpo-16596 中贡献。)
print
命令已从 pdb
中移除,恢复了从 pdb 命令行访问 Python print()
函数的能力。Python 2 的 pdb
没有 print
命令;相反,输入 print
会执行 print
语句。在 Python 3 中,print
被错误地设置为 pdb p
命令的别名。然而,p
命令打印其参数的 repr
,而不是像 Python 2 的 print
命令那样打印 str
。更糟糕的是,Python 3 的 pdb print
命令遮蔽了 Python 3 的 print
函数,使其在 pdb
提示符下不可访问。(由 Connor Osborn 在 bpo-18764 中贡献。)
pickle¶
pickle
现在支持(但默认不使用)新的 pickle 协议,协议 4。这个新协议解决了之前协议中存在的一些问题,例如嵌套类的序列化、非常大的字符串和容器,以及 __new__()
方法接受仅关键字参数的类。它还提供了一些效率上的改进。
另请参阅
- PEP 3154 – Pickle 协议 4
由 Antoine Pitrou 编写,Alexandre Vassalotti 实现的 PEP。
plistlib¶
plistlib
现在有一个类似于 stdlib 序列化协议的标准模式的 API,具有新的 load()
、dump()
、loads()
和 dumps()
函数。(较旧的 API 现在已弃用。)除了已经支持的 XML plist 格式(FMT_XML
)之外,它现在还支持二进制 plist 格式(FMT_BINARY
)。(由 Ronald Oussoren 和其他人在 bpo-14455 中贡献。)
poplib¶
中添加了两个新方法:poplib
capa()
,它返回 POP 服务器通告的功能列表;以及 stls()
,如果 POP 服务器支持,它会将明文 POP3 会话切换为加密的 POP3 会话。(由 Lorenzo Catucci 在 bpo-4473 中贡献。)
pprint¶
模块的 pprint
PrettyPrinter
类及其 pformat()
和 pprint()
函数具有一个新选项 compact,用于控制输出的格式。目前,将 compact 设置为 True
意味着序列将以每个(缩进的)行中尽可能多地容纳序列元素的方式打印,直到达到 width。 (由 Serhiy Storchaka 在 bpo-19132 中贡献。)
现在使用 Python 的标准行继续语法来包装长字符串。(由 Antoine Pitrou 在 bpo-17150 中贡献。)
pty¶
pty.spawn()
现在返回子进程的 os.waitpid()
的状态值,而不是 None
。(由 Gregory P. Smith 贡献。)
pydoc¶
模块现在直接基于 pydoc
自省 API,使其能够为更广泛的可调用对象提供签名信息。此更改还意味着在显示帮助信息时会考虑 inspect.signature()
__wrapped__
属性。(由 Larry Hastings 在 bpo-19674 中贡献。)
模块不再为已经绑定的方法显示 pydoc
self
参数。相反,它旨在始终显示所提供的可调用对象的精确当前签名。(由 Larry Hastings 在 bpo-20710 中贡献。)
除了对
进行的直接更改外,pydoc
模块的底层更改也大大改进了它对自定义 inspect
__dir__
方法和各种描述符行为的处理。
re¶
新的
函数和 fullmatch()
regex.fullmatch()
方法将模式锚定到字符串的两端进行匹配。这提供了一种明确表达匹配目标的方法,从而避免了一类在代码更改或向现有正则表达式添加替代项时丢失 $
字符的细微错误。(由 Matthew Barnett 在 bpo-16203 中贡献。)
现在 regex 对象
的 repr 包括模式和标志;现在 match 对象
的 repr 包括开始位置、结束位置以及匹配的字符串部分。(由 Hugo Lopes Tavares 和 Serhiy Storchaka 在 bpo-13592 和 bpo-17087 中贡献。)
resource¶
新的 prlimit()
函数,在内核版本为 2.6.36 或更高版本且 glibc 为 2.13 或更高版本的 Linux 平台上可用,提供了查询或设置除进行调用的进程之外的其他进程的资源限制的能力。(由 Christian Heimes 在 bpo-16595 中贡献。)
在 Linux 内核版本 2.6.36 或更高版本上,还有一些新的特定于 Linux 的常量:RLIMIT_MSGQUEUE
、RLIMIT_NICE
、RLIMIT_RTPRIO
、RLIMIT_RTTIME
和 RLIMIT_SIGPENDING
。(由 Christian Heimes 在 bpo-19324 中贡献。)
在 FreeBSD 9 及更高版本中,有一些新的 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* 关键字参数,如果指定,该参数将作为其 *map* 参数传递给 asynchat.async_chat
。这允许应用程序避免影响全局套接字映射。(由 Vinay Sajip 在 bpo-11959 中贡献。)
smtplib¶
SMTPException
现在是 OSError
的子类,这允许在使用 try/except 语句的代码中同时捕获套接字级别错误和 SMTP 协议级别错误,而该代码只关心是否发生错误。(由 Ned Jackson Lovely 在 bpo-2118 中贡献。)
socket¶
socket 模块现在在支持的平台上支持 CAN_BCM
协议。(由 Brian Thorne 在 bpo-15359 中贡献。)
套接字对象具有新的方法来获取或设置它们的 可继承标志:get_inheritable()
和 set_inheritable()
。
socket.AF_*
和 socket.SOCK_*
常量现在是使用新的 enum
模块的枚举值。这允许在调试期间打印有意义的名称,而不是整数“魔术数字”。
现在,在 BSD 和 OSX 上可以使用 AF_LINK
常量。
现在 Windows 上支持 inet_pton()
和 inet_ntop()
。(由 Atsuo Ishimoto 在 bpo-7171 中贡献。)
sqlite3¶
connect()
函数新增了一个布尔参数 *uri*,可用于指示 *database* 参数是一个 uri
(参见 SQLite URI 文档)。(由 poq 在 bpo-13773 中贡献。)
ssl¶
添加了 PROTOCOL_TLSv1_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 的 *context* 参数传递。(由 Christian Heimes 在 bpo-19689 中贡献。)
SSLContext
方法 load_verify_locations()
接受一个新的可选参数 *cadata*,该参数可用于分别通过字符串或字节直接提供 PEM 或 DER 编码的证书。(由 Christian Heimes 在 bpo-18138 中贡献。)
新函数 get_default_verify_paths()
返回 set_default_verify_paths()
方法用于设置 OpenSSL 的默认 cafile
和 capath
的路径和环境变量的命名元组。这可以帮助调试默认验证问题。(由 Christian Heimes 在 bpo-18143 中贡献。)
SSLContext
有一个新的方法 cert_store_stats()
,用于报告加载的 X.509
证书、X.509 CA
证书和证书吊销列表(crl
)的数量,以及一个 get_ca_certs()
方法,该方法返回加载的 CA
证书列表。(由 Christian Heimes 在 bpo-18147 中贡献。)
如果 OpenSSL 0.9.8 或更高版本可用,SSLContext
有一个新的属性 verify_flags
,可以通过将其设置为新的常量 VERIFY_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(服务器名称指示)。(由 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 中贡献。)
getstatus()
和 getstatusoutput()
现在可以在 Windows 上运行。此更改实际上是在 3.3.4 中无意间进行的。(由 Tim Golden 在 bpo-10197 中贡献。)
sunau¶
getparams()
方法现在返回一个 namedtuple 而不是普通的 tuple。(由 Claudiu Popa 在 bpo-18901 中贡献。)
sunau.open()
现在支持上下文管理协议:当在 with
块中使用时,返回对象的 close
方法将在块的末尾自动调用。(由 Serhiy Storchaka 在 bpo-18878 中贡献。)
AU_write.setsampwidth()
现在支持 24 位采样,从而增加了使用该模块写入 24 位采样的支持。(由 Serhiy Storchaka 在 bpo-19261 中贡献。)
writeframesraw()
和 writeframes()
方法现在接受任何 bytes-like object。(Serhiy Storchaka 在 bpo-8311 中贡献了此功能。)
sys¶
新的函数 sys.getallocatedblocks()
返回解释器当前分配的块数。(在使用默认的 --with-pymalloc
设置的 CPython 中,这是通过 PyObject_Malloc()
API 进行的分配。)这对于跟踪内存泄漏很有用,尤其是在通过测试套件自动执行时。(由 Antoine Pitrou 在 bpo-13390 中贡献。)
当 Python 解释器在 交互模式 下启动时,它会检查 __interactivehook__
属性是否存在于 sys
模块上。如果该属性存在,则在启动交互模式之前,将调用其值,且不带任何参数。检查是在读取 PYTHONSTARTUP
文件之后进行的,因此可以在此处设置它。site
模块 将其设置为 一个函数,如果平台支持 readline
,则该函数启用制表符完成和历史记录保存(在 ~/.python-history
中)。如果您不想要这种(新)行为,则可以通过从 sys
中删除此属性(或将其设置为其他可调用对象),在 PYTHONSTARTUP
、sitecustomize
或 usercustomize
中覆盖它。(由 Éric Araujo 和 Antoine Pitrou 在 bpo-5845 中贡献。)
tarfile¶
现在,当直接作为脚本或通过 -m
调用时,tarfile
模块支持简单的 命令行接口。这可用于创建和提取 tar 格式的存档文件。(由 Berker Peksag 在 bpo-13477 中贡献。)
textwrap¶
TextWrapper
类有两个新的属性/构造函数参数:max_lines
,用于限制输出中的行数;以及 placeholder
,这是一个字符串,如果由于 max_lines 而截断输出,它将出现在输出的末尾。基于这些功能,一个新的便利函数 shorten()
将输入中的所有空白压缩为单个空格,并生成以 placeholder 结尾的给定 width 的单行(默认为 [...]
)。(由 Antoine Pitrou 和 Serhiy Storchaka 在 bpo-18585 和 bpo-18725 中贡献。)
threading¶
代表主线程的 Thread
对象可以通过新的 main_thread()
函数获得。在正常情况下,这将是启动 Python 解释器的线程。(由 Andrew Svetlov 在 bpo-18882 中贡献。)
traceback¶
新的 traceback.clear_frames()
函数接收一个 traceback 对象并清除它引用的所有帧中的局部变量,从而减少了内存消耗。(由 Andrew Kuchling 在 bpo-1565525 中贡献。)
types¶
新的 DynamicClassAttribute()
描述符提供了一种定义属性的方法,该属性在通过实例对象查找时表现正常,但在通过类查找时,会路由到类的 __getattr__
。这允许在类上激活属性,并在类上具有同名的虚拟属性(有关示例,请参阅 Enum
)。(由 Ethan Furman 在 bpo-19030 中贡献。)
urllib¶
现在,urllib.request
通过 DataHandler
类支持 data:
URLs。(由 Mathias Panzenböck 在 bpo-16423 中贡献。)
现在可以通过在子类上设置 method
类属性来指定 Request
类将使用的 http 方法。(由 Jason R Coombs 在 bpo-18978 中贡献。)
现在,Request
对象是可重用的:如果修改了 full_url
或 data
属性,则所有相关的内部属性都会更新。这意味着,例如,现在可以在多个 OpenerDirector.open()
调用中使用同一个 Request
对象,并使用不同的 data 参数,或者修改 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)
将导致六个子测试,每个子测试在 unittest 详细输出中以由变量名称 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
安装在虚拟环境中。(由 Nick Coghlan 在 bpo-19552 中作为 PEP 453 实现的一部分贡献。)
wave¶
getparams()
方法现在返回一个 namedtuple,而不是一个普通的元组。(由 Claudiu Popa 在 bpo-17487 中贡献。)
wave.open()
现在支持上下文管理协议。(由 Claudiu Popa 在 bpo-17616 中贡献。)
wave
现在可以 将输出写入不可查找的文件。(由 David Jones、Guilherme Polo 和 Serhiy Storchaka 在 bpo-5202 中贡献。)
writeframesraw()
和 writeframes()
方法现在接受任何 类字节对象。(由 Serhiy Storchaka 在 bpo-8311 中贡献。)
weakref¶
新的 WeakMethod
类模拟对绑定方法的弱引用。(由 Antoine Pitrou 在 bpo-14631 中贡献。)
新的 finalize
类可以注册一个回调,以便在对象被垃圾回收时调用,而无需仔细管理弱引用本身的生命周期。(由 Richard Oudkerk 在 bpo-15528 中贡献。)
与 ref
关联的回调(如果有)现在通过 __callback__
属性公开。(由 Mark Dickinson 在 bpo-17643 中贡献。)
xml.etree¶
一个新的解析器 XMLPullParser
允许非阻塞应用程序解析 XML 文档。可以在 用于非阻塞解析的 Pull API 中看到示例。(由 Antoine Pitrou 在 bpo-17741 中贡献。)
xml.etree.ElementTree
的 tostring()
和 tostringlist()
函数,以及 ElementTree
的 write()
方法,现在有一个 short_empty_elements 仅限关键字参数,用于控制是否以缩写形式 (<tag />
) 或展开形式 (<tag></tag>
) 写入没有内容的元素。(由 Ariel Poliak 和 Serhiy Storchaka 在 bpo-14377 中贡献。)
zipfile¶
writepy()
方法 PyZipFile
类有一个新的 filterfunc 选项,可以用来控制哪些目录和文件被添加到存档中。例如,这可以用来排除存档中的测试文件。(由 Christian Tismer 在 bpo-19274 中贡献。)
现在,ZipFile
和 PyZipfile
的 allowZip64 参数默认为 True
。(由 William Mallard 在 bpo-17201 中贡献。)
CPython 实现更改¶
PEP 445:自定义 CPython 内存分配器¶
PEP 445 添加了新的 C 级接口,用于自定义 CPython 解释器中的内存分配。
另请参阅
- PEP 445 – 添加新的 API 以自定义 Python 内存分配器
该 PEP 由 Victor Stinner 撰写和实现。
PEP 442:安全对象终结¶
PEP 442 消除了 CPython 中对象终结的当前限制和怪癖。有了它,具有 __del__()
方法的对象以及具有 finally
子句的生成器可以在它们是引用循环的一部分时被终结。
作为此更改的一部分,在大多数情况下,模块全局变量不再在解释器关闭期间被强制设置为 None
,而是依赖于循环垃圾收集器的正常运行。这避免了一整类解释器关闭时错误,通常涉及 __del__
方法,这些错误自引入循环 GC 以来就一直困扰着 Python。
另请参阅
- PEP 442 – 安全对象终结
由 Antoine Pitrou 编写和实现的 PEP。
PEP 456:安全且可互换的哈希算法¶
PEP 456 跟进了之前在 Python 哈希算法上完成的安全修复工作,以解决某些面向公众的 API(受字典查找支持)可能受到的 DOS 攻击。(请参阅 bpo-14621 了解当前一轮改进的开始。)PEP 统一了 CPython 的哈希代码,以便封装器更容易替换不同的哈希算法,并将 Python 的默认实现切换为具有 64 位数据类型的平台上的 SipHash 实现。与旧的 FNV 算法相比,任何性能差异都是微不足道的。
PEP 将额外的字段添加到 sys.hash_info
named tuple 中,以描述当前正在执行的二进制文件使用的哈希算法。否则,PEP 不会更改任何现有的 CPython API。
PEP 436:参数诊所¶
“参数诊所”(PEP 436)现在是 CPython 构建过程的一部分,可以用来简化定义和维护以 C 实现的内置函数和标准库扩展模块的准确签名的过程。
一些标准库扩展模块已转换为在 Python 3.4 中使用参数诊所,并且 pydoc
和 inspect
已相应更新。
预计用于程序内省的签名元数据将作为 Python 3.4 维护版本的一部分添加到 C 中实现的额外可调用对象中。
注意
参数诊所 PEP 与实现的当前状态不完全同步。在这种情况下,发布经理和核心开发团队认为这是可以接受的,因为参数诊所不会在 Python 3.4 中作为公共 API 提供给第三方使用。
另请参阅
- PEP 436 – 参数诊所 DSL
由 Larry Hastings 编写和实现的 PEP。
其他构建和 C API 更改¶
新的
PyType_GetSlot()
函数已添加到稳定的 ABI 中,允许在使用有限 API 时从命名类型槽检索函数指针。(由 Martin von Löwis 在 bpo-17162 中贡献。)新的
Py_SetStandardStreamEncoding()
预初始化 API 允许嵌入 CPython 解释器的应用程序可靠地强制标准流使用特定的编码和错误处理程序。(由 Bastien Montagne 和 Nick Coghlan 在 bpo-16129 中贡献。)大多数不改变字符串参数的 Python C API 现在都正确地标记为接受
const char *
而不是char *
。(由 Serhiy Storchaka 在 bpo-1772673 中贡献。)即使在没有 Python 解释器可用时(例如,在交叉编译场景中),也可以使用新的 shell 版本的
python-config
。PyUnicode_FromFormat()
现在支持%s
、%A
、%U
、%V
、%S
和%R
的宽度和精度规范。(由 Ysj Ray 和 Victor Stinner 在 bpo-7330 中贡献。)新函数
PyStructSequence_InitType2()
补充了现有的PyStructSequence_InitType()
函数。不同之处在于,它在成功时返回0
,失败时返回-1
。现在可以使用 GCC 和 clang 的最新版本的地址健全性检查功能编译 CPython 源代码:小型对象分配器中的误报已被消除。(由 Dhiru Kholia 在 bpo-18596 中贡献。)
Windows 构建现在使用地址空间布局随机化和数据执行保护。(由 Christian Heimes 在 bpo-16632 中贡献。)
新函数
PyObject_LengthHint()
是operator.length_hint()
的 C API 等效项。(由 Armin Ronacher 在 bpo-16148 中贡献。)
其他改进¶
python 命令有一个新的 选项
-I
,这将使其在 “隔离模式” 下运行,这意味着sys.path
既不包含脚本的目录,也不包含用户的site-packages
目录,并且所有PYTHON*
环境变量都被忽略(它同时暗示-s
和-E
)。未来可能还会应用其他限制,其目标是将脚本的执行与用户的环境隔离。例如,当 Python 用于运行系统脚本时,这是合适的。在大多数 POSIX 系统上,它可以在并且应该在系统脚本的#!
行中使用。(由 Christian Heimes 在 bpo-16499 中贡献。)在支持
readline
的系统上,交互式解释器现在默认启用 Tab 补全。历史记录也默认启用,并写入(以及从中读取)文件~/.python-history
。(由 Antoine Pitrou 和 Éric Araujo 在 bpo-5845 中贡献。)使用
--version
调用 Python 解释器现在将版本输出到标准输出而不是标准错误 (bpo-18338)。对argparse
(bpo-18920) 和其他具有类似脚本调用功能的模块 (bpo-18922) 进行了类似的更改。CPython Windows 安装程序现在在注册扩展名时将
.py
添加到PATHEXT
变量,允许用户通过仅键入其名称而不带.py
扩展名在 Windows 命令提示符下运行 Python 脚本。(由 Paul Moore 在 bpo-18569 中贡献。)新的
make
目标 coverage-report 将构建 Python,运行测试套件,并使用gcov
和 lcov 为 C 代码库生成 HTML 覆盖率报告。现在,Python 回归测试套件的
-R
选项还会使用sys.getallocatedblocks()
检查内存分配泄漏。(由 Antoine Pitrou 在 bpo-13390 中贡献。)python -m
现在可以与命名空间包一起使用。stat
模块现在用 C 实现,这意味着它从 C 头文件获取其常量的值,而不是像以前那样将这些值硬编码在 Python 模块中。现在可以正确加载来自单个操作系统模块(
.so
、.dll
)的多个 Python 模块(以前它会默默地返回文件中的第一个 Python 模块)。(由 Václav Šmilauer 在 bpo-16421 中贡献。)添加了一个新的操作码
LOAD_CLASSDEREF
,以修复类主体中加载自由变量的错误,该错误可能会被某些 __prepare__ 的用法触发。(由 Benjamin Peterson 在 bpo-17853 中贡献。)Victor Stinner 使用他基于 PEP 445 的
pyfailmalloc
工具识别并修复了许多与 MemoryError 相关的崩溃 (bpo-18408, bpo-18520)。pyvenv
命令现在接受一个--copies
选项,即使在默认使用符号链接的系统上,也可以使用副本而不是符号链接。(由 Vinay Sajip 在 bpo-18807 中贡献。)pyvenv
命令还接受一个--without-pip
选项,以抑制否则会自动将 pip 引导到虚拟环境中。(由 Nick Coghlan 在 bpo-19552 中贡献,作为 PEP 453 实现的一部分。)现在,
PYTHONIOENCODING
环境变量的值集中编码名称是可选的。这使得可以仅设置错误处理程序,而无需更改默认编码。(由 Serhiy Storchaka 在 bpo-18818 中贡献。)bz2
、lzma
和gzip
模块的open
函数现在支持x
(独占创建)模式。(由 Tim Heaney 和 Vajrasky Kok 在 bpo-19201、bpo-19222 和 bpo-19223 中贡献。)
重大优化¶
UTF-32 解码器现在快了 3 到 4 倍。(由 Serhiy Storchaka 在 bpo-14625 中贡献。)
现在减少了集合的哈希冲突成本。每个哈希表探测现在会检查一系列连续的相邻键/哈希对,然后再继续在哈希表中进行随机探测。这利用了缓存局部性,使冲突解决的成本更低。冲突解决方法可以描述为线性探测和开放寻址的混合体。其他线性探测的数量默认为 9。可以通过在编译时将 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()
现在快了 10 倍。(由 Matt Bryant 在 bpo-18020 中贡献。)在 Windows 上,现在在
obmalloc
中使用原生VirtualAlloc
,而不是 CRTmalloc
。人工基准测试显示内存节省约 3%。os.urandom()
现在使用延迟打开的持久性文件描述符,以避免在多个线程并行运行时使用大量文件描述符。(由 Antoine Pitrou 在 bpo-18756 中贡献。)
已弃用¶
本节介绍了 Python 3.4 中已弃用并在 Python 3.5 或更高版本中移除的各种 API 和其他功能。在大多数(但并非所有)情况下,使用已弃用的 API 会在启用弃用警告时(例如,通过使用 -Wd
)运行解释器时产生 DeprecationWarning
。
Python API 中的弃用¶
正如在 PEP 451:导入系统的 ModuleSpec 类型 中提到的,许多
importlib
方法和函数已被弃用:importlib.find_loader()
被importlib.util.find_spec()
取代;importlib.machinery.PathFinder.find_module()
被importlib.machinery.PathFinder.find_spec()
取代;importlib.abc.MetaPathFinder.find_module()
被importlib.abc.MetaPathFinder.find_spec()
取代;importlib.abc.PathEntryFinder.find_loader()
和find_module()
被importlib.abc.PathEntryFinder.find_spec()
取代;所有xxxLoader
ABCload_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
的参数都应通过关键字传递。
已弃用的特性¶
已移除¶
不再支持的操作系统¶
以下操作系统的支持已从源代码和构建工具中移除
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
getter 和 setter 方法add_data
、has_data
、get_data
、get_type
、get_host
、get_selector
、set_proxy
、get_origin_req_host
和is_unverifiable
已被移除(请使用直接属性访问代替)。已移除从
marshal
加载已弃用的TYPE_INT64
的支持。(由 Dan Riti 在 bpo-15480 中贡献。)inspect.Signature
:现在要求仅位置参数具有有效的名称。object.__format__()
不再接受非空格式字符串,现在会引发TypeError
。自 Python 3.2 以来,使用非空字符串已被弃用。进行此更改是为了防止在对象获得 __format__ 方法时,先前工作(但不正确)的代码开始失败的情况,这意味着如果使用不具有处理它的 __format__ 方法的对象使用's'
格式代码,则代码现在可能会引发TypeError
。有关背景信息,请参阅 bpo-7994。difflib.SequenceMatcher.isbjunk()
和difflib.SequenceMatcher.isbpopular()
在 3.2 中已弃用,现在已被移除:请使用x in sm.bjunk
和x in sm.bpopular
,其中 sm 是SequenceMatcher
对象 (bpo-13248)。
代码清理¶
移植到 Python 3.4¶
本节列出了之前描述的更改和其他可能需要更改代码的错误修复。
“python”命令行为的更改¶
在 posix shell 中,将
PATH
环境变量设置为空值等效于根本不设置它。但是,将PYTHONPATH
设置为空值不等效于根本不设置它:将PYTHONPATH
设置为空值等效于将其设置为.
,这在类比PATH
的工作方式时会导致混淆。该行为现在符合PATH
的 posix 约定。默认情况下,现在关闭 CPython 解释器的调试 (
--with-pydebug
) 构建的 [X refs, Y blocks] 输出。可以使用-X showrefcount
选项重新启用它。(由 Ezio Melotti 在 bpo-17323 中贡献。)python 命令和大多数 stdlib 脚本(以及
argparse
)现在将--version
信息输出到stdout
而不是stderr
(有关问题列表,请参见上面的 其他改进)。
Python API 的更改¶
importlib.abc
中定义的 ABC 现在会引发适当的异常或返回默认值,而不是盲目地引发NotImplementedError
。这只会影响调用super()
并一直传递到 ABC 的代码。为了兼容性,请根据需要捕获NotImplementedError
或适当的异常。模块类型现在默认将
__package__
和__loader__
属性初始化为None
。要确定这些属性是否以向后兼容的方式设置,请使用例如getattr(module, '__loader__', None) is not None
。(bpo-17115。)importlib.util.module_for_loader()
现在无条件地设置__loader__
和__package__
以正确支持重新加载。如果不需要这样做,则需要手动设置这些属性。您可以使用importlib.util.module_to_load()
进行模块管理。导入现在在重新加载时无条件地重置相关属性(例如,
__name__
,__loader__
,__package__
,__file__
,__cached__
)。请注意,这恢复了 3.3 之前的行为,这意味着在重新加载时会重新找到模块(bpo-19413)。冻结包不再将
__path__
设置为包含包名称的列表,而是将其设置为空列表。如果存在与冻结包名称相同的目录,则之前的行为可能会导致导入系统在子模块导入上执行错误的操作。确定模块是否是包的正确方法是使用hasattr(module, '__path__')
(bpo-18065)。冻结模块不再定义
__file__
属性。对于冻结模块来说,设置该属性在语义上是不正确的,因为它们不是从任何显式位置加载的。如果您必须知道模块来自冻结代码,则可以查看模块的__spec__.location
是否设置为'frozen'
,检查加载器是否是importlib.machinery.FrozenImporter
的子类,或者如果需要 Python 2 兼容性,则可以使用imp.is_frozen()
。如果
py_compile.compile()
要写入的文件路径是符号链接或非普通文件,则现在会引发FileExistsError
。这是为了发出警告,即导入会将这些文件覆盖为普通文件,而不管它们最初的文件路径类型是什么。当加载的源代码触发
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)。ssl.SSLSocket.getpeercert()
和ssl.SSLSocket.do_handshake()
现在当SSLSocket
未连接时,会引发带有ENOTCONN
的OSError
,而不是之前的引发AttributeError
的行为。此外,如果尚未完成握手,getpeercert()
将引发ValueError
。现在,当输入字符串包含非 b32 字母表字符时,
base64.b32decode()
会引发binascii.Error
,而不是TypeError
。当其他TypeError
被转换时,这个特定的TypeError
被遗漏了。(由 Serhiy Storchaka 在 bpo-18011 中贡献。)注意:此更改也无意中应用于 Python 3.3.3。现在,当创建
cgi.FieldStorage
实例被垃圾回收时,file
属性会自动关闭。 如果你将文件对象从cgi.FieldStorage
实例中单独提取出来,并且没有保持实例处于活动状态,那么你应该存储整个cgi.FieldStorage
实例,或者在cgi.FieldStorage
实例被垃圾回收之前读取文件的内容。现在,对已关闭的 SSL 套接字调用
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
构造函数错误地接受了 base 参数的float
值。 很少有人会这样做,但如果有人这样做,现在会引发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 对象。 以前,返回类型与输入类型匹配,因此,如果你的代码依赖于返回值为,例如,bytearray
,则你需要更改代码。如果传递字符串输入,
audioop
函数现在会立即引发错误,而不是稍后随机失败(bpo-16685)。新的 convert_charrefs 参数对于
HTMLParser
类,目前为了向后兼容,默认值为False
,但最终会更改为默认值True
。建议你在代码中所有调用HTMLParser
的地方都添加此关键字,并赋予适当的值 (bpo-13633)。由于
hmac.new()
函数的 digestmod 参数在未来将没有默认值,因此所有对hmac.new()
的调用都应该修改为显式指定 digestmod (bpo-17276)。使用
SO
键调用sysconfig.get_config_var()
,或者在调用sysconfig.get_config_vars()
的结果中查找SO
是不推荐的。这个键应该根据上下文替换为EXT_SUFFIX
或SHLIB_SUFFIX
(bpo-19555)。所有指定了
U
的open
函数调用都应该修改。U
在 Python 3 中无效,如果使用最终会引发错误。根据函数的不同,可以使用 newline 参数来实现其旧的 Python 2 行为,或者如果需要,可以将流包装在TextIOWrapper
中以使用其 newline 参数 (bpo-15204)。如果在脚本中使用
pyvenv
并且不希望安装 pip,则必须在命令调用中添加--without-pip
。当指定缩进时,
json.dump()
和json.dumps()
的默认行为已更改:它不再在行尾项分隔逗号后产生尾随空格。 只有当你的测试对这种输出进行空格敏感的比较时,这才会产生影响 (bpo-16333)。doctest
现在会在扩展模块的__doc__
字符串中查找 doctest,因此如果你的 doctest 测试发现包含具有看起来像 doctest 的内容的扩展模块,那么在运行测试时可能会看到以前从未见过的测试失败 (bpo-3158)。作为 Python 启动改进的一部分,
collections.abc
模块已稍作重构。因此,导入collections
不再自动导入collections.abc
。 如果你的程序依赖于(未文档化的)隐式导入,则需要添加显式的import collections.abc
(bpo-20784)。
C API 中的更改¶
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
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)