Python 3.4 的新特性 — Python 文档
Python 3.4 中的新功能
- 作者
大卫·默里 < rdmurray@bitdance.com > (编辑)
本文解释了 Python 3.4 中与 3.3 相比的新特性。 Python 3.4 于 2014 年 3 月 16 日发布。 有关完整详细信息,请参阅 变更日志 。
摘要 – 发布亮点
新的语法特性:
- Python 3.4 中没有添加新的语法特性。
其他新功能:
- pip 应该始终可用 (PEP 453)。
- 新创建的文件描述符是不可继承的 (PEP 446)。
- 隔离模式 的命令行选项 (:issue:`16499`)。
- 处理非文本编码的编解码器 的改进(多个问题)。
- 导入系统的模块规格类型 (PEP 451)。 (影响进口商作者。)
- marshal 格式使 更加紧凑和高效 (:issue:`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)。
显着改进的库模块:
- [[#whatsnew-singledispatch|]] functools (PEP 443)中的单分派通用函数。
- 新的 pickle 协议 4(PEP 3154)。
- multiprocessing 现在有 一个选项可以避免在 Unix 上使用 os.fork (:issue:`8713`)。
- email 有一个新的子模块,contentmanager,和一个新的 Message 子类 (
EmailMessage
),它 简化了 MIME 处理 ( :问题:`18891`)。 - inspect 和 pydoc 模块现在能够正确自省更广泛的可调用对象,这改进了 Python help() 系统的输出。
- ipaddress 模块 API 已声明稳定
安全改进:
- 安全且可互换的哈希算法 (PEP 456)。
- 使新创建的文件描述符不可继承 (PEP 446) 以避免将文件描述符泄漏给子进程。
- 隔离模式 的新命令行选项,(:issue:`16499`)。
- multiprocessing 现在有 一个避免在 Unix 上使用 os.fork 的选项。 spawn 和 forkserver 更安全,因为它们避免与子进程共享数据。
- multiprocessing Windows 上的子进程不再继承父进程的所有可继承句柄,只继承必要的句柄。
- 新的 hashlib.pbkdf2_hmac() 函数提供了 PKCS#5 基于密码的密钥推导函数 2。
- TLSv1.1 和 TLSv1.2 支持 [X31X] 用于 ssl。
- 从 ssl 的 Windows 系统证书存储支持 中检索证书。
- 服务器端 SNI(服务器名称指示)支持 用于 ssl。
- ssl.SSLContext 类有 很多改进 。
- 标准库中支持 SSL 的所有模块现在都支持服务器证书验证,包括主机名匹配 (ssl.match_hostname()) 和 CRL(证书撤销列表,请参阅 ssl.SSLContext.load_verify_locations()[ X244X])。
CPython 实现改进:
- 安全对象终结 (PEP 442)。
- 利用 PEP 442,在大多数情况下, 模块全局变量在最终确定期间不再设置为无 (:issue:`18214`)。
- 可配置内存分配器 (PEP 445)。
- Argument Clinic(PEP 436)。
请继续阅读以获取面向用户的更改的完整列表,包括许多其他较小的改进、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
将安装在所有平台上(其中 XY 代表 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 本身(用户可以在安装过程中选择不安装它)。 Window 用户需要选择自动 PATH
修改,默认情况下可以从命令行使用 pip
,否则仍然可以通过 Windows 的 Python 启动器以 [ X218X]。
正如 PEP 中讨论的 ,平台打包者可以选择默认不安装这些命令,只要在调用时,它们提供有关如何在该平台上安装它们的清晰而简单的说明(通常使用系统包管理器)。
笔记
为了避免并行 Python 2 和 Python 3 安装之间的冲突,当直接调用 ensurepip
时,默认情况下仅引导版本化的 pip3
和 pip3.4
命令 - --default-pip
] 选项也需要请求未版本控制的 pip
命令。 pyvenv
和 Windows 安装程序确保不合格的 pip
命令在这些环境中可用,并且 pip
始终可以通过 -m
开关调用,而不是直接避免在具有多个 Python 安装的系统上产生歧义。
文档更改
作为此更改的一部分,文档的 安装 Python 模块 和 分发 Python 模块 部分已完全重新设计为简短的入门和常见问题解答文档。 大多数打包文档现在已移出到 Python Packaging Authority 维护的 Python Packaging User Guide 和各个项目的文档。
但是,由于此迁移目前仍未完成,因此这些指南的旧版本仍可用作 安装 Python 模块(旧版) 和 分发 Python 模块(旧版)。
也可以看看
- PEP 453 – 在 Python 安装中显式引导 pip
- PEP 由 Donald Stufft 和 Nick Coghlan 编写,由 Donald Stufft、Nick Coghlan、Martin von Löwis 和 Ned Deily 实施。
PEP 446:新创建的文件描述符是不可继承的
PEP 446 使新创建的文件描述符 不可继承 。 通常,这是应用程序想要的行为:在启动新进程时,在新进程中同时打开当前打开的文件可能会导致各种难以发现的错误,并可能导致安全问题。
但是,有时需要继承。 为了支持这些情况,提供了以下新函数和方法:
编解码器处理的改进
自首次引入以来,codecs 模块一直旨在作为类型中立的动态编码和解码系统运行。 然而,它与 Python 文本模型的紧密耦合,尤其是内置 str、bytes 和 bytearray 类型上的类型限制便利方法,在历史上掩盖了这一事实.
作为澄清情况的关键步骤,codecs.encode() 和 codecs.decode() 便利函数现在在 Python 2.7、3.3 和 3.4 中正确记录。 这些函数自 Python 2.4 起就存在于 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'
标准库中提供的二进制和文本转换在 Binary Transforms 和 Text Transforms 中有详细说明。
(由 Nick Coghlan 在 :issue:`7475`、:issue:`17827`、:issue:`17828` 和 :issue 中贡献:`19619`。)
PEP 451:导入系统的 ModuleSpec 类型
PEP 451 提供了有关导入机器将用于加载它的模块的信息的封装(即,模块规范)。 这有助于简化导入实现和几个与导入相关的 API。 这一变化也是未来几项与进口相关的改进的垫脚石。
PEP 面向公众的更改是完全向后兼容的。 此外,它们应该对除了进口商作者之外的所有人都是透明的。 Key finder 和 loader 方法已被弃用,但它们将继续工作。 新进口商应使用 PEP 中描述的新方法。 应更新现有进口商以实施新方法。 请参阅 Deprecated 部分以获取应替换的方法及其替换的列表。
其他语言更改
对核心 Python 语言进行的一些较小更改是:
- Unicode 数据库更新至 UCD 6.3 版。
- min() 和 max() 现在接受 default 仅关键字参数,如果它们正在评估的迭代具有,可用于指定它们返回的值没有元素。 (由 Julian Berman 在 :issue:`18111` 中贡献。)
- 模块对象现在是 weakref'able。
- 默认情况下,模块
__file__
属性(和相关值)现在应始终包含绝对路径,唯一的例外是__main__.__file__
,当使用相对路径直接执行脚本时。 (由 Brett Cannon 在 :issue:`18416` 中贡献。) - 所有 UTF-* 编解码器(UTF-7 除外)现在在编码和解码期间都拒绝代理,除非使用
surrogatepass
错误处理程序,但 UTF-16 解码器(接受有效代理对)和UTF-16 编码器(在编码非 BMP 字符时生成它们)。 (由 Victor Stinner、Kang-Hao (Kenny) Lu 和 Serhiy Storchaka 在 :issue:`12892` 中提供。) - 全新德国 EBCDIC codec
cp273
。 (由 Michael Bierenfeld 和 Andrew Kuchling 在 :issue:`1097797` 中提供。) - 新乌克兰语 编解码器
cp1125
。 (由 Serhiy Storchaka 在 :issue:`19668` 中提供。) - bytes.join() 和 bytearray.join() 现在接受任意缓冲区对象作为参数。 (由 Antoine Pitrou 在 中提供:issue:`15958`。)
- int 构造函数现在接受任何具有
__index__
方法作为其 base 参数的对象。 (由 Mark Dickinson 在 :issue:`16772` 中贡献。) - 框架对象现在有一个 clear() 方法,可以清除框架中对局部变量的所有引用。 (由 Antoine Pitrou 在 :issue:`17934` 中贡献。)
- memoryview 现在注册为 Sequence,并支持 reversed() 内置。 (由 Nick Coghlan 和 Cludiu Popa 在 :issue:`18690` 和 :issue:`19078` 中贡献。)
- 由于引入了 Argument Clinic 以及对 inspect 和 pydoc 模块的其他更改,help() 报告的签名已在一些情况下进行了修改和改进.
- __length_hint__() 现在是正式语言规范的一部分(参见 PEP 424)。 (由 Armin Ronacher 在 中提供:issue:`16148`。)
新模块
异步
新的 asyncio 模块(在 PEP 3156 中定义)为 Python 提供了一个标准的可插拔事件循环模型,在标准库中提供了可靠的异步 IO 支持,并使其他事件循环实现更容易与标准库以及彼此进行互操作。
对于 Python 3.4,此模块被视为 临时 API 。
确保pip
新的 ensurepip 模块是 PEP 453 实现的主要基础设施。 在正常的事件过程中,最终用户不需要与此模块交互,但如果拒绝自动引导到安装或虚拟环境,它可以用于手动引导 pip
。
ensurepip 包含 pip
的捆绑副本,截至其随附的 CPython 发行版的第一个候选发行版是最新的(这适用于维护版本和功能版本) . ensurepip
不上网。 如果安装可以访问 Internet,则在运行 ensurepip
后,可以使用捆绑的 pip
将 pip
升级到比捆绑版本更新的版本。 (注意pip
这样的升级版被认为是单独安装的包,如果卸载Python不会被删除。)
该模块被命名为 ensurepip,因为如果在已经安装 pip
时调用,它什么都不做。 它还有一个 --upgrade
选项,如果 pip
的现有安装版本比捆绑副本旧,它将导致它安装 pip
的捆绑副本。
枚举
新的 enum 模块(在 PEP 435 中定义)提供了枚举类型的标准实现,允许其他模块(例如 socket)通过用向后兼容的枚举值替换不透明的整数常量来提供更多信息性错误消息和更好的调试支持。
也可以看看
- PEP 435 – 向 Python 标准库添加 Enum 类型
- PEP 由 Barry Warsaw、Eli Bendersky 和 Ethan Furman 编写,由 Ethan Furman 实施。
路径库
新的 pathlib 模块提供了表示文件系统路径的类,其语义适用于不同的操作系统。 路径类分为 纯路径 和 具体路径 ,它们提供没有 I/O 的纯计算操作,和 具体路径 ,它们继承自纯路径但也提供 I/O 操作。
对于 Python 3.4,此模块被视为 临时 API 。
tracemalloc
新的 tracemalloc 模块(在 PEP 454 中定义)是一个调试工具,用于跟踪 Python 分配的内存块。 它提供以下信息:
- 跟踪分配对象的位置
- 每个文件名和每个行号分配的内存块的统计信息:分配的内存块的总大小、数量和平均大小
- 计算两个快照之间的差异以检测内存泄漏
改进的模块
美国广播公司
新函数 abc.get_cache_token() 可用于了解何时使受对象图更改影响的缓存无效。 (由 Łukasz Langa 在 :issue:`16832` 中提供。)
新类 ABC 将 ABCMeta 作为其元类。 使用 ABC
作为基类与指定 metaclass=abc.ABCMeta
的效果基本相同,但更易于键入和阅读。 (由 Bruno Dupuis 在 中提供:issue:`16049`。)
国际金融中心
getparams() 方法现在返回命名元组而不是普通元组。 (由克劳迪乌·波帕在 中提供:issue:`17818`。)
aifc.open() 现在支持上下文管理协议:在 with 块中使用时,将自动调用返回对象的 close() 方法在块的末尾。 (由 Serhiy Storchacha 在 中提供:issue:`16486`。)
writeframesraw() 和 writeframes() 方法现在接受任何类似 字节的对象 。 (由 Serhiy Storchaka 在 中提供:issue:`8311`。)
音频操作
audioop 现在支持 24 位采样。 (由 Serhiy Storchaka 在 中提供:issue:`12866`。)
新的 byteswap() 函数将大端样本转换为小端样本,反之亦然。 (由 Serhiy Storchaka 在 :issue:`19641` 中提供。)
所有 audioop 函数现在都接受任何 bytes-like object。 不接受字符串:它们以前不起作用,现在它们立即引发错误。 (由 Serhiy Storchaka 在 :issue:`16685` 中提供。)
base64
base64 中的编码和解码函数现在接受任何 bytes-like object,以防它以前需要 bytes 或 bytearray 实例。 (由 Nick Coghlan 在 :issue:`17839` 中提供。)
新函数 a85encode()、a85decode()、b85encode() 和 b85decode() 提供编码和解码二进制的能力数据分别来自 Ascii85
和 git/mercurial Base85
格式。 a85
函数具有可用于使它们与 Ascii85
编码的变体(包括 Adobe 变体)兼容的选项。 (由 Martin Morrison、Mercurial 项目、Serhiy Storchaka 和 Antoine Pitrou 在 :issue:`17618` 中提供。)
收藏
ChainMap.new_child() 方法现在接受一个 m 参数,指定要添加到链中的子映射。 这允许将现有映射和/或自定义映射类型用于子项。 (由 Vinay Sajip 在 中提供:issue:`16613`。)
颜色系统
RGB — YIQ 转换系数中的位数已扩展,以便它们与 FCC NTSC 版本相匹配。 结果的变化应小于 1%,并且可能更好地匹配其他地方的结果。 (由 Brian Landers 和 Serhiy Storchaka 在 :issue:`14323` 中提供。)
上下文库
新的 contextlib.suppress 上下文管理器有助于阐明故意抑制单个语句中的异常的代码的意图。 (由 Raymond Hettinger 在 :issue:`15806` 和 Zero Piraeus 在 :issue:`19266` 中贡献。)
新的 contextlib.redirect_stdout() 上下文管理器使实用程序脚本更容易处理不灵活的 API,这些 API 将其输出写入 sys.stdout 并且不提供任何重定向选项。 使用上下文管理器,sys.stdout 输出可以重定向到任何其他流,或者与 io.StringIO 一起重定向到一个字符串。 后者尤其有用,例如,捕获为实现命令行接口而编写的函数的输出。 建议仅用于实用程序脚本,因为它会影响 sys.stdout 的全局状态。 (由 Raymond Hettinger 在 中提供:issue:`15805`。)
contextlib 文档也已更新,包括关于一次性使用、可重用和可重入上下文管理器之间差异的 讨论 。
数据库
dbm.open() 对象现在支持上下文管理协议。 在 with 语句中使用时,会在块的末尾自动调用数据库对象的 close
方法。 (由 Claudiu Popa 和 Nick Coghlan 在 :issue:`19282` 中提供。)
迪斯
函数 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_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 在 :issue:`11816` 和 Claudiu Popa 在 :issue:`17916` 中贡献。)
新函数 stack_effect() 计算给定操作码和参数对 Python 堆栈的影响,这些信息在其他情况下不可用。 (由 Larry Hastings 在 :issue:`19722` 中提供。)
文档测试
新的 选项标志 ,FAIL_FAST,在检测到第一个故障后立即停止测试运行。 (由 R. 中的 David Murray 和 Daniel Urban:issue:`16522`。)
doctest 命令行界面现在使用 argparse,并有两个新选项,-o
和 -f
。 -o
允许在命令行上指定 doctest 选项,而 -f
是 -o FAIL_FAST
的简写(与 [ X171X]unittest CLI)。 (由 R. 中的 David Murray:问题:`11390`。)
doctest 现在将在扩展模块 __doc__
字符串中找到 doctest。 (由 Zachary Ware 在 中提供:issue:`3158`。)
电子邮件
as_string() 现在接受 policy 参数以在生成消息的字符串表示时覆盖消息的默认策略。 这意味着 as_string
现在可以在更多情况下使用,而不必创建和使用 生成器 以将格式参数传递给其 flatten
方法。 (由 R. 中的 David Murray:问题:`18600`。)
添加了新方法 as_bytes() 以生成消息的字节表示,其方式类似于 as_string
生成字符串表示的方式。 它不接受 maxheaderlen 参数,但接受 unixfrom 和 policy 参数。 Message __bytes__() 方法调用它,这意味着 bytes(mymsg)
现在将产生直观的结果:一个包含完全格式化消息的字节对象。 (由 R. 中的 David Murray:问题:`18600`。)
Message.set_param() 消息现在接受 replace 关键字参数。 指定后,将更新关联的标头而不更改其在标头列表中的位置。 为了向后兼容,默认值为 False
。 (由 R. 中的 David Murray:问题:`18891`。)
添加了一对新的 Message 子类(EmailMessage 和 MIMEPart),以及一个新的子模块 contentmanager 和新的 policy 属性 content_manager。 所有文档目前都在新模块中,该模块正在作为电子邮件的新 临时 API 的一部分添加。 这些类提供了许多新方法,使从电子邮件消息中提取内容和将内容插入到电子邮件消息中变得更加容易。 有关详细信息,请参阅 contentmanager 文档和 电子邮件:Examples。 这些 API 添加完成了计划作为 email6 项目一部分的大部分工作。 当前的临时 API 计划在 Python 3.5 中成为最终版本(可能在错误处理领域有一些小的添加)。 (由 R. 中的 David Murray:问题:`18891`。)
文件
新的 clear_cache() 函数提供了清除 filecmp 比较缓存的能力,它使用 os.stat() 信息来确定文件是否已更改最后比较。 例如,如果文件可能已在比特定文件系统的文件修改时间字段的分辨率更短的时间内更改和重新检查,则可以使用此方法。 (由 Mark Levitt 在 :issue:`18149` 中提供。)
新模块属性 DEFAULT_IGNORES 提供用作 dircmp() 函数的 ignore 参数默认值的目录列表。 (由 Eli Bendersky 在 :issue:`15442` 中贡献。)
功能工具
新的 partialmethod() 描述符为描述符带来了部分参数应用,就像 partial() 为普通可调用对象提供的一样。 当包含在类定义中时,新的描述符还可以更容易地获得任意可调用对象(包括 partial() 实例),使其表现得像普通实例方法。 (由 Alon Horev 和 Nick Coghlan 在 :issue:`4331` 中贡献。)
新的 singledispatch() 装饰器为 Python 标准库带来了对单分派通用函数的支持。 面向对象编程侧重于将一组公共数据上的多个操作分组到一个类中,而通用函数侧重于将一个操作的多个实现分组,使其能够处理 不同 种数据。
total_ordering() 现在支持来自底层比较函数的返回值 NotImplemented。 (由 Katie Miller 在 :issue:`10042` 中提供。)
partial() 函数的纯 python 版本现在在 stdlib 中; 在 CPython 中,它被 C 加速版本覆盖,但它可供其他实现使用。 (由 Brian Thorne 在 :issue:`12428` 中贡献。)
球体
新函数 escape() 提供了一种对文件名中的特殊字符进行转义的方法,这样它们就不会成为通配扩展的一部分,而是逐字匹配。 (由 Serhiy Storchaka 在 中提供:issue:`8402`。)
哈希库
新的 hashlib.pbkdf2_hmac() 函数提供了 PKCS#5 基于密码的密钥推导函数 2。 (由 Christian Heimes 在 中提供:issue:`18582`。)
hashlib 哈希对象的 name 属性现在是正式支持的接口。 它一直存在于 CPython 的 hashlib 中(虽然它没有为所有支持的哈希返回小写名称),但它不是一个公共接口,所以其他一些 Python 实现以前不支持它。 (由杰森 R 供稿) 中的库姆斯:问题:`18532`。)
海马
hmac 现在接受 bytearray
以及 bytes
用于 new() 函数的 key 参数,以及 [ new() 函数和 update() 方法的 X127X]msg 参数现在接受 hashlib 模块支持的任何类型。 (由 Jonas Borgström 在 :issue:`18240` 中贡献。)
hmac.new() 函数的 digestmod 参数现在可以是 hashlib 识别的任何哈希摘要名称。 此外,不推荐使用 digestmod 的值默认为 MD5
的当前行为:在 Python 的未来版本中将没有默认值。 (由 Christian Heimes 在 中提供:issue:`17276`。)
通过添加 block_size 和 name 属性(以及 digest_size 属性的正式文档),hmac 模块现在完全符合PEP 247 API。 (由 Christian Heimes 在 中提供:issue:`18775`。)
html
新函数 unescape() 函数将 HTML5 字符引用转换为相应的 Unicode 字符。 (由 Ezio Melotti 在 中提供:issue:`2927`。)
HTMLParser 接受一个新的关键字参数 convert_charrefs,当 True
时,自动转换所有字符引用。 为了向后兼容,它的值默认为 False
,但在 Python 的未来版本中它将更改为 True
,因此请您明确设置它并更新您的代码以使用这个新的特征。 (由 Ezio Melotti 在 :issue:`13633` 中贡献。)
HTMLParser 的 strict 参数现已弃用。 (由 Ezio Melotti 在 中提供:issue:`15114`。)
http
send_error() 现在接受一个可选的附加 explain 参数,该参数可用于提供扩展的错误描述,如果有的话覆盖硬编码的默认值。 此扩展错误描述将使用 error_message_format
属性进行格式化,并作为错误响应的正文发送。 (由 Karl Cow 在 中贡献:问题:`12921`。)
http.server 命令行界面 现在有一个 -b/--bind
选项,可以让服务器监听特定地址。 (由 Malte Swart 在 中贡献:问题:`17764`。)
空闲库和空闲
由于 idlelib 实现了 IDLE shell 和编辑器,并且不打算由其他程序导入,因此每个版本都会对其进行改进。 请参阅 Lib/idlelib/NEWS.txt
以获取自 3.3.0 以来的累积更改列表,以及在未来 3.4.x 版本中所做的更改。 该文件也可从 IDLE 对话框中获得。
导入库
InspectLoader ABC 定义了一个新方法,source_to_code(),它接受源数据和路径并返回一个代码对象。 默认实现等价于 compile(data, path, 'exec', dont_inherit=True)
。 (由 Eric Snow 和 Brett Cannon 在 :issue:`15627` 中提供。)
InspectLoader 现在也有 get_code() 方法的默认实现。 但是,出于性能原因,通常需要覆盖默认实现。 (由 Brett Cannon 在 :issue:`18072` 中贡献。)
reload() 函数已从 imp 移至 importlib,作为 imp 模块弃用的一部分。 (由 Berker Peksag 在 中提供:issue:`18193`。)
importlib.util 现在有一个 MAGIC_NUMBER 属性,提供对字节码版本号的访问。 这取代了已弃用的 imp 模块中的 get_magic() 函数。 (由 Brett Cannon 在 中提供:issue:`18192`。)
新的 importlib.util 函数 cache_from_source() 和 source_from_cache() 替换了已弃用的 imp 模块中的同名函数。 (由 Brett Cannon 在 中提供:issue:`18194`。)
importlib 引导程序 NamespaceLoader
现在符合 InspectLoader ABC,这意味着 runpy
和 python -m
现在可以与命名空间一起使用包。 (由 Brett Cannon 在 :issue:`18058` 中贡献。)
importlib.util 有一个新函数 decode_source() 使用通用换行处理从字节解码源。 这对于实现 InspectLoader.get_source()
方法很有用。
importlib.machinery.ExtensionFileLoader 现在有一个 get_filename() 方法。 这在最初的实现中被无意中省略了。 (由 Eric Snow 在 中贡献:issue:`19152`。)
检查
inspect 模块现在提供了一个基本的 命令行界面 ,可以快速显示模块、类和函数的源代码和其他信息。 (由 Claudiu Popa 和 Nick Coghlan 在 :issue:`18626` 中提供。)
unwrap() 可以轻松解开由 functools.wraps() 创建的包装函数链(以及在包装函数上设置 __wrapped__
属性的任何其他 API) . (由 Daniel Urban、Aaron Iles 和 Nick Coghlan 在 :issue:`13266` 中提供。)
作为新的 enum 模块实现的一部分,inspect 模块现在对自定义 __dir__
方法和通过元类提供的动态类属性有了更好的支持。 (由 Ethan Furman 在 :issue:`18929` 和 :issue:`19030` 中贡献。)
getfullargspec() 和 getargspec() 现在使用 signature() API。 这使它们能够支持更广泛的可调用对象,包括具有 __signature__
属性的可调用对象、具有参数诊所提供的元数据的可调用对象、functools.partial() 对象等等。 请注意,与 signature() 不同,这些函数仍然忽略 __wrapped__
属性,并报告绑定方法的已绑定第一个参数,因此仍然需要更新您的代码以使用 ]signature() 如果需要这些功能。 (由 Yury Selivanov 在 :issue:`17481` 中贡献。)
signature() 现在支持 Duck 类型的 CPython 函数,增加了对使用 Cython 编译的函数的支持。 (由 Stefan Behnel 和 Yury Selivanov 在 :issue:`17159` 中贡献。)
IP地址
ipaddress 作为 临时 API 添加到 Python 3.3 的标准库中。 随着 Python 3.4 的发布,此限定已被删除:ipaddress 现在被认为是一个稳定的 API,被正常的标准库要求覆盖以保持向后兼容性。
如果地址可全局路由,则新的 is_global 属性为 True
。 (由 Peter Moody 在 :issue:`17400` 中提供。)
日志记录
TimedRotatingFileHandler 有一个新的 atTime 参数,可用于指定发生翻转的时间。 (由 Ronald Oussoren 在 中提供:issue:`9556`。)
SocketHandler 和 DatagramHandler 现在支持 Unix 域套接字(通过将 port 设置为 None
)。 (由 Vinay Sajip 在提交 ce46195b56a9 中提供。)
fileConfig() 现在接受 fname 参数的 configparser.RawConfigParser 子类实例。 当日志配置只是整个应用程序配置的一部分时,或者应用程序在将配置传递给 fileConfig() 之前修改配置时,这有助于使用配置文件。 (由 Vinay Sajip 在 中提供:issue:`16110`。)
通过 logging.config.listen() 函数从套接字接收的日志配置数据现在可以在处理之前通过提供验证函数作为新的 verify 关键字参数的参数进行验证. (由 Vinay Sajip 在 :issue:`15452` 中提供。)
元帅
默认的 marshal 版本已提升到 3。 实现新版本的代码恢复了 Python2 仅记录一份实习字符串副本并保留反序列化实习的行为,并将这种“一份副本”的能力扩展到任何对象类型(包括处理递归引用)。 这减少了 .pyc
文件的大小和模块在从 .pyc
(或 .pyo
)文件加载时在内存中占用的内存量。 (由 Kristján Valur Jónsson 在 :issue:`16475` 中贡献,Antoine Pitrou 在 :issue:`19219` 中提供了额外的加速。)
多处理
在 Unix 上,添加了两个新的 启动方法 ,spawn
和 forkserver
,用于使用 multiprocessing 启动进程。 这些使得进程与线程的混合更加健壮,并且 spawn
方法与多处理一直在 Windows 上使用的语义相匹配。 新函数 get_all_start_methods() 报告平台上所有可用的启动方法,get_start_method() 报告当前的启动方法,set_start_method() 设置启动方法。 (由 Richard Oudkerk 在 :issue:`8713` 中提供。)
multiprocessing 现在也有 context
的概念,它决定了如何创建子进程。 新函数 get_context() 返回使用指定启动方法的上下文。 它具有与 multiprocessing 模块本身相同的 API,因此您可以使用它来创建 池 和将在该上下文中运行的其他对象。 这允许框架和应用程序或同一应用程序的不同部分使用多处理而不会相互干扰。 (由 Richard Oudkerk 在 :issue:`18999` 中提供。)
除了使用旧的 fork 启动方法时,子进程不再从其父进程继承不需要的句柄/文件描述符(:issue:`8713` 的一部分)。
multiprocessing 现在依赖 runpy(实现 -m
开关)在使用 spawn
时在子进程中适当地初始化 __main__
或 forkserver
启动方法。 这解决了一些边缘情况,其中组合多处理、-m
命令行开关和显式相对导入可能会导致子进程中的模糊故障。 (由 Nick Coghlan 在 :issue:`19946` 中提供。)
操作员
新函数 length_hint() 提供了关于如何使用 __length_hint__() 特殊方法的规范的实现,作为 PEP 424 的一部分 该语言特性的正式规范。 (由 Armin Ronacher 在 中提供:issue:`16148`。)
现在有一个纯 Python 版本的 operator 模块可供参考和供 Python 的替代实现使用。 (由 Zachary Ware 在 中提供:issue:`16694`。)
操作系统
有一些新函数可以获取和设置文件描述符的 可继承标志 (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 在 :issue:`17914` 中提供。)
os.path.samestat() 现在可在 Windows 平台上使用(并且 os.path.samefile() 实现现在在 Unix 和 Windows 之间共享)。 (由 Brian Curtin 在 中贡献:问题:`11939`。)
os.path.ismount() 现在可以识别安装在 Windows 驱动器根目录下的卷。 (由 Tim Golden 在 :issue:`9035` 中贡献。)
os.open() 在提供它们的平台上支持两个新标志,O_PATH(未打开的文件描述符)和 O_TMPFILE(未命名的临时文件;如3.4.0 版本仅适用于内核版本为 3.11 或更高版本且具有 uapi 标头的 Linux 系统)。 (分别由 Christian Heimes 在 :issue:`18673` 和 Benjamin Peterson 中贡献。)
数据库
pdb 已得到增强,以更有用的方式处理生成器、yield 和 yield from
。 这在调试基于 asyncio 的程序时特别有用。 (由 Andrew Svetlov 和 Xavier de Gaye 在 :issue:`16596` 中提供。)
print
命令已从 pdb 中删除,恢复从 pdb 命令行访问 Python print() 函数。 Python2的pdb
没有print
命令; 相反,输入 print
执行 print
语句。 在 Python3 中 print
被错误地设为 pdb :pdbcmd:`p` 命令的别名。 然而,p
打印其参数的 repr
,而不是像 Python2 print
命令那样打印 str
。 更糟糕的是,Python3 pdb print
命令隐藏了 Python3 print
函数,使其无法在 pdb
提示符下访问。 (由 Connor Osborn 在 :issue:`18764` 中提供。)
泡菜
pickle 现在支持(但默认情况下不使用)一个新的 pickle 协议,协议 4。 这个新协议解决了之前协议中存在的许多问题,例如嵌套类的序列化、非常大的字符串和容器,以及其 __new__()
方法采用仅关键字参数的类。 它还提供了一些效率改进。
库
plistlib 现在有一个类似于 stdlib 序列化协议的标准模式的 API,有新的 load(), dump(), loads( ) 和 dumps() 函数。 (旧 API 现在已弃用。)除了已经支持的 XML plist 格式(FMT_XML),它现在还支持二进制 plist 格式(FMT_BINARY)。 (由 Ronald Oussoren 和其他人在 :issue:`14455` 中提供。)
流行库
poplib 中添加了两个新方法:capa(),它返回 POP 服务器通告的功能列表,以及 stls(),它切换如果 POP 服务器支持,则将明文 POP3 会话转换为加密的 POP3 会话。 (由 Lorenzo Catucci 在 中提供:issue:`4473`。)
打印
pprint 模块的 PrettyPrinter 类及其 pformat() 和 pprint() 函数有一个新选项,compact[ X148X],控制输出的格式。 当前将 compact 设置为 True
意味着将在每个(缩进)行上打印与 width 匹配的尽可能多的序列元素。 (由 Serhiy Storchaka 在 中提供:issue:`19132`。)
长字符串现在使用 Python 的正常行继续语法进行包装。 (由 Antoine Pitrou 在 中提供:issue:`17150`。)
pydoc
pydoc 模块现在直接基于 inspect.signature() 内省 API,允许它为更广泛的可调用对象提供签名信息。 此更改还意味着现在在显示帮助信息时会考虑 __wrapped__
属性。 (由 Larry Hastings 在 :issue:`19674` 中提供。)
pydoc 模块不再显示已绑定方法的 self
参数。 相反,它旨在始终显示提供的可调用对象的确切当前签名。 (由 Larry Hastings 在 :issue:`20710` 中提供。)
除了直接对 pydoc 进行更改外,其对自定义 __dir__
方法和各种描述符行为的处理也通过 inspect[ X231X] 模块。
由于 help() 内置函数是基于 pydoc,因此上述更改也会影响 help() 的行为。
关于
新的 fullmatch() 函数和 regex.fullmatch()
方法锚定字符串两端的模式以进行匹配。 这提供了一种明确匹配目标的方法,从而避免了一类微妙的错误,其中 $
字符在代码更改或添加现有正则表达式的替代项期间丢失。 (由 Matthew Barnett 在 :issue:`16203` 中提供。)
regex objects 的 repr 现在包括模式和标志; match objects 的 repr 现在包括匹配的字符串的开始、结束和部分。 (由 Hugo Lopes Tavares 和 Serhiy Storchaka 在 :issue:`13592` 和 :issue:`17087` 中贡献。)
资源
新的 prlimit() 函数可在内核版本为 2.6.36 或更高版本以及 glibc 为 2.13 或更高版本的 Linux 平台上使用,提供查询或设置进程的资源限制的能力,而不是制作进程电话。 (由 Christian Heimes 在 中提供:issue:`16595`。)
在 Linux 内核版本 2.6.36 或更高版本上,还有一些新的 Linux 特定常量:RLIMIT_MSGQUEUE、RLIMIT_NICE、RLIMIT_RTPRIO、[X163TIMEX][X163TIMEX] , 和 RLIMIT_SIGPENDING。 (由 Christian Heimes 在 中提供:issue:`19324`。)
在 FreeBSD 版本 9 及更高版本上,有一些新的 FreeBSD 特定常量:RLIMIT_SBSIZE、RLIMIT_SWAP 和 RLIMIT_NPTS。 (由克劳迪乌·波帕在 中提供:issue:`19343`。)
选择
epoll 对象现在支持上下文管理协议。 当在 with 语句中使用时,close() 方法将在块的末尾自动调用。 (由 Serhiy Storchaka 在 中提供:issue:`16488`。)
devpoll 对象现在具有 fileno() 和 close() 方法,以及一个新属性 closed。 (由 Victor Stinner 在 中提供:问题:`18794`。)
休蒂尔
copyfile() 现在引发一个特定的 Error 子类 SameFileError,当源和目标是同一个文件时,它允许应用程序对此采取适当的行动具体错误。 (由 Atsuo Ishimoto 和 Hynek Schlawack 在 中提供:issue:`1492704`。)
smtpd
SMTPServer 和 SMTPChannel 类现在接受 map 关键字参数,如果指定,则传递给 asynchat.async_chat 作为其 [ X173X]map 参数。 这允许应用程序避免影响全局套接字映射。 (由 Vinay Sajip 在 中提供:issue:`11959`。)
smtplib
SMTPException 现在是 OSError 的子类,它允许在一个 try/except 语句中捕获套接字级别错误和 SMTP 协议级别错误,代码只关心是否有错误发生了。 (由 Ned Jackson Lovely 在 中提供:issue:`2118`。)
插座
套接字模块现在在支持它的平台上支持 [X35X]CAN_BCM 协议。 (由 Brian Thorne 在 :issue:`15359` 中贡献。)
套接字对象具有获取或设置其 可继承标志 、get_inheritable() 和 set_inheritable() 的新方法。
socket.AF_*
和 socket.SOCK_*
常量现在是使用新的 enum 模块的枚举值。 这允许在调试期间打印有意义的名称,而不是整数“幻数”。
AF_LINK 常量现在在 BSD 和 OSX 上可用。
inet_pton() 和 inet_ntop() 现在支持 Windows。 (由 Atsuo Ishimoto 在 中提供:issue:`7171`。)
ssl
已添加 PROTOCOL_TLSv1_1 和 PROTOCOL_TLSv1_2(支持 TLSv1.1 和 TLSv1.2); 仅当 Python 与 OpenSSL 1.0.1 或更高版本链接时,才支持这些协议。 (由 Michele Orrù 和 Antoine Pitrou 在 :issue:`16692` 中贡献。)
新函数 create_default_context() 提供了一种标准方法来获取 SSLContext,其设置旨在实现兼容性和安全性之间的合理平衡。 这些设置比 SSLContext 构造函数提供的默认值更严格,如果最佳实践安全要求发生变化,将来可能会进行调整,无需事先弃用。 使用支持 SSL 的 stdlib 库的新推荐最佳实践是使用 create_default_context() 获取 SSLContext 对象,根据需要对其进行修改,然后将其作为 传递相应 stdlib API 的 context 参数。 (由 Christian Heimes 在 中提供:issue:`19689`。)
SSLContext 方法 load_verify_locations() 接受一个新的可选参数 cadata,可用于分别通过字符串或字节直接提供 PEM 或 DER 编码的证书。 (由 Christian Heimes 在 中提供:issue:`18138`。)
新函数 get_default_verify_paths() 返回路径和环境变量的命名元组,set_default_verify_paths() 方法用于设置 OpenSSL 的默认值 cafile
和 [X] ]。 这可以帮助调试默认验证问题。 (由 Christian Heimes 在 中提供:issue:`18143`。)
SSLContext 有一个新方法,cert_store_stats(),它报告加载的 X.509
证书、X.509 CA
证书和证书吊销列表([ X169X]s),以及返回加载的 CA
证书列表的 get_ca_certs() 方法。 (由 Christian Heimes 在 中提供:issue:`18147`。)
如果 OpenSSL 0.9.8 或更高版本可用,SSLContext 有一个新属性 verify_flags,可用于通过将其设置为新常量 的某种组合来控制证书验证过程]VERIFY_DEFAULT、VERIFY_CRL_CHECK_LEAF、VERIFY_CRL_CHECK_CHAIN或VERIFY_X509_STRICT].X337X OpenSSL 默认不做任何 CRL 验证。 (由 Christien Heimes 在 中提供:issue:`8813`。)
新的 SSLContext 方法 load_default_certs() 从默认位置加载一组默认的“证书颁发机构”(CA)证书,这些证书因平台而异。 它可用于加载客户端用于验证服务器的 TLS Web 服务器身份验证证书 (purpose=
SERVER_AUTH) 和用于验证客户端证书的服务器证书([ X214X]CLIENT_AUTH)。 (由 Christian Heimes 在 中提供:issue:`19292`。)
两个新的仅限 Windows 的函数 enum_certificates() 和 enum_crls() 提供了从 Windows 证书存储中检索证书、证书信息和 CRL 的能力。 (由 Christian Heimes 在 中提供:issue:`17134`。)
使用新的 ssl.SSLContext.set_servername_callback() 方法支持服务器端 SNI(服务器名称指示)。 (由 Daniel Black 在 :issue:`8109` 中提供。)
SSLSocket.getpeercert() 返回的字典包含额外的 X509v3
扩展项:crlDistributionPoints
、calIssuers
和 OCSP
URI。 (由 Christian Heimes 在 中提供:issue:`18379`。)
状态
stat 模块现在由 _stat
中的 C 实现支持。 需要 AC 实现,因为大多数值都没有标准化并且依赖于平台。 (由 Christian Heimes 在 中提供:issue:`11016`。)
该模块支持新的 ST_MODE 标志、S_IFDOOR、S_IFPORT 和 S_IFWHT。 (由 Christian Hiemes 在 中提供:issue:`11016`。)
结构
新函数 iter_unpack 和新的 struct.Struct.iter_unpack() 编译格式的方法提供包含给定数据格式重复实例的缓冲区的流式解包。 (由 Antoine Pitrou 在 中提供:issue:`17804`。)
子流程
check_output() 现在接受 input 参数,该参数可用于为运行的命令提供 stdin
的内容。 (由 Zack Weinberg 在 :issue:`16624` 中贡献。)
getstatus()
和 getstatusoutput() 现在适用于 Windows。 这个改动实际上是在 3.3.4 中无意中做出的。 (由 Tim Golden 在 中贡献:问题:`10197`。)
苏瑙
getparams()
方法现在返回一个命名元组而不是一个普通的元组。 (由克劳迪乌·波帕在 中提供:issue:`18901`。)
sunau.open() 现在支持上下文管理协议:在 with 块中使用时,返回对象的 close
方法会在最后自动调用块的。 (由 Serhiy Storchaka 在 中提供:issue:`18878`。)
AU_write.setsampwidth() 现在支持 24 位样本,因此增加了对使用模块写入 24 样本的支持。 (由 Serhiy Storchaka 在 :issue:`19261` 中提供。)
writeframesraw() 和 writeframes() 方法现在接受任何类似 字节的对象 。 (由 Serhiy Storchaka 在 中提供:issue:`8311`。)
系统
新函数 sys.getallocatedblocks() 返回解释器分配的当前块数。 (在具有默认 --with-pymalloc
设置的 CPython 中,这是通过 PyObject_Malloc() API 进行的分配。)这对于跟踪内存泄漏非常有用,尤其是在通过测试套件自动化的情况下。 (由 Antoine Pitrou 在 中提供:issue:`13390`。)
当 Python 解释器以 交互模式 启动时,它会检查 sys 模块上的 __interactivehook__ 属性。 如果该属性存在,则在启动交互模式之前不带参数调用其值。 检查是在读取PYTHONSTARTUP文件后进行的,因此可以在那里设置。 如果平台支持 readline,site 模块 将其 设置为启用选项卡完成和历史保存的功能(在 ~/.python-history
中)。 如果您不想要这种(新)行为,您可以通过从 PYTHONSTARTUP、sitecustomize
或 usercustomize
中删除此属性来覆盖它X158X]sys(或将其设置为其他一些可调用对象)。 (由 Éric Araujo 和 Antoine Pitrou 在 :issue:`5845` 中提供。)
tar文件
tarfile 模块现在支持简单的 命令行界面 ,当直接或通过 -m
作为脚本调用时。 这可用于创建和提取 tarfile 存档。 (由 Berker Peksag 在 中提供:issue:`13477`。)
文本换行
TextWrapper 类有两个新的属性/构造函数参数:max_lines,它限制输出中的行数,以及 placeholder,这是一个字符串如果由于 max_lines 而被截断,则出现在输出的末尾。 在这些功能的基础上,一个新的便利函数 shorten() 将输入中的所有空白折叠成单个空格,并生成给定 宽度 的单行,以 结尾]占位符(默认为[...]
)。 (由 Antoine Pitrou 和 Serhiy Storchaka 在 :issue:`18585` 和 :issue:`18725` 中贡献。)
穿线
可以从新的 main_thread() 函数中获取代表主线程的 Thread 对象。 在正常情况下,这将是启动 Python 解释器的线程。 (由 Andrew Svetlov 在 :issue:`18882` 中提供。)
追溯
新的 traceback.clear_frames() 函数采用回溯对象并清除其引用的所有帧中的局部变量,从而减少消耗的内存量。 (由 Andrew Kuchling 在 :issue:`1565525` 中贡献。)
类型
新的 DynamicClassAttribute() 描述符提供了一种定义属性的方法,该属性在通过实例对象查找时正常运行,但在以下情况下路由到 class __getattr__
抬头看班级。 这允许在类上具有活动的属性,并在类上具有具有相同名称的虚拟属性(参见 Enum
示例)。 (由 Ethan Furman 在 中提供:issue:`19030`。)
网址库
urllib.request 现在通过 DataHandler 类支持 [X37X] URL。 (由 Mathias Panzenböck 在 :issue:`16423` 中贡献。)
现在可以通过在子类上设置 method 类属性来指定 Request 类将使用的 http 方法。 (由 Jason R Coombs 在 :issue:`18978` 中提供。)
Request 对象现在可以重用:如果 full_url 或 data 属性被修改,所有相关的内部属性都会更新。 这意味着,例如,现在可以在多个具有不同 data 参数的 OpenerDirector.open() 调用中使用相同的 Request 对象,或者修改 Request 的 url
而不是从头开始重新计算。 还有一个新的 remove_header() 方法可用于从 Request 中删除标头。 (由 Alexey Kachayev 在 :issue:`16464`、Daniel Wozniak 在 :issue:`17485` 和 Damien Brecht 和 Senthil Kumaran 在 :issue:`17272 中贡献`。)
HTTPError 对象现在具有 headers 属性,该属性提供对与错误关联的 HTTP 响应标头的访问。 (由 Berker Peksag 在 中提供:issue:`15701`。)
单元测试
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 在 中提供:issue:`16997`。)
unittest.main() 现在接受 defaultTest 的可迭代测试名称,以前它只接受单个测试名称作为字符串。 (由 Jyrki Pulliainen 在 :issue:`15132` 中提供。)
如果 SkipTest 在测试发现期间(即在测试文件中的模块级别)引发,现在报告为跳过而不是错误。 (由 Zach Ware 在 中提供:问题:`16935`。)
discover() 现在对发现的文件进行排序以提供一致的测试顺序。 (由 Martin Melin 和 Jeff Ramnani 在 :issue:`16709` 中提供。)
TestSuite 现在会在测试运行后立即删除对测试的引用(如果测试成功)。 在执行垃圾收集的 Python 解释器上,如果没有其他东西持有对测试的引用,这允许对测试进行垃圾收集。 可以通过创建定义自定义 _removeTestAtIndex
方法的 TestSuite 子类来覆盖此行为。 (由 Tom Wardill、Matt McClure 和 Andrew Svetlov 在 :issue:`11798` 中贡献。)
新的测试断言上下文管理器 assertLogs() 将确保给定的代码块使用 logging 模块发出日志消息。 默认情况下,消息可以来自任何记录器,并且具有 INFO
或更高的优先级,但可以指定记录器名称和替代的最低日志记录级别。 可以查询上下文管理器返回的对象以获取记录的 LogRecord 和/或格式化消息。 (由 Antoine Pitrou 在 :issue:`18937` 中提供。)
测试发现现在适用于命名空间包(由 中的克劳迪乌波帕贡献:问题:`17457`。)
unittest.mock 对象现在在匹配调用时检查它们的规范签名,这意味着现在可以通过位置或名称来匹配参数,而不仅仅是通过位置。 (由 Antoine Pitrou 在 中提供:issue:`17015`。)
mock_open()
对象现在具有 readline
和 readlines
方法。 (由 Toshio Kuratomi 在 中提供:issue:`17467`。)
venv
venv 现在包括 csh
和 fish
外壳的激活脚本。 (由 Andrew Svetlov 在 :issue:`15417` 中提供。)
EnvBuilder 和 create() 便利函数采用新的关键字参数 with_pip,默认为 False
,控制是否 ]EnvBuilder 确保 pip
安装在虚拟环境中。 (由 Nick Coghlan 在 :issue:`19552` 中贡献,作为 PEP 453 实现的一部分。)
海浪
getparams()
方法现在返回一个命名元组而不是一个普通的元组。 (由克劳迪乌·波帕在 中提供:issue:`17487`。)
wave.open() 现在支持上下文管理协议。 (由克劳迪乌·波帕在 中提供:issue:`17616`。)
wave 现在可以 将输出写入不可搜索的文件 。 (由 David Jones、Guilherme Polo 和 Serhiy Storchaka 在 :issue:`5202` 中贡献。)
writeframesraw() 和 writeframes() 方法现在接受任何类似 字节的对象 。 (由 Serhiy Storchaka 在 中提供:issue:`8311`。)
弱引用
新的 WeakMethod 类模拟对绑定方法的弱引用。 (由 Antoine Pitrou 在 中提供:issue:`14631`。)
新的 finalize 类可以注册一个回调以在对象被垃圾收集时调用,而无需仔细管理弱引用本身的生命周期。 (由 Richard Oudkerk 在 :issue:`15528` 中提供。)
与 ref 关联的回调(如果有)现在通过 __callback__ 属性公开。 (由 Mark Dickinson 在 :issue:`17643` 中贡献。)
xml文件
新的解析器 XMLPullParser 允许非阻塞应用程序解析 XML 文档。 一个例子可以在 用于非阻塞解析的拉 API 中看到。 (由 Antoine Pitrou 在 中提供:issue:`17741`。)
xml.etree.ElementTree tostring() 和 tostringlist() 函数,以及 ElementTree write() ] 方法,现在有一个 short_empty_elements 仅关键字参数 提供控制是否以缩写 (<tag />
) 或扩展 ([ X333X]) 形式。 (由 Ariel Poliak 和 Serhiy Storchaka 在 :issue:`14377` 中提供。)
压缩文件
PyZipFile 类的 writepy() 方法有一个新的 filterfunc 选项,可用于控制将哪些目录和文件添加到存档中。 例如,这可用于从存档中排除测试文件。 (由 Christian Tismer 在 :issue:`19274` 中提供。)
ZipFile 和 PyZipfile
的 allowZip64 参数现在默认为 True
。 (由 William Mallard 在 :issue:`17201` 中提供。)
CPython 实现更改
PEP 442:安全对象终结
PEP 442 消除了 CPython 中对象终结的当前限制和怪癖。 有了它,具有 __del__()
方法的对象,以及具有 finally 子句的生成器,可以在它们成为引用循环的一部分时完成。
作为此更改的一部分,在大多数情况下,在解释器关闭期间,模块全局变量不再强制设置为 None,而是依赖于循环垃圾收集器的正常运行。 这避免了一整类解释器关闭时错误,通常涉及 __del__
方法,自从循环 GC 首次引入以来,这些错误一直困扰着 Python。
PEP 456:安全且可互换的哈希算法
PEP 456 跟进了早期对 Python 哈希算法所做的安全修复工作,以解决某些 DOS 攻击,这些攻击由字典查找支持的面向公众的 API 可能会受到这些攻击。 (有关本轮改进的开始,请参阅 :issue:`14621`。)PEP 统一了 CPython 的哈希码,使打包者更容易替换不同的哈希算法,并切换 Python 的默认实现到具有 64 位数据类型的平台上的 SipHash 实现。 与旧的 FNV 算法相比,任何性能差异都是微不足道的。
PEP 向 sys.hash_info 命名元组添加了附加字段,以描述当前正在执行的二进制文件使用的哈希算法。 否则,PEP 不会改变任何现有的 CPython API。
PEP 436:论证诊所
“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 提供。
其他构建和 C API 更改
- 新的 PyType_GetSlot() 函数已添加到稳定的 ABI 中,允许在使用有限 API 时从命名类型槽中检索函数指针。 (由 Martin von Löwis 在 :issue:`17162` 中提供。)
- 新的 Py_SetStandardStreamEncoding() 预初始化 API 允许嵌入 CPython 解释器的应用程序可靠地强制标准流的特定编码和错误处理程序。 (由 Bastien Montagne 和 Nick Coghlan 在 :issue:`16129` 中提供。)
- 大多数不改变字符串参数的 Python C API 现在被正确标记为接受
const char *
而不是char *
。 (由 Serhiy Storchaka 在 中提供:issue:`1772673`。) - 即使在 python 解释器不可用时(例如,在交叉编译场景中),也可以使用
python-config
的新 shell 版本。 - PyUnicode_FromFormat() 现在支持
%s
、%A
、%U
、%V
、%S
的宽度和精度规范, 和%R
。 (由 Ysj Ray 和 Victor Stinner 在 中提供:issue:`7330`。) - 新函数 PyStructSequence_InitType2() 补充了现有的 PyStructSequence_InitType() 函数。 不同之处在于它在成功时返回
0
,在失败时返回-1
。 - 现在可以使用 GCC 和 clang 最新版本的地址完整性检查功能编译 CPython 源代码:小对象分配器中的误报已被消除。 (由 Dhiru Kholia 在 :issue:`18596` 中提供。)
- Windows 版本现在使用 地址空间布局随机化 和 数据执行保护 。 (由 Christian Heimes 在 中提供:issue:`16632`。)
- 新函数 PyObject_LengthHint() 相当于 operator.length_hint() 的 C API。 (由 Armin Ronacher 在 中提供:issue:`16148`。)
其他改进
- python命令有一个新的选项,
-I
,这使它以“隔离模式”运行,这意味着sys.path既不包含脚本的目录也不包含用户的site-packages
目录,并且所有PYTHON*
环境变量都被忽略(这意味着-s
和-E
])。 将来也可能应用其他限制,目的是将脚本的执行与用户环境隔离。 例如,当使用 Python 运行系统脚本时,这是合适的。 在大多数 POSIX 系统上,它可以并且应该在系统脚本的#!
行中使用。 (由 Christian Heimes 在 中提供:issue:`16499`。) - 现在在支持 readline 的系统上的交互式解释器中默认启用 Tab 补全。 历史记录也默认启用,并写入(和读取)文件
~/.python-history
。 (由 Antoine Pitrou 和 Éric Araujo 在 :issue:`5845` 中贡献。) - 使用
--version
调用 Python 解释器现在将版本输出到标准输出而不是标准错误 (:issue:`18338`)。 对 argparse (:issue:`18920`) 和其他具有类似脚本调用功能的模块 (:issue:`18922`) 进行了类似的更改. - CPython Windows 安装程序现在在扩展注册时将
.py
添加到PATHEXT
变量,允许用户在 windows 命令提示符下运行 python 脚本,只需键入其名称,无需.py
扩展。 (由 Paul Moore 在 :issue:`18569` 中贡献。) - 一个新的
make
目标 coverage-report 将构建 python,运行测试套件,并使用gcov
和 lcov[ X171X]。 - python 回归测试套件 的
-R
选项现在还使用 sys.getallocatedblocks() 检查内存分配泄漏。 (由 Antoine Pitrou 在 中提供:issue:`13390`。) python -m
现在适用于命名空间包。- stat 模块现在用 C 实现,这意味着它从 C 头文件中获取其常量的值,而不是像以前那样在 python 模块中硬编码这些值。
- 从单个 OS 模块(
.so
、.dll
)加载多个 python 模块现在可以正常工作(以前它以静默方式返回文件中的第一个 python 模块)。 (由 Václav Šmilauer 在 :issue:`16421` 中提供。) - 添加了一个新的操作码 :opcode:`LOAD_CLASSDEREF`,以修复在类主体中加载自由变量时可能由 __prepare__ 的某些用途触发的错误。 (由 Benjamin Peterson 在 :issue:`17853` 中贡献。)
- Victor Stinner 使用基于 PEP 445 的
pyfailmalloc
工具识别并修复了许多与 MemoryError 相关的崩溃(:issue:`18408`[ X160X],:问题:`18520`)。 pyvenv
命令现在接受--copies
选项以使用副本而不是符号链接,即使在符号链接是默认的系统上也是如此。 (由 Vinay Sajip 在 :issue:`18807` 中提供。)pyvenv
命令也接受一个--without-pip
选项来抑制 pip 自动引导到虚拟环境中。 (由 Nick Coghlan 在 :issue:`19552` 中贡献,作为 PEP 453 实现的一部分。)- 现在,编码名称在 PYTHONIOENCODING 环境变量的值集中是可选的。 这使得只设置错误处理程序成为可能,而无需更改默认编码。 (由 Serhiy Storchaka 在 中提供:issue:`18818`。)
- bz2、lzma和gzip模块
open
功能现在支持x
(独创)模式。 (由 Tim Heaney 和 Vajrasky Kok 在 :issue:`19201`、:issue:`19222` 和 :issue:`19223` 中贡献。)
重大优化
- UTF-32 解码器现在快了 3 到 4 倍。 (由 Serhiy Storchaka 在 中提供:issue:`14625`。)
- 集合的散列冲突成本现在降低了。 现在,每个哈希表探测都会在继续通过哈希表进行随机探测之前检查一系列连续的、相邻的键/哈希对。 这利用缓存局部性来降低冲突解决的成本。 冲突解决方案可以描述为线性探测和开放寻址的混合。 附加线性探头的数量默认为九个。 这可以在编译时通过将 LINEAR_PROBES 定义为任何值来更改。 设置 LINEAR_PROBES=0 以完全关闭线性探测。 (由 Raymond Hettinger 在 中提供:issue:`18771`。)
- 解释器开始大约 30% faster。 一些措施导致加速。 解释器在启动时加载较少的模块,例如 默认情况下不再导入 re、collections 和 locale 模块及其依赖项。 marshal 模块已得到改进,可以更快地加载已编译的 Python 代码。 (由 Antoine Pitrou、Christian Heimes 和 Victor Stinner 在 :issue:`19219`, :issue:`19218`, :issue:`19209` 中贡献, :issue:`19205` 和 :issue:`9548`。)
- bz2.BZ2File 现在在大多数情况下与 Python2 版本一样快或更快。 lzma.LZMAFile 也进行了优化。 (由 Serhiy Storchaka 和 Nadeem Vawda 在 中提供:issue:`16034`。)
- random.getrandbits() 对于小整数(最常见的用例)快 20%-40%。 (由 Serhiy Storchaka 在 中提供:issue:`16674`。)
- 通过利用新的字符串存储格式,字符串的酸洗现在明显更快。 (由 Victor Stinner 和 Antoine Pitrou 在 :issue:`15596` 中提供。)
io.FileIO.readall()
中的性能问题已解决。 这尤其影响 Windows,并显着加快了通过 子进程 传输大量数据的情况。 (由 Richard Oudkerk 在 :issue:`15758` 中提供。)- html.escape() 现在快 10 倍。 (由 Matt Bryant 在 :issue:`18020` 中提供。)
- 在 Windows 上,现在使用本机
VirtualAlloc
而不是obmalloc
中的 CRTmalloc
。 人工基准测试显示大约节省了 3% 的内存。 - os.urandom() 现在使用延迟打开的持久文件描述符,以避免在从多个线程并行运行时使用许多文件描述符。 (由 Antoine Pitrou 在 :issue:`18756` 中贡献。)
已弃用
本节介绍 Python 3.4 中已弃用的各种 API 和其他功能,并将在 Python 3.5 或更高版本中删除。 在大多数(但不是全部)情况下,当解释器在启用弃用警告的情况下运行时(例如,通过使用 -Wd
),使用弃用的 API 将产生 DeprecationWarning。
Python API 中的弃用
- 如 PEP 451: A ModuleSpec Type for the Import System 中所述,不推荐使用许多 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() 和 .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 中完全删除。 - 未公开的 endtime 参数 subprocess.Popen.wait() 不应该被暴露,并且希望不被使用; 它已被弃用,并且很可能会在 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。 但是,在解决 :issue:`18823` 之前,不会删除该功能。 - 不推荐使用将“site-python”目录添加到 sys.path 的站点模块(如果存在)(:issue:`19375`)。
已移除
不再支持的操作系统
已从源代码和构建工具中删除对以下操作系统的支持:
- OS/2 (:issue:`16135`)。
- Windows 2000(变更集 e52df05b496a)。
COMSPEC
指向command.com
的 Windows 系统(:issue:`14470`)。- VMS (:issue:`16136`)。
API 和功能删除
以下过时和以前弃用的 API 和功能已被删除:
- 未维护的
Misc/TextMate
和Misc/vim
目录已被删除(有关使用什么的建议,请参阅 devguide)。 SO
makefile 宏被删除(它被SHLIB_SUFFIX
和EXT_SUFFIX
宏取代)(:issue:`16754`)。PyThreadState.tick_counter
字段已被移除; 自从 Python 3.2 引入“新 GIL”(:issue:`19199`)以来,它的值就没有意义了。PyLoader
和PyPycLoader
已从 importlib 中删除。 (由 Taras Lyapun 在 中提供:issue:`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 在 中提供:issue:`15480`。) - inspect.Signature:现在要求仅位置参数具有有效名称。
- object.__format__() 不再接受非空格式字符串,它现在会引发 TypeError。 自 Python 3.2 起,不推荐使用非空字符串。 进行此更改是为了防止如果对象获得 __format__ 方法,以前工作(但不正确)的代码将开始失败的情况,这意味着如果您使用 TypeError,您的代码现在可能会引发 [ X238X] 格式代码的对象没有处理它的 __format__ 方法。 有关背景信息,请参阅 :issue:`7994`。
difflib.SequenceMatcher.isbjunk()
和difflib.SequenceMatcher.isbpopular()
在 3.2 中被弃用,现在已被移除:使用x in sm.bjunk
和x in sm.bpopular
,其中 sm 是一个 [ X127X]SequenceMatcher 对象 (:issue:`13248`)。
代码清理
- 未使用和未记录的内部
Scanner
类已从 pydoc 模块中删除。 - 已删除私有且有效未使用的
_gestalt
模块,以及私有 platform 函数_mac_ver_lookup
、_mac_ver_gstalt
和_bcd2str
,它只会在严重损坏的 OSX 系统上调用(参见 :issue:`18393`)。 - 包含在 tarfile 模块命名空间中的某些 stat 常量的硬编码副本已被删除。
移植到 Python 3.4
本节列出了可能需要更改您的代码的先前描述的更改和其他错误修正。
“python”命令行为的变化
- 在 posix shell 中,将
PATH
环境变量设置为空值相当于根本不设置它。 但是,将 PYTHONPATH 设置为空值是 not 相当于根本不设置它:设置 PYTHONPATH为空值等同于将其设置为.
,这会导致在类推PATH
的工作原理时产生混淆。 该行为现在符合PATH
的 posix 约定。 - CPython 解释器的调试 (
--with-pydebug
) 版本的 [X refs, Y blocks] 输出现在默认关闭。 可以使用-X showrefcount
选项重新启用它。 (由 Ezio Melotti 在 :issue:`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
。 (:问题:`17115`。) - importlib.util.module_for_loader() 现在无条件设置
__loader__
和__package__
以正确支持重新加载。 如果不需要,则需要手动设置这些属性。 您可以使用importlib.util.module_to_load()
进行模块管理。 - 导入现在重置相关属性(例如
__name__
、__loader__
、__package__
、__file__
、__cached__
)在重新加载时无条件。 请注意,这会恢复 3.3 之前的行为,因为这意味着在重新加载时会重新找到模块 (:issue:`19413`)。 - 冻结的包不再将
__path__
设置为包含包名称的列表,他们现在将其设置为空列表。 如果还有一个与冻结包同名的目录,则之前的行为可能会导致导入系统在子模块导入上做错误的事情。 确定模块是否为包的正确方法是使用hasattr(module, '__path__')
(:issue:`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 在 :issue:`18416` 中贡献)。 在命令行中指定)(:issue:`18416`)。 - 删除 HTTPConnection 和 HTTPSConnection 的 strict 参数会更改其余参数的含义,如果您是按位置而不是通过关键字指定它们。 如果您一直在关注弃用警告,您的代码应该已经通过关键字指定了任何其他参数。
from __future__ import ...
语句之间的字符串现在 always 引发 SyntaxError。 以前,如果没有前导文档字符串,有时会忽略间隙字符串。 这使 CPython 符合语言规范; Jython 和 PyPy 已经是。 (:问题:`17434`)。- ssl.SSLSocket.getpeercert() 和 ssl.SSLSocket.do_handshake() 现在在 [ X137X] 未连接,而不是之前引发 AttributeError 的行为。 此外,如果握手尚未完成,getpeercert() 将引发 ValueError。
- base64.b32decode() 现在在输入字符串包含非 b32 字母字符而不是 TypeError 时引发 binascii.Error。 当其他 TypeError 被转换时,这个特殊的 TypeError 被遗漏了。 (由 Serhiy Storchaka 在 中贡献:issue:`18011`。)注意:此更改也无意中应用于 Python 3.3.3。
file
属性现在在创建的cgi.FieldStorage
实例被垃圾收集时自动关闭。 如果您将文件对象从cgi.FieldStorage
实例中单独拉出并且不使该实例保持活动状态,那么您应该存储整个cgi.FieldStorage
实例或在cgi.FieldStorage
实例被垃圾回收。- 在关闭的 SSL 套接字上调用
read
或write
现在会引发信息性 ValueError 而不是之前更神秘的 AttributeError(:问题: `9177`)。 - slice.indices() 不再为巨大的值产生 OverflowError。 由于此修复,slice.indices() 现在在给定负长度时引发 ValueError; 以前它返回无意义的值(:issue:`14794`)。
- complex 构造函数与 cmath 函数不同,如果对象的
__complex__
特殊方法返回一个值,则会错误地接受 float 值。 这现在会引发 TypeError。 (:问题:`16290`。) - 3.2 和 3.3 中的 int 构造函数错误地接受 base 参数的 float 值。 不太可能有人这样做,但如果是这样,它现在会引发 TypeError (:issue:`16772`)。
- 现在计算仅关键字参数的默认值 after 常规关键字参数的默认值,而不是之前。 希望没有人编写任何依赖于先前错误行为的代码(:issue:`16967`)。
- 陈旧的线程状态现在在 fork() 之后被清除。 这可能会导致一些系统资源被释放,而这些资源以前错误地保持永久活动状态(例如,保持在线程本地存储中的数据库连接)。 (:问题:`17094`。)
__annotations__
dict 中的参数名称现在已正确修改,类似于__kwdefaults__
。 (由 Yury Selivanov 在 :issue:`20625` 中贡献。)- hashlib.hash.name 现在总是以小写形式返回标识符。 以前一些内置哈希的名称是大写的,但现在它是一个正式的公共接口,命名已经一致(:issue:`18532`)。
- 因为 unittest.TestSuite 现在会在测试运行后删除对测试的引用,所以重新使用 TestSuite 重新运行一组测试的测试工具可能会失败。 不应以这种方式重用测试套件,因为这意味着在测试运行之间保留状态,打破了 unittest 旨在提供的测试隔离。 但是,如果认为缺乏隔离是可以接受的,则可以通过创建一个 TestSuite 子类来恢复旧行为,该子类定义了一个不执行任何操作的
_removeTestAtIndex
方法(参见 TestSuite.__iter__( )) (:issue:`11798`)。 - unittest 现在使用 argparse 进行命令行解析。 某些曾经有效的无效命令形式不再被允许使用; 从理论上讲,这不应该导致向后兼容性问题,因为不允许的命令形式没有任何意义并且不太可能被使用。
- re.split()、re.findall() 和 re.sub() 函数,以及
group()
和groups()
对象的match
方法现在总是返回一个 bytes 对象,当要匹配的字符串是一个 bytes-like object 时。 以前返回类型与输入类型匹配,因此如果您的代码取决于返回值,例如bytearray
,您将需要更改您的代码。 - audioop 函数现在在传递字符串输入时立即引发错误,而不是稍后随机失败 (:issue:`16685`)。
- HTMLParser 的新 convert_charrefs 参数当前默认为
False
以实现向后兼容性,但最终将更改为默认为True
。 建议您将此关键字和适当的值添加到代码中的任何 HTMLParser 调用 (:issue:`13633`)。 - 由于 hmac.new() 函数的 digestmod 参数将来没有默认值,所有对 hmac.new() 的调用都应更改为明确指定 digestmod (:issue:`17276`)。
- 使用
SO
键调用 sysconfig.get_config_var(),或在调用 sysconfig.get_config_vars() 的结果中查找SO
是已弃用。 该键应替换为EXT_SUFFIX
或SHLIB_SUFFIX
,具体取决于上下文 (:issue:`19555`)。 - 应修改对指定
U
的open
函数的任何调用。U
在 Python3 中无效,如果使用最终会引发错误。 根据函数的不同,可以使用 newline 参数或在必要时将流包装在 TextIOWrapper 中以使用其 newline[ X215X] 参数(:问题:`15204`)。 - 如果您在脚本中使用
pyvenv
并希望安装 pip 而不是 ,则必须将--without-pip
添加到您的命令调用中。 - 指定缩进时 json.dump() 和 json.dumps() 的默认行为已更改:它在分隔逗号末尾的项目后不再产生尾随空格线。 仅当您有对此类输出进行空白敏感比较的测试时,这才有意义(:issue:`16333`)。
- doctest 现在在扩展模块
__doc__
字符串中查找 doctests,所以如果你的 doctest 测试发现包括具有看起来像 doctests 的东西的扩展模块,你可能会看到你从未见过的测试失败在运行测试之前 (:issue:`3158`)。 - collections.abc 模块已作为 Python 启动改进的一部分进行了轻微重构。 因此,导入 collections 不再自动导入 collections.abc。 如果您的程序依赖于(未记录的)隐式导入,您将需要添加一个显式的
import collections.abc
(:issue:`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()[X] 分配的字符串,如果发生错误, 而不是由 PyMem_Malloc() 或 PyMem_Realloc() (:issue:`16742`) 分配的字符串
- PyThread_set_key_value() 现在总是设置值。 在 Python 3.3 中,如果键已经存在(如果当前值是非
NULL
指针),则该函数不执行任何操作。 - PyFrameObject 结构的
f_tstate
(线程状态)字段已被删除以修复错误:有关基本原理,请参阅 :issue:`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)