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
:基于select
模块原语构建的高级高效 I/O 复用(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()
) 和 CRLs(证书吊销列表,请参阅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
。
对于 POSIX 系统上的 CPython 源代码构建,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 模块部分已完全重新设计为简短的入门和常见问题文档。大多数打包文档现在已移至 Python 打包管理局维护的Python 打包用户指南以及各个项目的文档中。
然而,由于此迁移目前仍不完整,这些指南的旧版本仍然可用,例如使用 setuptools 构建 C 和 C++ 扩展和使用 setuptools 构建 C 和 C++ 扩展。
参见
- PEP 453 – Python 安装中 pip 的显式引导
PEP 由 Donald Stufft 和 Nick Coghlan 撰写,由 Donald Stufft、Nick Coghlan、Martin von Löwis 和 Ned Deily 实现。
PEP 446:新创建的文件描述符不可继承¶
PEP 446 使新创建的文件描述符不可继承。一般来说,这是应用程序希望的行为:当启动一个新进程时,当前打开的文件在新进程中也打开可能导致各种难以发现的错误,并可能导致安全问题。
但是,有时需要继承。为了支持这些情况,提供了以下新函数和方法
参见
- PEP 446 – 使新创建的文件描述符不可继承
PEP 由 Victor Stinner 撰写和实现。
编解码器处理的改进¶
自首次引入以来,codecs
模块一直旨在作为类型中立的动态编码和解码系统运行。然而,它与 Python 文本模型的紧密耦合,特别是内置的 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 中贡献。)新的德语 EBCDIC 编解码器
cp273
。(由 Michael Bierenfeld 和 Andrew Kuchling 在 bpo-1097797 中贡献。)bytes
.join() 和bytearray
.join() 现在接受任意缓冲区对象作为参数。(由 Antoine Pitrou 在 bpo-15958 中贡献。)int
构造函数现在接受任何在其 *base* 参数中具有__index__
方法的对象。(由 Mark Dickinson 在 bpo-16772 中贡献。)帧对象现在有一个
clear()
方法,该方法清除帧中对局部变量的所有引用。(由 Antoine Pitrou 在 bpo-17934 中贡献。)memoryview
现在注册为Sequence
,并支持reversed()
内置函数。(由 Nick Coghlan 和 Claudiu Popa 在 bpo-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 – 异步 IO 支持重启:“asyncio” 模块
PEP 由 Guido van Rossum 撰写并领导实现。
确保安装pip¶
新的 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,此模块被视为临时 API。
参见
- PEP 428 – pathlib 模块 – 面向对象的文件系统路径
PEP 由 Antoine Pitrou 撰写和实现。
选择器¶
新的 selectors
模块(作为实现 PEP 3156 的一部分创建)允许高效的高级 I/O 复用,基于 select
模块原语构建。
statistics¶
新的 statistics
模块(在 PEP 450 中定义)直接在标准库中提供了一些核心统计功能。此模块支持计算数据系列的均值、中位数、众数、方差和标准差。
参见
- PEP 450 – 向标准库添加统计模块
PEP 由 Steven D’Aprano 撰写和实现
tracemalloc¶
新的 tracemalloc
模块(在 PEP 454 中定义)是一个调试工具,用于跟踪 Python 分配的内存块。它提供以下信息
跟踪对象的分配位置
按文件名和行号统计已分配内存块:总大小、已分配内存块的数量和平均大小
计算两个快照之间的差异以检测内存泄漏
参见
- PEP 454 – 添加一个新的 tracemalloc 模块以跟踪 Python 内存分配
PEP 由 Victor Stinner 撰写和实现
改进的模块¶
abc¶
新函数 abc.get_cache_token()
可用于了解何时使受对象图更改影响的缓存失效。(由 Łukasz Langa 在 bpo-16832 中贡献。)
新类 ABC
具有 ABCMeta
作为其元类。使用 ABC
作为基类与指定 metaclass=abc.ABCMeta
的效果基本相同,但键入更简单,阅读更容易。(由 Bruno Dupuis 在 bpo-16049 中贡献。)
aifc¶
getparams()
方法现在返回一个命名元组而不是普通元组。(由 Claudiu Popa 在 bpo-17818 中贡献。)
aifc.open()
现在支持上下文管理协议:当在 with
块中使用时,返回对象的 close()
方法将在块结束时自动调用。(由 Serhiy Storchacha 在 bpo-16486 中贡献。)
writeframesraw()
和 writeframes()
方法现在接受任何类字节对象。(由 Serhiy Storchaka 在 bpo-8311 中贡献。)
argparse¶
FileType
类现在接受 *encoding* 和 *errors* 参数,这些参数将传递给 open()
。(由 Lucas Maystre 在 bpo-11175 中贡献。)
音频操作¶
audioop
现在支持 24 位采样。(由 Serhiy Storchaka 在 bpo-12866 中贡献。)
新的 byteswap()
函数将大端序样本转换为小端序,反之亦然。(由 Serhiy Storchaka 在 bpo-19641 中贡献。)
所有 audioop
函数现在都接受任何类字节对象。不接受字符串:它们以前不起作用,现在它们会立即引发错误。(由 Serhiy Storchaka 在 bpo-16685 中贡献。)
base64¶
base64
中的编码和解码函数现在接受任何类字节对象,而以前它要求 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 中贡献。)
颜色系统¶
RGB — YIQ 转换的系数中的数字位数已扩展,以使其与 FCC NTSC 版本匹配。结果变化应小于 1%,并且可能更好地匹配其他地方找到的结果。(由 Brian Landers 和 Serhiy Storchaka 在 bpo-14323 中贡献。)
contextlib¶
新的 contextlib.suppress
上下文管理器有助于澄清故意抑制单个语句中的异常的代码意图。(由 Raymond Hettinger 在 bpo-15806 和 Zero Piraeus 在 bpo-19266 中贡献。)
新的 contextlib.redirect_stdout()
上下文管理器使实用程序脚本更容易处理将输出写入 sys.stdout
且不提供任何重定向选项的僵硬 API。使用上下文管理器,sys.stdout
输出可以重定向到任何其他流,或者结合 io.StringIO
,重定向到字符串。后者尤其有用,例如,用于捕获旨在实现命令行界面的函数的输出。它仅建议用于实用程序脚本,因为它会影响 sys.stdout
的全局状态。(由 Raymond Hettinger 在 bpo-15805 中贡献。)
contextlib
文档也已更新,以包含关于单次使用、可重用和可重入上下文管理器之间差异的讨论。
dbm¶
dbm.open()
对象现在支持上下文管理协议。当在 with
语句中使用时,数据库对象的 close
方法将在块结束时自动调用。(由 Claudiu Popa 和 Nick Coghlan 在 bpo-19282 中贡献。)
dis¶
函数 show_code()
、dis()
、distb()
和 disassemble()
现在接受一个仅关键字 *file* 参数,该参数控制它们将输出写入何处。
dis
模块现在围绕 Instruction
类构建,该类提供对每个单独字节码操作的详细信息的面向对象访问。
一个新方法 get_instructions()
提供了一个迭代器,该迭代器为给定的 Python 代码片段发出指令流。因此,现在可以编写一个程序,以不同于 dis
模块本身提供的方式检查和操作字节码对象。例如
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
dis
模块中的各种显示工具已重写以使用这些新组件。
此外,一个新的对应用程序友好的类 Bytecode
提供了一个面向对象的 API,用于以人类可读的形式检查字节码以及迭代指令。Bytecode
构造函数接受与 get_instructions()
相同的参数(加上一个可选的 *current_offset*),并且生成的结果对象可以迭代以生成 Instruction
对象。但它也有一个 dis
方法,等同于在构造函数参数上调用 dis
,但作为多行字符串返回
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode
还有一个类方法 from_traceback()
,它提供了操作回溯的能力(即 print(Bytecode.from_traceback(tb).dis())
等同于 distb(tb)
)。
(由 Nick Coghlan、Ryan Kelly 和 Thomas Kluyver 在 bpo-11816 中以及 Claudiu Popa 在 bpo-17916 中贡献。)
新函数 stack_effect()
计算给定操作码和参数对 Python 堆栈的影响,这些信息在其他地方不可用。(由 Larry Hastings 在 bpo-19722 中贡献。)
doctest¶
一个新的 选项标志 FAIL_FAST
,一旦检测到第一个失败,就会停止测试运行。(由 R. David Murray 和 Daniel Urban 在 bpo-16522 中贡献。)
doctest
命令行接口现在使用 argparse
,并且有两个新选项,-o
和 -f
。-o
允许在命令行上指定 doctest 选项,而 -f
是 -o FAIL_FAST
的简写(以并行 unittest
CLI 支持的类似选项)。(由 R. David Murray 在 bpo-11390 中贡献。)
doctest
现在将在扩展模块 __doc__
字符串中查找 doctests。(由 Zachary Ware 在 bpo-3158 中贡献。)
email¶
as_string()
现在接受一个 *policy* 参数,用于在生成消息的字符串表示时覆盖消息的默认策略。这意味着 as_string
现在可以在更多情况下使用,而不必创建和使用 generator
来将其格式化参数传递给其 flatten
方法。(由 R. David Murray 在 bpo-18600 中贡献。)
添加了新方法 as_bytes()
,用于生成消息的字节表示,其方式类似于 as_string
生成字符串表示。它不接受 *maxheaderlen* 参数,但接受 *unixfrom* 和 *policy* 参数。Message
__bytes__()
方法调用它,这意味着 bytes(mymsg)
现在将产生直观的结果:一个包含完整格式化消息的字节对象。(由 R. David Murray 在 bpo-18600 中贡献。)
Message.set_param()
方法现在接受一个 *replace* 关键字参数。指定时,关联的头部将被更新,而不会更改其在头部列表中的位置。为了向后兼容性,默认值为 False
。(由 R. David Murray 在 bpo-18891 中贡献。)
Message
的两个新子类(EmailMessage
和 MIMEPart
)以及一个新的子模块 contentmanager
和一个新的 policy
属性 content_manager
已添加。所有文档目前都在新模块中,该模块作为电子邮件新临时 API的一部分添加。这些类提供了许多新方法,使从电子邮件消息中提取内容和向其中插入内容变得更加容易。有关详细信息,请参阅 contentmanager
文档和 email: 示例。这些 API 添加完成了电子邮件 6 项目计划的大部分工作。目前临时 API 计划在 Python 3.5 中最终确定(可能在错误处理领域有一些小的添加)。(由 R. David Murray 在 bpo-18891 中贡献。)
文件比较¶
新函数 clear_cache()
提供了清除 filecmp
比较缓存的功能,该缓存使用 os.stat()
信息来确定文件自上次比较以来是否已更改。例如,如果文件可能在比特定文件系统的文件修改时间字段分辨率更短的时间内被更改并重新检查,则可以使用此功能。(由 Mark Levitt 在 bpo-18149 中贡献。)
新的模块属性 DEFAULT_IGNORES
提供了目录列表,用作 dircmp()
函数的 *ignore* 参数的默认值。(由 Eli Bendersky 在 bpo-15442 中贡献。)
functools¶
新的 partialmethod()
描述符为描述符带来了部分参数应用,就像 partial()
为普通可调用对象提供的那样。新的描述符还使任意可调用对象(包括 partial()
实例)在包含在类定义中时更容易表现得像普通实例方法。(由 Alon Horev 和 Nick Coghlan 在 bpo-4331 中贡献。)
新的 singledispatch()
装饰器为 Python 标准库带来了对单分派泛型函数的支持。面向对象编程侧重于将对一组共同数据的多个操作分组到一个类中,而泛型函数则侧重于将一个操作的多个实现分组,使其能够与*不同*类型的数据一起工作。
参见
- PEP 443 – 单分派泛型函数
PEP 由 Łukasz Langa 撰写和实现。
total_ordering()
现在支持底层比较函数返回 NotImplemented
。(由 Katie Miller 在 bpo-10042 中贡献。)
partial()
函数的纯 Python 版本现在已在 stdlib 中;在 CPython 中,它被 C 加速版本覆盖,但可供其他实现使用。(由 Brian Thorne 在 bpo-12428 中贡献。)
gc¶
新函数 get_stats()
返回一个包含三个按代划分的字典的列表,其中包含解释器启动以来的垃圾回收统计信息。(由 Antoine Pitrou 在 bpo-16351 中贡献。)
glob¶
新函数 escape()
提供了一种转义文件名中特殊字符的方法,使它们不会成为 globbing 扩展的一部分,而是按字面值匹配。(由 Serhiy Storchaka 在 bpo-8402 中贡献。)
hashlib¶
新函数 hashlib.pbkdf2_hmac()
提供了 PKCS#5 基于密码的密钥派生函数 2。(由 Christian Heimes 在 bpo-18582 中贡献。)
hashlib
哈希对象的 name
属性现在是一个正式支持的接口。它在 CPython 的 hashlib
中一直存在(尽管它并未对所有支持的哈希返回小写名称),但它不是公共接口,因此一些其他 Python 实现以前不支持它。(由 Jason R. Coombs 在 bpo-18532 中贡献。)
hmac¶
hmac
现在接受 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 和编辑器,并且不打算被其他程序导入,因此它在每个版本中都得到了改进。有关自 3.3.0 以来的累计更改以及未来 3.4.x 版本中的更改,请参阅 Lib/idlelib/NEWS.txt
。此文件也可通过 IDLE 对话框获取。
importlib¶
InspectLoader
抽象基类定义了一个新方法 source_to_code()
,它接受源数据和路径,并返回一个代码对象。默认实现等同于 compile(data, path, 'exec', dont_inherit=True)
。(由 Eric Snow 和 Brett Cannon 在 bpo-15627 中贡献。)
InspectLoader
现在也为 get_code()
方法提供了默认实现。然而,出于性能原因,通常希望覆盖默认实现。(由 Brett Cannon 在 bpo-18072 中贡献。)
reload()
函数已从 imp
移至 importlib
,作为 imp
模块弃用的一部分。(由 Berker Peksag 在 bpo-18193 中贡献。)
importlib.util
现在有一个 MAGIC_NUMBER
属性,提供对字节码版本号的访问。这取代了已弃用的 imp
模块中的 get_magic()
函数。(由 Brett Cannon 在 bpo-18192 中贡献。)
新的 importlib.util
函数 cache_from_source()
和 source_from_cache()
取代了已弃用的 imp
模块中同名的函数。(由 Brett Cannon 在 bpo-18194 中贡献。)
importlib
引导程序 NamespaceLoader
现在符合 InspectLoader
抽象基类,这意味着 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__
属性的对象、具有参数 clinic 提供的元数据的对象、functools.partial()
对象等。请注意,与 signature()
不同,这些函数仍然忽略 __wrapped__
属性,并报告已绑定方法的已绑定的第一个参数,因此如果需要这些功能,仍然需要更新您的代码以直接使用 signature()
。(由 Yury Selivanov 在 bpo-17481 中贡献。)
signature()
现在支持 CPython 函数的鸭子类型,这增加了对用 Cython 编译的函数的支持。(由 Stefan Behnel 和 Yury Selivanov 在 bpo-17159 中贡献。)
ipaddress¶
ipaddress
在 Python 3.3 中作为 临时 API 添加到标准库中。随着 Python 3.4 的发布,此限定已被移除:ipaddress
现在被视为稳定 API,受正常标准库维护向后兼容性的要求约束。
一个新的 is_global
属性,如果地址是全局可路由的,则为 True
。(由 Peter Moody 在 bpo-17400 中贡献。)
logging¶
TimedRotatingFileHandler
有一个新的 atTime 参数,可用于指定轮换发生的时间。(由 Ronald Oussoren 在 bpo-9556 中贡献。)
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 的行为,即只记录 interned 字符串的一个副本并在反序列化时保留 interning,并将此“一个副本”功能扩展到任何对象类型(包括处理递归引用)。这减少了 .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
和其他在该上下文下操作的对象。这允许框架和应用程序或同一应用程序的不同部分使用多进程而不相互干扰。(由 Richard Oudkerk 在 bpo-18999 中贡献。)
除了使用旧的 *fork* 启动方法外,子进程不再继承父进程不必要的句柄/文件描述符(bpo-8713 的一部分)。
multiprocessing
现在依赖于 runpy
(它实现了 -m
开关)在使用 spawn
或 forkserver
启动方法时,在子进程中适当地初始化 __main__
。这解决了将多进程、-m
命令行开关和显式相对导入结合使用时,在子进程中可能导致某些模糊失败的边缘情况。(由 Nick Coghlan 在 bpo-19946 中贡献。)
operator¶
新函数 length_hint()
提供了关于如何使用 __length_hint__()
特殊方法的规范的实现,作为 PEP 424 语言特征的正式规范的一部分。(由 Armin Ronacher 在 bpo-16148 中贡献。)
现在有一个 operator
模块的纯 Python 版本,可供参考和供 Python 的其他实现使用。(由 Zachary Ware 在 bpo-16694 中贡献。)
os¶
有一些新函数可以获取和设置文件描述符(os.get_inheritable()
, os.set_inheritable()
)或 Windows 句柄(os.get_handle_inheritable()
, os.set_handle_inheritable()
)的 可继承标志。
新函数 cpu_count()
报告 Python 运行平台上可用的 CPU 数量(如果无法确定数量,则为 None
)。multiprocessing.cpu_count()
函数现在是基于此函数实现的)。(由 Trent Nelson、Yogesh Chaudhari、Victor Stinner 和 Charles-François Natali 在 bpo-17914 中贡献。)
os.path.samestat()
现在在 Windows 平台上可用(并且 os.path.samefile()
实现现在在 Unix 和 Windows 之间共享)。(由 Brian Curtin 在 bpo-11939 中贡献。)
os.path.ismount()
现在可以识别 Windows 上挂载在驱动器根目录下的卷。(由 Tim Golden 在 bpo-9035 中贡献。)
os.open()
支持两个新的标志,如果平台提供它们:O_PATH
(未打开的文件描述符)和 O_TMPFILE
(无名临时文件;截至 3.4.0 版本,仅在 Linux 内核版本 3.11 或更高且具有 uapi 头文件的系统上可用)。(由 Christian Heimes 在 bpo-18673 中以及 Benjamin Peterson 贡献。)
pdb¶
pdb
已增强,以更有用的方式处理生成器、yield
和 yield from
。这在调试基于 asyncio
的程序时特别有用。(由 Andrew Svetlov 和 Xavier de Gaye 在 bpo-16596 中贡献。)
pdb
中的 print
命令已被移除,恢复了从 pdb 命令行访问 Python print()
函数的功能。Python2 的 pdb
没有 print
命令;相反,输入 print
会执行 print
语句。在 Python3 中,print
错误地成为了 pdb p
命令的别名。p
打印其参数的 repr
,而不是像 Python2 的 print
命令那样打印 str
。更糟糕的是,Python3 的 pdb print
命令遮蔽了 Python3 的 print
函数,使其在 pdb
提示符下无法访问。(由 Connor Osborn 在 bpo-18764 中贡献。)
pickle¶
pickle
现在支持(但默认不使用)新的 pickle 协议,协议 4。此新协议解决了以前协议中存在的许多问题,例如嵌套类、非常大的字符串和容器以及其 __new__()
方法接受仅限关键字参数的类的序列化。它还提供了一些效率改进。
参见
- PEP 3154 – Pickle protocol 4
PEP 由 Antoine Pitrou 编写,并由 Alexandre Vassalotti 实现。
plistlib¶
plistlib
现在具有类似于 stdlib 序列化协议标准模式的 API,具有新的 load()
、dump()
、loads()
和 dumps()
函数。(旧 API 现已弃用。)除了已支持的 XML plist 格式(FMT_XML
)之外,它现在还支持二进制 plist 格式(FMT_BINARY
)。(由 Ronald Oussoren 等人 在 bpo-14455 中贡献。)
poplib¶
poplib
已添加两个新方法:capa()
,它返回 POP 服务器发布的 capabilities 列表;以及 stls()
,如果 POP 服务器支持,它将明文 POP3 会话切换到加密 POP3 会话。(由 Lorenzo Catucci 在 bpo-4473 中贡献。)
pprint¶
pprint
模块的 PrettyPrinter
类及其 pformat()
和 pprint()
函数有一个新选项 compact,它控制输出的格式。目前,将 compact 设置为 True
意味着序列将以每行(缩进)可容纳的尽可能多的序列元素打印。(由 Serhiy Storchaka 在 bpo-19132 中贡献。)
长字符串现在使用 Python 的正常行继续语法进行换行。(由 Antoine Pitrou 在 bpo-17150 中贡献。)
pty¶
pty.spawn()
现在返回子进程的 os.waitpid()
的状态值,而不是 None
。(由 Gregory P. Smith 贡献。)
pydoc¶
pydoc
模块现在直接基于 inspect.signature()
内省 API,允许它为各种可调用对象提供签名信息。此更改也意味着在显示帮助信息时会考虑 __wrapped__
属性。(由 Larry Hastings 在 bpo-19674 中贡献。)
pydoc
模块不再显示已绑定方法的 self
参数。相反,它旨在始终显示所提供的可调用对象的精确当前签名。(由 Larry Hastings 在 bpo-20710 中贡献。)
除了对 pydoc
直接进行的更改外,由于 inspect
模块的底层更改,其对自定义 __dir__
方法和各种描述符行为的处理也得到了显著改进。
re¶
新函数 fullmatch()
和 Pattern.fullmatch()
方法将模式锚定在字符串的两端以进行匹配。这提供了一种明确匹配目标的方法,避免了因代码更改或向现有正则表达式添加替代项而导致 $
字符丢失的一类细微错误。(由 Matthew Barnett 在 bpo-16203 中贡献。)
正则表达式对象 的 repr 现在包含模式和标志;匹配对象 的 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 中贡献。)
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 的标准库的新推荐最佳实践是使用 create_default_context()
获取 SSLContext
对象,根据需要进行修改,然后将其作为适当标准库 API 的 context 参数传递。(由 Christian Heimes 在 bpo-19689 中贡献。)
SSLContext
方法 load_verify_locations()
接受一个新的可选参数 cadata,可用于分别通过字符串或字节直接提供 PEM 或 DER 编码的证书。(由 Christian Heimes 在 bpo-18138 中贡献。)
新函数 get_default_verify_paths()
返回一个命名元组,包含 set_default_verify_paths()
方法用于设置 OpenSSL 默认 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 证书存储区检索证书、证书信息和 CRLs 的能力。(由 Christian Heimes 在 bpo-17134 中贡献。)
使用新的 ssl.SSLContext.set_servername_callback()
方法支持服务器端 SNI(服务器名称指示)。(由 Daniel Black 在 bpo-8109 中贡献。)
SSLSocket.getpeercert()
返回的字典包含额外的 X509v3
扩展项:crlDistributionPoints
、calIssuers
和 OCSP
URIs。(由 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()
方法现在接受任何类字节对象。(由 Serhiy Storchaka 在 bpo-8311 中贡献。)
sys¶
新函数 sys.getallocatedblocks()
返回解释器当前分配的块数。(在 CPython 中,使用默认的 --with-pymalloc
设置,这是通过 PyObject_Malloc()
API 进行的分配。)这对于跟踪内存泄漏非常有用,尤其是通过测试套件自动化跟踪时。(由 Antoine Pitrou 在 bpo-13390 中贡献。)
当 Python 解释器在 交互模式 下启动时,它会检查 sys
模块上的 __interactivehook__
属性。如果该属性存在,则在交互模式启动之前不带任何参数调用其值。此检查在读取 PYTHONSTARTUP
文件之后进行,因此可以在其中设置。如果平台支持 readline
,site
模块会将其设置为一个启用 Tab 补全和历史记录保存(在 ~/.python-history
中)的函数。如果您不希望出现此(新)行为,可以在 PYTHONSTARTUP
、sitecustomize
或 usercustomize
中通过从 sys
中删除此属性(或将其设置为其他可调用对象)来覆盖它。(由 Éric Araujo 和 Antoine Pitrou 在 bpo-5845 中贡献。)
tarfile¶
tarfile
模块现在在直接作为脚本调用或通过 -m
调用时支持简单的 命令行接口。这可用于创建和提取 tarfile 归档。(由 Berker Peksag 在 bpo-13477 中贡献。)
textwrap¶
TextWrapper
类有两个新的属性/构造函数参数:max_lines
,它限制了输出的行数;以及 placeholder
,如果输出因 max_lines 而被截断,该字符串将出现在输出的末尾。在此基础上,新增了一个便捷函数 shorten()
,它将输入中的所有空白折叠为单个空格,并生成一行给定 width 的文本,以 placeholder(默认为 [...]
)结尾。(由 Antoine Pitrou 和 Serhiy Storchaka 在 bpo-18585 和 bpo-18725 中贡献。)
threading¶
代表主线程的 Thread
对象可以通过新的 main_thread()
函数获取。在正常情况下,这将是 Python 解释器启动的线程。(由 Andrew Svetlov 在 bpo-18882 中贡献。)
traceback¶
新的 traceback.clear_frames()
函数接受一个回溯对象并清除其引用的所有帧中的局部变量,从而减少内存消耗。(由 Andrew Kuchling 在 bpo-1565525 中贡献。)
types¶
一个新的 DynamicClassAttribute()
描述符提供了一种定义属性的方法,该属性在通过实例对象查找时表现正常,但在通过类查找时则路由到 class 的 __getattr__
。这允许在类上激活属性,并具有与类上同名的虚拟属性(参见 enum
的一个示例)。(由 Ethan Furman 在 bpo-19030 中贡献。)
urllib¶
urllib.request
现在通过 DataHandler
类支持 data:
URL。(由 Mathias Panzenböck 在 bpo-16423 中贡献。)
Request
类将使用的 http 方法现在可以通过在其子类上设置 method
类属性来指定。(由 Jason R Coombs 在 bpo-18978 中贡献。)
Request
对象现在可重用:如果 full_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()
方法现在返回一个具名元组而不是普通元组。(由 Claudiu Popa 在 bpo-17487 中贡献。)
wave.open()
现在支持上下文管理协议。(由 Claudiu Popa 在 bpo-17616 中贡献。)
wave
现在可以 将输出写入不可查找的文件。(由 David Jones, Guilherme Polo, 和 Serhiy Storchaka 在 bpo-5202 中贡献。)
writeframesraw()
和 writeframes()
方法现在接受任何 bytes-like object。(由 Serhiy Storchaka 在 bpo-8311 中贡献。)
weakref¶
新的 WeakMethod
类模拟了对绑定方法的弱引用。(由 Antoine Pitrou 在 bpo-14631 中贡献。)
新的 finalize
类使得可以在对象被垃圾回收时注册一个回调函数,而无需仔细管理弱引用本身的生命周期。(由 Richard Oudkerk 在 bpo-15528 中贡献。)
与 ref
关联的回调(如果有)现在通过 __callback__
属性公开。(由 Mark Dickinson 在 bpo-17643 中贡献。)
xml.etree¶
一个新的解析器,XMLPullParser
,允许非阻塞应用程序解析 XML 文档。一个示例可以在 用于非阻塞解析的 Pull API 中看到。(由 Antoine Pitrou 在 bpo-17741 中贡献。)
xml.etree.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 —— 添加新的 API 以定制 Python 内存分配器
PEP 由 Victor Stinner 撰写和实现。
PEP 442: 安全对象终结化¶
PEP 442 移除了 CPython 中对象终结化的当前限制和怪癖。通过它,具有 __del__()
方法的对象以及具有 finally
子句的生成器,可以在它们作为引用循环的一部分时被终结。
作为此更改的一部分,在大多数情况下,模块全局变量在解释器关闭期间不再被强制设置为 None
,而是依赖于循环垃圾收集器的正常操作。这避免了自循环 GC 首次引入以来一直困扰 Python 的一整类解释器关闭时错误,这些错误通常涉及 __del__
方法。
参见
- PEP 442 —— 安全对象终结化
PEP 由 Antoine Pitrou 撰写和实现。
PEP 456: 安全可互换哈希算法¶
PEP 456 延续了之前对 Python 哈希算法进行的安全修复工作,旨在解决面向公众的 API(由字典查找支持)可能遭受的某些 DOS 攻击。(有关当前改进轮次的开始,请参阅 bpo-14621。)该 PEP 统一了 CPython 的哈希代码,使得打包者更容易替换不同的哈希算法,并在具有 64 位数据类型的平台上将 Python 的默认实现切换到 SipHash 实现。与旧的 FNV 算法相比,性能差异微不足道。
该 PEP 向 sys.hash_info
命名元组添加了额外的字段,以描述当前正在执行的二进制文件所使用的哈希算法。除此之外,该 PEP 不会更改任何现有的 CPython API。
PEP 436: Argument Clinic¶
“Argument Clinic” (PEP 436) 现在是 CPython 构建过程的一部分,可用于简化为 C 中实现的内置函数和标准库扩展模块定义和维护准确签名。
一些标准库扩展模块已转换为在 Python 3.4 中使用 Argument Clinic,并且 pydoc
和 inspect
已相应更新。
预计在 Python 3.4 维护版本中,将向在 C 中实现的其他可调用对象添加用于程序化自省的签名元数据。
备注
Argument Clinic PEP并未完全更新到实现的最新状态。在这种情况下,版本管理器和核心开发团队认为这是可以接受的,因为 Argument Clinic在 Python 3.4 中不会作为公共 API 提供给第三方使用。
参见
- PEP 436 —— Argument Clinic DSL
PEP 由 Larry Hastings 撰写和实现。
其他构建和 C API 更改¶
新的
PyType_GetSlot()
函数已添加到稳定 ABI 中,允许在使用受限 API 时从命名类型槽检索函数指针。(由 Martin von Löwis 在 bpo-17162 中贡献。)新的
Py_SetStandardStreamEncoding()
预初始化 API 允许嵌入 CPython 解释器的应用程序可靠地强制标准流使用特定的编码和错误处理程序。(由 Bastien Montagne 和 Nick Coghlan 在 bpo-16129 中贡献。)大多数不修改字符串参数的 Python C API 现在都被正确标记为接受
const char *
而不是char *
。(由 Serhiy Storchaka 在 bpo-1772673 中贡献。)新的 shell 版本的
python-config
即使在 python 解释器不可用时(例如,在交叉编译场景中)也可以使用。PyUnicode_FromFormat()
现在支持%s
,%A
,%U
,%V
,%S
, 和%R
的宽度和精度规范。(由 Ysj Ray 和 Victor Stinner 在 bpo-7330 中贡献。)新函数
PyStructSequence_InitType2()
补充了现有的PyStructSequence_InitType()
函数。区别在于,它成功时返回0
,失败时返回-1
。CPython 源代码现在可以使用最新版本 GCC 和 clang 的地址健全性检查功能进行编译:小型对象分配器中的误报已被消除。(由 Dhiru Kholia 在 bpo-18596 中贡献。)
Windows 构建现在使用 地址空间布局随机化 和 数据执行预防。(由 Christian Heimes 在 bpo-16632 中贡献。)
新函数
PyObject_LengthHint()
是operator.length_hint()
的 C API 等效项。(由 Armin Ronacher 在 bpo-16148 中贡献。)
其他改进¶
python 命令新增了一个 选项
-I
,使其在“隔离模式”下运行,这意味着sys.path
既不包含脚本目录也不包含用户的site-packages
目录,并且所有PYTHON*
环境变量都将被忽略(它暗示-s
和-E
)。未来可能还会施加其他限制,目标是将脚本的执行与用户环境隔离。例如,当 Python 用于运行系统脚本时,这是适当的。在大多数 POSIX 系统上,它可以在系统脚本的#!
行中使用并应该使用。(由 Christian Heimes 在 bpo-16499 中贡献。)在支持
readline
的系统上,交互式解释器中默认启用 Tab 补全。历史记录也默认启用,并写入(和读取)文件~/.python-history
。(由 Antoine Pitrou 和 Éric Araujo 在 bpo-5845 中贡献。)使用
--version
调用 Python 解释器现在将版本输出到标准输出而不是标准错误(bpo-18338)。argparse
(bpo-18920)和其他具有类似脚本调用能力的模块也进行了类似的更改(bpo-18922)。CPython Windows 安装程序现在在注册扩展时将
.py
添加到PATHEXT
变量中,允许用户在 Windows 命令提示符下仅通过键入脚本名称而无需.py
扩展名来运行 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 模块中硬编码这些值。从单个 OS 模块(
.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 中贡献。)
现在集合的哈希冲突成本降低了。每次哈希表探测都会在继续通过哈希表进行随机探测之前,检查一系列连续的相邻键/哈希对。这利用了缓存局部性,使冲突解决的成本更低。冲突解决方案可以描述为线性探测和开放寻址的混合体。附加线性探测的数量默认为九个。这可以在编译时通过将 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 和其他功能。在大多数(但非全部)情况下,当解释器在启用弃用警告的情况下运行(例如,通过使用 -Wd
)时,使用已弃用的 API 将产生 DeprecationWarning
。
Python API 中的弃用¶
如 PEP 451: 导入系统的 ModuleSpec 类型 所述,许多
importlib
方法和函数已弃用:importlib.find_loader()
已被importlib.util.find_spec()
替换;importlib.machinery.PathFinder.find_module()
已被importlib.machinery.PathFinder.find_spec()
替换;importlib.abc.MetaPathFinder.find_module()
已被importlib.abc.MetaPathFinder.find_spec()
替换;importlib.abc.PathEntryFinder.find_loader()
和find_module()
已被importlib.abc.PathEntryFinder.find_spec()
替换;所有xxxLoader
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
的所有参数都应通过关键字传递。
已弃用的功能¶
使用
-n
标志(无子进程)运行 IDLE — Python 编辑器和 shell 已弃用。但是,该功能在解决 bpo-18823 之前不会移除。如果存在,site 模块将“site-python”目录添加到 sys.path 的功能已弃用(bpo-19375)。
已移除¶
不再支持的操作系统¶
已从源代码和构建工具中移除对以下操作系统的支持
API 和功能移除¶
以下过时且先前已弃用的 API 和功能已被移除
未维护的
Misc/TextMate
和Misc/vim
目录已被移除(请参阅 开发指南 以获取替代建议)。SO
makefile 宏已移除(它已被SHLIB_SUFFIX
和EXT_SUFFIX
宏替换)(bpo-16754)。PyThreadState.tick_counter
字段已移除;自 Python 3.2 引入“新 GIL”以来,其值已无意义(bpo-19199)。importlib
中的PyLoader
和PyPycLoader
已被移除。(由 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__ 方法后开始失败的情况,这意味着如果您的代码正在使用'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)。
代码清理¶
迁移到 Python 3.4¶
本节列出了前面描述过的变更以及其他可能需要修改代码的 bug 修复。
“python”命令行为的更改¶
在 POSIX shell 中,将
PATH
环境变量设置为空值等同于完全不设置它。但是,将PYTHONPATH
设置为空值 不 等同于完全不设置它:将PYTHONPATH
设置为空值等同于将其设置为.
,这在类比PATH
的工作方式时会导致混淆。现在的行为符合 POSIX 关于PATH
的约定。CPython 解释器的调试 (
--with-pydebug
) 构建的 [X refs, Y blocks] 输出现在默认关闭。可以使用-X showrefcount
选项重新启用它。(由 Ezio Melotti 在 bpo-17323 中贡献。)python 命令和大多数标准库脚本(以及
argparse
)现在将--version
信息输出到stdout
而不是stderr
(有关问题列表,请参阅上面的 其他改进)。
Python API 的变化¶
importlib.abc
中定义的抽象基类 (ABC) 现在要么引发适当的异常,要么返回一个默认值,而不是盲目地引发NotImplementedError
。这只会影响调用super()
并一直回溯到 ABC 的代码。为了兼容性,请根据需要捕获NotImplementedError
或相应的异常。模块类型现在默认将
__package__
和__loader__
属性初始化为None
。要确定这些属性是否以向后兼容的方式设置,可以使用例如getattr(module, '__loader__', None) is not None
。(bpo-17115。)importlib.util.module_for_loader()
现在无条件地设置__loader__
和__package__
,以正确支持重新加载。如果不需要这种行为,则需要手动设置这些属性。你可以使用importlib.util.module_to_load()
进行模块管理。重新加载时,导入现在无条件地重置相关属性(例如
__name__
、__loader__
、__package__
、__file__
、__cached__
)。请注意,这恢复了 3.3 之前的行为,意味着重新加载时会重新找到模块(bpo-19413)。冻结包不再将
__path__
设置为包含包名称的列表,现在将其设置为空列表。之前的行为可能导致导入系统在子模块导入时出错,如果存在与冻结包同名的目录。判断模块是否为包的正确方法是使用hasattr(module, '__path__')
(bpo-18065)。冻结模块不再定义
__file__
属性。冻结模块设置该属性在语义上是不正确的,因为它们并非从任何明确位置加载。如果你必须知道模块是否来自冻结代码,则可以检查模块的__spec__.location
是否设置为'frozen'
,检查加载器是否为importlib.machinery.FrozenImporter
的子类,或者如果需要 Python 2 兼容性,可以使用imp.is_frozen()
。py_compile.compile()
现在会在写入的文件路径是符号链接或非正则文件时引发FileExistsError
。这是为了警告导入系统将用正则文件覆盖这些文件,无论它们最初是什么类型的文件路径。importlib.abc.SourceLoader.get_source()
不再在加载的源代码触发SyntaxError
或UnicodeDecodeError
时引发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
。base64.b32decode()
现在在输入字符串包含非 b32 字母表字符时引发binascii.Error
,而不是TypeError
。这个特定的TypeError
在其他TypeError
转换时被遗漏。(由 Serhiy Storchaka 在 bpo-18011 中贡献。)注意:此更改也无意中应用于 Python 3.3.3。当创建
cgi.FieldStorage
实例被垃圾回收时,file
属性现在会自动关闭。如果您将文件对象从cgi.FieldStorage
实例中单独取出,并且没有保持实例存活,那么您应该存储整个cgi.FieldStorage
实例,或者在cgi.FieldStorage
实例被垃圾回收之前读取文件内容。在关闭的 SSL 套接字上调用
read
或write
现在会引发一个信息性的ValueError
,而不是之前更为神秘的AttributeError
(bpo-9177)。slice.indices()
不再对巨大的值产生OverflowError
。由于此修复,如果给定负长度,slice.indices()
现在会引发ValueError
;以前它会返回无意义的值(bpo-14794)。complex
构造函数,与cmath
函数不同,之前错误地接受了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-like object 时,现在总是返回一个 bytes 对象。以前返回类型与输入类型匹配,因此如果您的代码依赖于返回值为,例如bytearray
,您将需要更改您的代码。audioop
函数现在如果传递字符串输入会立即引发错误,而不是随机地在稍后失败(bpo-16685)。HTMLParser
的新参数 convert_charrefs 目前默认为False
以实现向后兼容性,但最终将更改为默认为True
。建议您将此关键字(带适当的值)添加到代码中的任何HTMLParser
调用中(bpo-13633)。由于
hmac.new()
函数的 digestmod 参数将来不会有默认值,因此所有对hmac.new()
的调用都应更改为显式指定 digestmod(bpo-17276)。调用
sysconfig.get_config_var()
时使用SO
键,或在sysconfig.get_config_vars()
调用的结果中查找SO
已被弃用。此键应根据上下文替换为EXT_SUFFIX
或SHLIB_SUFFIX
(bpo-19555)。任何指定
U
的open
函数调用都应修改。U
在 Python3 中无效,如果使用最终会引发错误。根据函数,可以通过使用 newline 参数,或者必要时通过将流包装在TextIOWrapper
中以使用其 newline 参数来实现其旧 Python2 行为的等效效果(bpo-15204)。如果您在脚本中使用
pyvenv
并希望 不 安装 pip,则必须在命令调用中添加--without-pip
。当指定缩进时,
json.dump()
和json.dumps()
的默认行为已更改:它不再在行尾的项目分隔逗号后生成尾随空格。这只有在您有对这种输出进行空格敏感比较的测试时才会有影响(bpo-16333)。doctest
现在会在扩展模块的__doc__
字符串中查找 doctest,因此如果您的 doctest 测试发现包含看起来像 doctest 的扩展模块,那么在运行测试时,您可能会看到以前从未见过的测试失败(bpo-3158)。作为 Python 启动改进的一部分,
collections.abc
模块进行了轻微重构。因此,导入collections
不再自动导入collections.abc
。如果您的程序依赖于(未文档化的)隐式导入,则需要添加显式import collections.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
(线程状态)字段已移除,以修复一个 bug:请参阅 bpo-14432 了解原因。
在 3.4.3 中更改¶
PEP 476:为标准库 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)