Python 3.4 新增Function

本文介绍了 Python 3.4 与 3.3 相比的新Function。 Python 3.4 于 2014 年 3 月 16 日发布。有关完整详细信息,请参见changelog

See also

PEP 429 – Python 3.4 发布时间表

摘要-发行要点

新语法Function:

  • Python 3.4 中未添加任何新的语法Function。

其他新Function:

新的库模块:

显着改进的库模块:

Security improvements:

CPython 实现的改进:

请 continue 阅读以获取面向用户的更改的完整列表,包括许多其他较小的改进,CPython 优化,不推荐使用以及潜在的移植问题。

New Features

PEP 453:Python 安装中的 PIP 显式引导

默认情况下自举点

新的ensurepip模块(在 PEP 453中定义)提供了一种标准的跨平台机制,可将 pip 安装程序引导到 Python 安装和虚拟环境中。 Python 3.4.0 随附的pip的版本为pip 1.5.4,并且将来的 3.4.x 维护版本会将 Binding 的版本更新为创建候选版本时可用的pip的最新版本。

默认情况下,命令pipXpipX.Y将连同pip Python 软件包及其依赖项一起安装在所有平台上(其中 X.Y 代表 Python 安装的版本)。在 Windows 以及所有平台上的虚拟环境中,还将安装 unversioned pip命令。在其他平台上,系统范围内的未版本化pip命令通常是指单独安装的 Python 2 版本。

pyvenv命令行 Util 和venv模块利用ensurepip模块使pip在虚拟环境中易于使用。使用命令行 Util 时,默认情况下安装pip,而使用venv模块API时则必须明确要求pip的安装。

对于 CPython 源代码基于 POSIX 系统,默认情况下make installmake altinstall命令引导pip。可以pass配置选项控制此行为,并pass Makefile 选项覆盖此行为。

在 Windows 和 Mac OS X 上,CPython 安装程序现在默认安装pip以及 CPython 本身(用户可以在安装过程中选择退出安装)。窗口用户将需要选择自动进行PATH修改,以默认情况下可从命令行使用pip,否则仍然可以pass Windows 的 Python 启动器py -m pip对其进行访问。

作为在 PEP 中讨论,平台打包程序可以选择默认情况下不安装这些命令,只要它们在被调用时就如何在该平台上安装它们提供了简单明了的指导(通常使用系统软件包 Management 器)。

Note

为了避免并行 Python 2 和 Python 3 安装之间的冲突,默认情况下,当直接调用ensurepip时,仅引导版本化的pip3pip3.4命令-需要--default-pip选项来请求未版本控制的pip命令。 pyvenv和 Windows 安装程序确保在这些环境中提供不合格的pip命令,并且始终可以pass-m开关而不是直接调用pip以避免在具有多个 Python 安装的系统上产生歧义。

Documentation Changes

作为此更改的一部分,文档的安装 Python 模块分发 Python 模块部分已完全重新设计为简短的入门指南和常见问题解答文档。现在,大多数包装文档都移到了 Python 包装 Management 机构Python 打包用户指南以及各个项目的文档中。

但是,由于该迁移目前仍未完成,因此这些指南的旧版本仍然可用安装 Python 模块(旧版)分发 Python 模块(旧版)

See also

  • PEP 453 –在 Python 安装中明确引导 pip

  • 由 Donald Stufft 和 Nick Coghlan 编写的 PEP,由 Donald Stufft,Nick Coghlan,Martin vonLöwis 和 Ned Deily 实施。

PEP 446:新创建的文件 Descriptors 不可继承

PEP 446使得新创建的文件 Descriptorsnon-inheritable。通常,这是应用程序想要的行为:在启动新进程时,在新进程中同时打开当前打开的文件也会导致各种难以发现的错误,并可能导致安全问题。

但是,有时需要继承。为了支持这些情况,可以使用以下新Function和方法:

See also

  • PEP 446 –使新创建的文件 Descriptors 不可继承

  • PEP 由 Victor Stinner 编写和实施。

编解码器处理方面的改进

自从首次引入以来,codecs模块就一直旨在用作类型无关的动态编码和解码系统。但是,它与 Python 文本模型的紧密结合,尤其是内置strbytesbytearray类型上的类型受限的便捷方法,在历史上一直掩盖了这一事实。

作为澄清这种情况的关键步骤,现在在 Python 2.7、3.3 和 3.4 中正确记录了codecs.encode()codecs.decode()便利函数。这些Function自 Python 2.4 开始就存在于codecs模块中(并且已被回归测试套件所涵盖),但以前只能pass运行时内省才能发现。

strbytesbytearray上的便捷方法不同,codecs便捷函数在 Python 2 和 Python 3 中都支持任意编解码器,而不仅限于 Unicode 文本编码(在 Python 3 中)或basestring <-> basestring转换(在 Python 2 中)。

在 Python 3.4 中,解释器能够识别标准库中提供的已知非文本编码,并在适当时将用户引导至这些通用便利Function:

>>> 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)

finally,如上面的示例所示,这些改进允许为本身在 Python 3.2 中恢复的非 Unicode 编解码器恢复便利性别名。这意味着现在可以将二进制数据与十六进制表示形式进行编码(例如),可以写成:

>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'

Binary TransformsText Transforms中详细介绍了标准库中提供的二进制和文本转换。

(由 Nick Coghlan 在bpo-7475bpo-17827bpo-17828bpo-19619中贡献。)

PEP 451:导入系统的 ModuleSpec 类型

PEP 451提供了有关导入机器将用于加载该模块的模块信息的封装(即模块规范)。这有助于简化导入实现和几个与导入相关的 API。更改也是Future 与 import 相关的一些改进的垫脚石。

PEP 面向公众的更改是完全向后兼容的。此外,它们应该对除 import 商以外的所有人透明。密钥查找器和加载器方法已被弃用,但它们将 continue 工作。新 import 商应使用 PEP 中描述的新方法。应该更新现有的 import 商以实施新方法。有关应替换的方法及其替换的列表,请参见Deprecated部分。

其他语言更改

对核心 Python 语言进行的一些较小更改是:

  • Unicode 数据库已更新为 UCD 版本 6.3.

  • min()max()现在接受一个* default *仅关键字参数,如果要评估的可迭代对象没有元素,则可用于指定它们返回的值。 (由 Julian Berman 在bpo-18111中贡献。)

  • 模块对象现在可以weakref'。

  • 现在,默认情况下,模块__file__属性(和相关值)应始终包含绝对路径,唯一的 exception 是__main__.__file__,该脚本已使用相对路径直接执行了脚本。 (由 Brett Cannon 在bpo-18416中贡献。)

  • 现在,除非使用了surrogatepass错误处理程序,否则所有 UTF- *编解码器(除了 UTF-7)在代理编码和解码期间都拒绝代理,除了 UTF-16 解码器(接受有效代理对)和 UTF-16 编码器外(在编码非 BMP 字符时产生它们)。 (由 Victor Stinner,Lu Kang-Hao(Kenny)Lu 和 Serhiy Storchaka 在bpo-12892中贡献。)

  • 新的德国 EBCDIC codec cp273。 (由 Michael Bierenfeld 和 Andrew Kuchling 在bpo-1097797中贡献。)

  • 新乌克兰语codec cp1125。 (由 Serhiy Storchaka 在bpo-19668中贡献。)

  • bytes .join()和bytearray .join()现在接受任意缓冲区对象作为参数。 (由bpo-15958中的 Antoine Pitrou 提供。)

  • 现在,int构造函数接受* base *参数具有__index__方法的任何对象。 (由 Mark Dickinson 在bpo-16772中贡献。)

  • 框架对象现在具有clear()方法,该方法从框架中清除对局部变量的所有引用。 (由bpo-17934中的 Antoine Pitrou 提供。)

  • memoryview现在已注册为Sequence,并支持reversed()内置。 (由 Nick Coghlan 和 Claudiu Popa 在bpo-18690bpo-19078中贡献。)

  • 由于引入了 Argument Clinic 以及对inspectpydoc模块进行的其他更改,在某些情况下,help()报告的签名已被修改和改进。

  • length_hint()现在是正式语言规范的一部分(请参见 PEP 424)。 (由 Armin Ronacher 在bpo-16148中贡献。)

New Modules

asyncio

新的asyncio模块(在 PEP 3156中定义)提供了适用于 Python 的标准可插入事件循环模型,在标准库中提供了可靠的异步 IO 支持,并使其他事件循环实现更易于与标准库互操作。

对于 Python 3.4,此模块被视为provisional API

See also

  • PEP 3156 –重新启动了异步 IO 支持:“异步”模块

  • PEP 由 Guido van Rossum 编写和实施。

ensurepip

新的ensurepip模块是 PEP 453实现的主要基础结构。在正常情况下,finally用户将不需要与该模块进行交互,但是如果自动引导安装或虚拟环境被拒绝,则可以使用该模块手动引导pip

ensurepip包含 Binding 在一起的pip的 Binding 副本,该副本是其随附的 CPython 版本的第一个候选发布版本的最新副本(这适用于维护版本和Function版本)。 ensurepip无法访问互联网。如果安装可以访问 Internet,则在运行ensurepip之后,可以使用 Binding 的pippip升级到比 Binding 的版本更新的发行版。 (请注意,这样的pip的升级版是单独安装的软件包,如果卸载了 Python,则不会将其删除.)

该模块的名称为“确保” pip,因为如果在已安装pip的情况下调用该模块,则它将不执行任何操作。它还具有--upgrade选项,如果pip的现有安装版本早于 Binding 副本,则该选项将导致它安装pipBinding 副本。

enum

新的enum模块(在 PEP 435中定义)提供了枚举类型的标准实现,允许其他模块(例如socket)pass向后兼容的枚举值替换不透明的整数常量,提供更多的错误信息和更好的调试支持。

See also

  • PEP 435 –将 Enum 类型添加到 Python 标准库

  • 由 Barry Warsaw,Eli Bendersky 和 Ethan Furman 编写的 PEP,由 Ethan Furman 实施。

pathlib

新的pathlib模块提供了代表文件系统路径的类,这些类具有适用于不同 os 的语义。路径类分为纯路径具体路径,纯路径提供纯的计算操作而无需 I/O,纯路径从纯路径继承,但也提供 I/O 操作。

对于 Python 3.4,此模块被视为provisional API

See also

  • PEP 428 – pathlib 模块–面向对象的文件系统路径

  • PEP 由 Antoine Pitrou 编写和实施。

selectors

新的selectors模块(作为实现 PEP 3156的一部分创建)允许在select模块 Primitives 的基础上进行高层且高效的 I/O 复用。

statistics

新的statistics模块(在 PEP 450中定义)直接在标准库中提供了一些核心统计Function。该模块支持计算数据序列的平均值,中位数,众数,方差和标准偏差。

See also

  • PEP 450 –将统计模块添加到标准库

  • 由 Steven D'Aprano 编写并实施的 PEP

tracemalloc

新的tracemalloc模块(在 PEP 454中定义)是一个调试工具,用于跟踪 Python 分配的内存块。它提供以下信息:

  • 跟踪对象的分配位置

  • 每个文件名和每行号分配的内存块的统计信息:分配的内存块的总大小,数量和平均大小

  • 计算两个快照之间的差异以检测内存泄漏

See also

  • PEP 454 –添加新的 tracemalloc 模块以跟踪 Python 内存分配

  • Victor Stinner 编写和实施的 PEP

Improved Modules

abc

新Functionabc.get_cache_token()可用于了解何时使受对象图更改影响的缓存无效。 (由ŁukaszLanga 在bpo-16832中贡献。)

新类别ABC的元类别为ABCMeta。使用ABC作为 Base Class 与指定metaclass=abc.ABCMeta本质上具有相同的效果,但更易于键入且更易于阅读。 (由bpo-16049中的 Bruno Dupuis 贡献。)

aifc

getparams()方法现在返回一个 namedtuple 而不是一个普通的 Tuples。 (由 Claudiu Popa 在bpo-17818中贡献。)

aifc.open()现在支持上下文 Management 协议:在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 位 samples。 (由 Serhiy Storchaka 在bpo-12866中贡献。)

新的byteswap()函数将大端采样转换为小端采样,反之亦然。 (由 Serhiy Storchaka 在bpo-19641中贡献。)

现在,所有audioop函数都可以接受任何bytes-like object。字符串不被接受:它们以前没有工作,现在它们立即引发错误。 (由 Serhiy Storchaka 在bpo-16685中贡献。)

base64

现在,如果以前需要bytesbytearray实例,则base64中的编码和解码Function可以接受任何bytes-like object。 (由 Nick Coghlan 在bpo-17839中贡献。)

新Functiona85encode()a85decode()b85encode()b85decode()分别提供对Ascii85和 git/mercurial Base85格式的二进制数据进行编码和解码的Function。 a85函数具有一些选项,可用于使它们与Ascii85编码的变体兼容,包括 Adobe 变体。 (由 Martin Morrison,Mercurial 项目,Serhiy Storchaka 和bpo-17618中的 Antoine Pitrou 提供。)

collections

ChainMap.new_child()方法现在接受一个* m *参数,该参数指定要添加到链中的子 Map。这允许将现有 Map 和/或自定义 Map 类型用于子级。 (由 Vinay Sajip 在bpo-16613中贡献。)

colorsys

RGB_YIQ 转换的系数中的位数已扩展,以使其与 FCC NTSC 版本匹配。结果的变化应小于 1%,并且可能更好地匹配其他地方的结果。 (由 Brian_landers 和 Serhiy Storchaka 在bpo-14323中贡献。)

contextlib

新的contextlib.suppress上下文 Management 器有助于阐明故意抑制单个语句中的异常的代码的意图。 (由bpo-15806中的 Raymond Hettinger 和bpo-19266中的 Zero Piraeus 贡献。)

新的contextlib.redirect_stdout()上下文 Management 器使 Util 脚本更易于处理将其输出写入sys.stdout且不提供任何重定向选项的不灵活的 API。使用上下文 Management 器,可以将sys.stdout输出重定向到任何其他流,或者与io.StringIO一起重定向到字符串。后者可能特别有用,例如,从为实现命令行界面而编写的函数中捕获输出。仅建议将其用于 Util 脚本,因为它会影响sys.stdout的全局状态。 (由bpo-15805中的 Raymond Hettinger 贡献。)

contextlib文档也进行了更新,以包含discussion的一次性使用,可重用和可重入上下文 Management 器之间的差异。

dbm

dbm.open()对象现在支持上下文 Management 协议。在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_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(),它提供了操作回溯的Function(即print(Bytecode.from_traceback(tb).dis())等效于distb(tb))。

(由bpo-11816的 Nick Coghlan,Ryan Kelly 和 Thomas Kluyver 和bpo-17916的 Claudiu Popa 贡献。)

新函数stack_effect()计算给定操作码和参数对 Python 堆栈的影响,否则该信息将不可用。 (由 Larry Hastings 在bpo-19722中贡献。)

doctest

一旦检测到第一个故障,新的option flagFAIL_FAST就会停止运行测试。 (由 R. David Murray 和 Daniel Urban 在bpo-16522中贡献。)

doctest命令行界面现在使用argparse,并且具有两个新选项-o-f-o允许在命令行上指定doctest options,而-f-o FAIL_FAST的简写(与unittest CLI 支持的类似选项并行)。 (由 R. David Murray 在bpo-11390中贡献。)

doctest现在将在扩展模块__doc__字符串中找到 doctest。 (由 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 *关键字参数。指定后,关联的 Headers 将被更新,而不会更改其在 Headers 列表中的位置。为了向后兼容,默认值为False。 (由 R. David Murray 在bpo-18891中贡献。)

已添加了Pair新的Message子类(EmailMessageMIMEPart),以及新的子模块contentmanager和新的policy属性content_manager。当前所有文档都在新模块中,该模块将作为电子邮件新provisional API的一部分添加。这些类提供了许多新方法,这些方法使从电子邮件中提取内容并将内容插入到电子邮件中变得更加容易。有关详细信息,请参见contentmanager文档和email: Examples。这些 API 的添加完成了 email6 项目中计划的大部分工作。当前的临时 API 计划在 Python 3.5 中finally版本化(可能在错误处理方面做了一些小的补充)。 (由 R. David Murray 在bpo-18891中贡献。)

filecmp

新的clear_cache()函数提供了清除filecmp比较缓存的Function,该缓存使用os.stat()信息来确定文件自上次比较以来是否已更改。例如,如果文件更改和重新检查的时间少于特定文件系统的文件修改时间字段的解析时间,则可以使用此方法。 (由 Mark Levitt 在bpo-18149中贡献。)

新的模块属性DEFAULT_IGNORES提供了目录列表,这些目录用作dircmp()函数的* ignore *参数的默认值。 (由 Eli Bendersky 在bpo-15442中贡献。)

functools

新的partialmethod()Descriptors 将部分参数应用带到 Descriptors 中,就像partial()提供了正常的可调用对象一样。新的 Descriptors 还使包含在类定义中的任意可调用对象(包括partial()实例)的行为像普通实例方法一样容易。 (由 Alon Horev 和 Nick Coghlan 在bpo-4331中贡献。)

新的singledispatch()装饰器为 Python 标准库带来了对单调度通用函数的支持。面向对象编程着重于将一组通用数据上的多个操作分组到一个类中,而泛型函数着重于将一个操作的多个实现分组,以使其能够处理不同类型的数据。

See also

  • PEP 443 –单次派发通用Function

  • PEP 由ŁukaszLanga 编写和实施。

total_ordering()现在支持基础比较函数的返回值NotImplemented。 (由 Katie Miller 在bpo-10042中贡献。)

现在,stdlib 中具有partial()函数的纯 Python 版本;在 CPython 中,它被 C 加速版本覆盖,但可供其他实现使用。 (由 Brian Thorne 在bpo-12428中贡献。)

gc

新函数get_stats()返回自解释器启动以来包含收集统计信息的三个每代词典的列表。 (由bpo-16351中的 Antoine Pitrou 提供。)

glob

新Functionescape()提供了一种对文件名中的特殊字符进行转义的方法,以使它们不成为全局扩展的一部分,而是按字面值进行匹配。 (由 Serhiy Storchaka 在bpo-8402中贡献。)

hashlib

新的hashlib.pbkdf2_hmac()函数提供了PKCS#5 基于密码的密钥派生Function 2。 (由 Chris Heimes 在bpo-18582中贡献。)

hashlib哈希对象的name属性现在是正式支持的接口。它一直存在于 CPython 的hashlib中(尽管它没有为所有受支持的哈希返回小写字母名称),但是它不是公共接口,因此其他一些 Python 实现以前也不支持它。 (由 Jason R. Coombs 在bpo-18532中贡献。)

hmac

hmac现在接受bytearray以及bytes作为new()函数的* key 参数,并且new()函数和update()方法的 msg *参数现在接受hashlib模块支持的任何类型。 (由 JonasBorgström 在bpo-18240中贡献。)

hmac.new()函数的* digestmod 参数现在可以是hashlib识别的任何哈希摘要名称。此外,不建议使用 digestmod *的默认值为MD5的当前行为:在将来的 Python 版本中,将没有默认值。 (由 Chris Heimes 在bpo-17276中贡献。)

pass添加block_sizename属性(以及digest_size属性的正式文档),hmac模块现在完全符合 PEP 247 API。 (由 Chris Heimes 在bpo-18775中贡献。)

html

新函数unescape()函数将 HTML5 字符引用转换为相应的 Unicode 字符。 (由 Ezio Melotti 在bpo-2927中贡献。)

HTMLParser接受一个新的关键字参数* convert_charrefs *,当True时,该参数自动转换所有字符引用。为了实现向后兼容,其值默认为False,但在将来的 Python 版本中它将更改为True,因此,请您明确设置它并更新代码以使用此新Function。 (由 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 帮助”‣“关于 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中贡献。)

reload()Function已从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模块中的同名Function。 (由 Brett Cannon 在bpo-18194中贡献。)

importlib引导程序NamespaceLoader现在符合InspectLoader ABC,这意味着runpypython -m现在可以与名称空间包一起使用。 (由 Brett Cannon 在bpo-18058中贡献。)

importlib.util具有新Functiondecode_source(),该函数使用通用换行处理从字节中解码源。这对于实现InspectLoader.get_source()方法很有用。

importlib.machinery.ExtensionFileLoader现在具有get_filename()方法。在原始实现中无意中忽略了这一点。 (由bpo-19152中的 Eric Snow 提供。)

inspect

inspect模块现在提供了一个基本的命令行界面,可快速显示模块,类和Function的源代码和其他信息。 (由 Claudiu Popa 和 Nick Coghlan 在bpo-18626中贡献。)

unwrap()使解开functools.wraps()(以及在包装函数上设置__wrapped__属性的任何其他 API)创建的包装函数链变得容易。 (由bpo-13266由 Daniel Urban,Aaron Iles 和 Nick Coghlan 贡献。)

作为新的enum模块的实现的一部分,inspect模块现在对自定义__dir__方法和pass元类提供的动态类属性提供了更好的支持。 (由 Ethan Furman 在bpo-18929bpo-19030中贡献。)

getfullargspec()getargspec()现在使用signature() API。这使它们能够支持范围更广的可调用对象,包括具有__signature__属性的可调用对象,具有自变量诊所提供的元数据的functools.partial()对象等。请注意,与signature()不同,这些函数仍然忽略__wrapped__属性,并报告已绑定方法的已绑定第一个参数,因此,如果需要这些Function,则仍然有必要更新代码以直接使用signature()。 (由 Yury Selivanov 在bpo-17481中贡献。)

signature()现在支持鸭子类型的 CPython 函数,从而增加了对用 Cython 编译的函数的支持。 (由 Stefan Behnel 和 Yury Selivanov 在bpo-17159中贡献。)

ipaddress

ipaddress作为provisional API添加到 Python 3.3 的标准库中。在 Python 3.4 发行版中,取消了此限定条件:ipaddress现在被认为是稳定的 API,正常的标准库要求已涵盖了ipaddress,以保持向后兼容性。

如果地址可全局路由,则新的is_global属性为True。 (由 Peter Moody 在bpo-17400中贡献。)

logging

TimedRotatingFileHandler有一个新的* atTime *参数,该参数可用于指定应该发生过渡的一天中的时间。 (由 Ronald Oussoren 在bpo-9556中贡献。)

SocketHandlerDatagramHandler现在支持 Unix 域套接字(pass将* port *设置为None)。 (由 Vinay Sajip 在 commit ce46195b56a9 中贡献.)

fileConfig()现在接受* fname *参数的configparser.RawConfigParser子类实例。当日志记录配置只是整个应用程序配置的一部分时,或者在应用程序将配置传递给fileConfig()之前修改配置时,这有助于使用配置文件。 (由 Vinay Sajip 在bpo-16110中贡献。)

现在可以pass提供验证Function作为新的* verify *关键字参数的参数来验证passlogging.config.listen()函数从套接字接收的日志配置数据,然后进行处理。 (由 Vinay Sajip 在bpo-15452中贡献。)

marshal

默认的marshal版本已更改为 3.实现新版本的代码恢复了 Python2 的行为,即仅记录一个实习字符串的副本并保留反序列化的实习,并将这种“一个副本”的Function扩展到任何对象类型(包括处理)递归引用)。这样既可以减小.pyc文件的大小,又可以减小从.pyc(或.pyo)文件加载模块时模块在内存中占用的内存量。 (由bpo-16475中的 KristjánValurJónsson 贡献,以及bpo-19219中的 Antoine Pitrou 加快了速度。)

mmap

mmap 对象现在可以weakref ed。 (由 Valerie Lambert 在bpo-4885中贡献。)

multiprocessing

在 Unix 上,添加了两个新的start methods spawnforkserver,用于使用multiprocessing启动进程。这些使进程与线程的混合更加可靠,并且spawn方法与 multiprocessing 在 Windows 上始终使用的语义相匹配。新Functionget_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 * start 方法,否则子进程不再从其父级(bpo-8713的一部分)继承不需要的句柄/文件 Descriptors。

multiprocessing现在依靠runpy(实现-m开关)在使用spawnforkserver启动方法时在子进程中适当地初始化__main__。这解决了一些边缘情况,在这些情况下,将 multiprocessing,-m命令行开关和显式相对导入结合使用可能会在子进程中造成模糊的故障。 (由 Nick Coghlan 在bpo-19946中贡献。)

operator

新Functionlength_hint()提供了有关如何使用length_hint()特殊方法的规范的实现,作为该语言Function的 PEP 424正式规范的一部分。 (由 Armin Ronacher 在bpo-16148中贡献。)

现在有operator模块的纯 Python 版本供参考,并可供 Python 的其他实现使用。 (由 Zachary Ware 在bpo-16694中贡献。)

os

有一些新Function可以获取和设置文件 Descriptors 的inheritable flag(os.get_inheritable()os.set_inheritable())或 Windows 句柄(os.get_handle_inheritable()os.set_handle_inheritable())。

新Functioncpu_count()报告运行 Python 的平台上可用的 CPU 数量(如果无法确定计数,则返回None)。现在就此Function实现了multiprocessing.cpu_count()Function)。 (由bpo-17914中的 Trent Nelson,Yogesh Chaudhari,Victor Stinner 和 Charles-FrançoisNatali 贡献。)

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(未打开的文件 Descriptors)和O_TMPFILE(未命名的临时文件;从 3.4.0 版开始)仅在内核版本为 3.11 或更高版本且具有 uapiHeaders 的 Linux 系统上可用)。 (分别由bpo-18673和本杰明·彼得森的 Christian Heimes 贡献。)

pdb

pdb已增强,可以更有用的方式处理生成器yieldyield from。这在调试基于asyncio的程序时特别有用。 (由bpo-16596由 Andrew Svetlov 和 Xavier de Gaye 贡献。)

print命令已从pdb中删除,恢复了从 pdb 命令行对 Python print()函数的访问。 Python2 的pdb没有print命令;相反,Importingprint会执行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()方法采用仅关键字参数。它还提供了一些效率改进。

See also

  • 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()stls(),它们返回 POP 服务器通告的Function列表,而stls()将明文 POP3 会话切换为加密的 POP3 会话(如果 POP 服务器支持)。 (由 Lorenzo Catucci 在bpo-4473中贡献。)

pprint

pprint模块的PrettyPrinter类及其pformat()pprint()函数具有一个新选项* compact ,它控制如何格式化输出。当前将 compact 设置为True意味着序列将以与每行(缩进)的 width *一样多的序列元素进行打印。 (由 Serhiy Storchaka 在bpo-19132中贡献。)

现在,长字符串使用 Python 的常规行连续语法进行包装。 (由bpo-17150中的 Antoine Pitrou 提供。)

pty

pty.spawn()现在在子进程上从os.waitpid()而不是None返回状态值。 (由格雷戈里·史密斯(Gregory P. Smith)提供。)

pydoc

现在,pydoc模块直接基于inspect.signature()内省 API,从而可以为更多可调用对象提供签名信息。此更改还意味着现在在显示帮助信息时会考虑__wrapped__属性。 (由bpo-19674中的 Larry Hastings 贡献。)

对于已绑定的方法,pydoc模块不再显示self参数。相反,它旨在始终显示提供的可调用对象的确切当前签名。 (由 Larry Hastings 在bpo-20710中贡献。)

除了直接对pydoc进行的更改之外,inspect模块中的基础更改也大大改善了其对自定义__dir__方法的处理方式和各种 Descriptors 行为。

由于help()内置基于pydoc,因此上述更改也影响help()的行为。

re

新的fullmatch()函数和regex.fullmatch()方法将模式固定在字符串的两端以进行匹配。这提供了一种明确显示匹配目标的方法,避免了一类细微的错误,在这些错误中$字符在代码更改或向现有正则表达式添加替代项时丢失。 (由 Matthew Barnett 在bpo-16203中贡献。)

regex objects的代表现在包含模式和标志; match objects的代表现在包括字符串的开始,结尾和匹配的部分。 (由 Hugo Lopes Tavares 和 Serhiy Storchaka 在bpo-13592bpo-17087中贡献。)

resource

新的prlimit()函数在内核版本为 2.6.36 或更高版本以及 glibc 为 2.13 或更高版本的 Linux 平台上可用,提供了查询或设置进程的资源限制的Function,而不是进行调用的进程。 (由 Christian Heimes 在bpo-16595中贡献。)

在 Linux 内核 2.6.36 或更高版本上,还有一些新的 Linux 特定常量:RLIMIT_MSGQUEUERLIMIT_NICERLIMIT_RTPRIORLIMIT_RTTIMERLIMIT_SIGPENDING。 (由 Chris Heimes 在bpo-19324中贡献。)

在 FreeBSD 版本 9 和更高版本上,有一些特定于 FreeBSD 的新常量:RLIMIT_SBSIZERLIMIT_SWAPRLIMIT_NPTS。 (由 Claudiu Popa 在bpo-19343中贡献。)

select

epoll对象现在支持上下文 Management 协议。在with语句中使用时,close()方法将在块的末尾自动调用。 (由 Serhiy Storchaka 在bpo-16488中贡献。)

devpoll个对象现在具有fileno()close()方法,以及新的属性closed。 (由 Victor Stinner 在bpo-18794中贡献。)

shelve

Shelf实例现在可以在with语句中使用,并将在with块的末尾自动关闭。 (由 FilipGruszczyński 在bpo-13896中贡献。)

shutil

现在,当源和目标是同一文件时,copyfile()会引发一个特定的Error子类SameFileError,这使应用程序可以对此特定错误采取适当的措施。 (由 Atsuo Ishimoto 和 Hynek Schlawack 在bpo-1492704中贡献。)

smtpd

SMTPServerSMTPChannel类现在接受一个* map 关键字参数,如果指定了该参数,则将其作为 map *参数传递给asynchat.async_chat。这使应用程序可以避免影响全局套接字 Map。 (由 Vinay Sajip 在bpo-11959中贡献。)

smtplib

SMTPException现在是OSError的子类,该子类允许套接字级别的错误和 SMTP 协议级别的错误都pass仅关注是否发生错误的代码在一条 try/except 语句中捕获。 (由 Ned Jackson Lovely 在bpo-2118中贡献。)

socket

套接字模块现在在支持它的平台上支持CAN_BCM协议。 (由 Brian Thorne 在bpo-15359中贡献。)

套接字对象具有获取或设置其inheritable flagget_inheritable()set_inheritable()的新方法。

socket.AF_*socket.SOCK_*常量现在是使用新的enum模块的枚举值。这允许在调试过程中打印有意义的名称,而不是整数“魔术数字”。

AF_LINK常量现在在 BSD 和 OSX 上可用。

Windows 现在支持inet_pton()inet_ntop()。 (由bpo-7171贡献于石本厚雄。)

sqlite3

connect()函数的新布尔参数* uri 可以用来指示 database *参数是uri(请参见SQLite URI 文档)。 (由bpo-13773中的 poq 贡献。)

ssl

已添加PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2(支持 TLSv1.1 和 TLSv1.2);仅当 Python 与 OpenSSL 1.0.1 或更高版本链接时,才对这些协议提供支持。 (由bpo-16692由 MicheleOrrù和 Antoine Pitrou 提供。)

新Functioncreate_default_context()提供了获取SSLContext的标准方法,其设置旨在在兼容性和安全性之间取得合理的平衡。这些设置比SSLContext构造函数提供的默认设置更严格,并且如果最佳实践安全要求发生更改,则可以在以后进行调整而无需事先弃用。使用支持 SSL 的 stdlib 库的建议的新最佳实践是使用create_default_context()获取SSLContext对象,如果需要对其进行修改,然后将其作为适当的 stdlib API 的* context *参数传递。 (由 Chris Heimes 在bpo-19689中贡献。)

SSLContext方法load_verify_locations()接受一个新的可选参数* cadata *,该参数可以分别用于直接pass字符串或字节提供 PEM 或 DER 编码的证书。 (由 Chris Heimes 在bpo-18138中贡献。)

新函数get_default_verify_paths()返回set_default_verify_paths()方法用于设置 OpenSSL 的默认cafilecapath的路径和环境变量的命名 Tuples。这可以帮助调试默认验证问题。 (由 Chris Heimes 在bpo-18143中贡献。)

SSLContext有一个新方法cert_store_stats(),它报告已加载的X.509证书,X.509 CA证书和证书吊销列表(crl)的数量,以及get_ca_certs()方法,该方法返回已加载的CA证书的列表。 (由 Chris Heimes 在bpo-18147中贡献。)

如果 OpenSSL 0.9.8 或更高版本可用,则SSLContext具有新属性verify_flags,该属性可以pass将其设置为新常量VERIFY_DEFAULTVERIFY_CRL_CHECK_LEAFVERIFY_CRL_CHECK_CHAINVERIFY_X509_STRICT的某种组合来控制证书验证过程。默认情况下,OpenSSL 不执行任何 CRL 验证。 (由克里斯蒂安·海姆斯在bpo-8813中贡献。)

新的SSLContext方法load_default_certs()从默认位置加载一组默认的“证书颁发机构”(CA)证书,这些证书因平台而异。它既可以用于加载 TLS Web 服务器身份验证证书(purpose= SERVER_AUTH),以供 Client 端用来验证服务器,也可以用于服务器的证书来验证 Client 端证书(purpose= CLIENT_AUTH)。 (由 Chris Heimes 在bpo-19292中贡献。)

两种新的仅 Windows Functionenum_certificates()enum_crls()提供了从 Windows 证书存储中检索证书,证书信息和 CRL 的Function。 (由 Chris Heimes 在bpo-17134中贡献。)

使用新的ssl.SSLContext.set_servername_callback()方法支持服务器端 SNI(服务器名称指示)。 (由 Daniel Black 在bpo-8109中贡献。)

SSLSocket.getpeercert()返回的字典包含其他X509v3扩展项:crlDistributionPointscalIssuersOCSP URI。 (由 Christian Heimes 在bpo-18379中贡献。)

stat

stat模块现在由_stat中的 C 实现支持。由于大多数值未标准化且依赖于平台,因此需要 C 实现。 (由 Christian Heimes 在bpo-11016中贡献。)

该模块支持新的ST_MODE标志S_IFDOORS_IFPORTS_IFWHT。 (由 Christian Hiemes 在bpo-11016中贡献。)

struct

针对已编译格式的新Functioniter_unpack和新struct.Struct.iter_unpack()方法可对包含给定数据格式的重复实例的缓冲区进行流式解包。 (由bpo-17804中的 Antoine Pitrou 提供。)

subprocess

check_output()现在接受一个* input *参数,该参数可用于为运行的命令提供stdin的内容。 (由 Zack Weinberg 在bpo-16624中贡献。)

getstatus()getstatusoutput()现在可以在 Windows 上使用。实际上,此更改是在 3.3.4 中无意中进行的。 (由 Tim Golden 在bpo-10197中贡献。)

sunau

getparams()方法现在返回一个 namedtuple 而不是一个普通的 Tuples。 (由 Claudiu Popa 在bpo-18901中贡献。)

sunau.open()现在支持上下文 Management 协议:在with块中使用时,将在该块的末尾自动调用返回对象的close方法。 (由 Serhiy Storchaka 在bpo-18878中贡献。)

AU_write.setsampwidth()现在支持 24 位 samples,因此增加了使用该模块写入 24 个 samples 的支持。 (由 Serhiy Storchaka 在bpo-19261中贡献。)

writeframesraw()writeframes()方法现在接受任何bytes-like object。 (由 Serhiy Storchaka 在bpo-8311中贡献。)

sys

新函数sys.getallocatedblocks()返回解释器分配的当前块数。 (在具有默认--with-pymalloc设置的 CPython 中,这是passPyObject_Malloc() API 进行的分配。)这对于跟踪内存泄漏很有用,尤其是pass测试套件自动进行时。 (由bpo-13390中的 Antoine Pitrou 提供。)

当 Python 解释器以interactive mode开头时,它将检查sys模块上的interactivehook属性。如果属性存在,则在启动交互方式之前,将不带任何参数地调用其值。在读取 PYTHONSTARTUP文件之后进行检查,因此可以在此处进行设置。 site模块sets it到一个Function,如果平台支持readline,则该Function启用制表符完成和历史记录保存(在~/.python-history中)。如果您不希望这种(新的)行为,则可以pass从sys删除此属性(或将其设置为其他可调用属性)在 PYTHONSTARTUPsitecustomizeusercustomize中覆盖它。 (由bpo-5845中的ÉricAraujo 和 Antoine Pitrou 提供。)

tarfile

现在,直接或pass-m作为脚本调用时,tarfile模块支持简单的Command-Line Interface。这可用于创建和提取 tarfileFiles。 (由 Berker Peksag 在bpo-13477中贡献。)

textwrap

TextWrapper类具有两个新的属性/构造函数参数:max_lines(用于限制输出中的行数)和placeholder(用于在由于* max_lines 而被截断的情况下出现在输出末尾的字符串)。在这些Function的基础上,新的便利函数shorten()将 Importing 中的所有空白折叠为单个空格,并产生给定 width 的单行,以 placeholder *结尾(默认为[...])。 (由 Antoine Pitrou 和 Serhiy Storchaka 在bpo-18585bpo-18725中贡献。)

threading

可以从新的main_thread()函数获得代表主线程的Thread对象。在正常情况下,这将是启动 Python 解释器的线程。 (由 Andrew Svetlov 在bpo-18882中贡献。)

traceback

一个新的traceback.clear_frames()函数采用一个 traceback 对象,并清除其引用的所有帧中的局部变量,从而减少了内存消耗。 (由 Andrew Kuchling 在bpo-1565525中贡献。)

types

新的DynamicClassAttribute()Descriptors 提供了一种定义属性的方法,该属性在pass实例对象查找时可以正常工作,但是在pass类查找时将被路由到* class * __getattr__。这样一来,人们可以在一个类上具有活动的属性,并在该类上具有相同名称的虚拟属性(有关示例,请参见Enum)。 (由 Ethan Furman 在bpo-19030中贡献。)

urllib

urllib.request现在passDataHandler类支持data:个 URL。 (由 MathiasPanzenböck 在bpo-16423中贡献。)

现在,可以pass在子类上设置method class 属性来指定Request类将使用的 http 方法。 (由 Jason R Coombs 在bpo-18978中贡献。)

Request对象现在可重用:如果修改了full_urldata属性,则所有相关的内部属性都会更新。举例来说,这意味着现在可以在多个具有不同* data *参数的OpenerDirector.open()调用中使用同一个Request对象,或者修改Requesturl而不是从头开始重新计算它。还有一个新的remove_header()方法,可用于从Request删除 Headers。 (由bpo-16464中的 Alexey Kachayev,bpo-17485中的 Daniel Wozniak 和bpo-17272中的 Damien Brecht 和 Senthil Kumaran 贡献。)

HTTPError对象现在具有headers属性,该属性提供对与错误关联的 HTTP 响应 Headers 的访问。 (由 Berker Peksag 在bpo-15701中贡献。)

unittest

TestCase类具有一个新方法subTest(),该方法产生一个上下文 Management 器,该上下文 Management 器的with块成为“子测试”。该上下文 Management 器允许测试方法pass在循环内调用subTest上下文 Management 器来动态生成子测试。因此,一种测试方法可以生成不确定数量的单独标识和单独计数的测试,即使其中一个或多个失败,所有这些测试都可以运行。例如:

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

将导致六个子测试,每个子测试在单元测试的详细输出中标识,带有由变量名i和该变量的特定值(i=0i=1等)组成的标签。有关此示例的完整版本,请参见使用子测试区分测试迭代。 (由bpo-16997中的 Antoine Pitrou 提供。)

unittest.main()现在接受* defaultTest *的测试名称的可迭代项,以前它仅接受单个测试名称作为字符串。 (由 Jyrki Pulliainen 在bpo-15132中贡献。)

如果在测试发现期间(即在测试文件中的模块级别)引发SkipTest,则现在将其报告为跳过而不是错误。 (由 Zach Ware 在bpo-16935中贡献。)

discover()现在对发现的文件进行排序,以提供一致的测试 Sequences。 (由 Martin Melin 和 Jeff Ramnani 在bpo-16709中贡献。)

如果测试成功,TestSuite现在会立即删除对测试的引用。在进行垃圾回收的 Python 解释器上,如果没有其他东西持有对该测试的引用,则可以对测试进行垃圾回收。pass创建定义自定义_removeTestAtIndex方法的TestSuite子类,可以覆盖此行为。 (由 Tom Wardill,Matt McClure 和 Andrew Svetlov 在bpo-11798中贡献。)

新的测试 assert 上下文 Management 器assertLogs()将确保给定的代码块使用logging模块发出日志消息。默认情况下,该消息可以来自任何 Logger,并且优先级为INFO或更高,但是可以同时指定 Logger 名称和其他最低记录级别。可以查询上下文 Management 器返回的对象以获取LogRecord和/或已记录的格式化消息。 (由bpo-18937中的 Antoine Pitrou 提供。)

现在,测试发现可与名称空间包一起使用(由bpo-17457中的 Claudiu Popa 提供。)

unittest.mock对象现在在匹配调用时检查其规范签名,这意味着参数现在可以按位置或名称进行匹配,而不仅可以按位置进行匹配。 (由bpo-17015中的 Antoine Pitrou 提供。)

mock_open()个对象现在具有readlinereadlines方法。 (由 Kuratomi Toshio 在bpo-17467中贡献。)

venv

venv现在包括cshfish Shell 的激活脚本。 (由 Andrew Svetlov 在bpo-15417中贡献。)

EnvBuildercreate()便利函数采用新的关键字参数* with_pip *,默认为False,该参数控制EnvBuilder是否确保pip已安装在虚拟环境中。 (由 Nick Coghlan 在bpo-19552中作为 PEP 453实现的一部分提供。)

wave

getparams()方法现在返回一个 namedtuple 而不是一个普通的 Tuples。 (由 Claudiu Popa 在bpo-17487中贡献。)

wave.open()现在支持上下文 Management 协议。 (由 Claudiu Popa 在bpo-17616中贡献。)

wave现在可以将输出写入无法查找的文件了。 (由 David Jones,Guilherme Polo 和 Serhiy Storchaka 在bpo-5202中贡献。)

writeframesraw()writeframes()方法现在接受任何bytes-like object。 (由 Serhiy Storchaka 在bpo-8311中贡献。)

weakref

新的WeakMethod类模拟对绑定方法的弱引用。 (由bpo-14631中的 Antoine Pitrou 提供。)

新的finalize类使注册垃圾回收对象时要调用的回调成为可能,而无需仔细 Management 弱引用本身的生命周期。 (由 Richard Oudkerk 在bpo-15528中贡献。)

ref关联的回调(如果有的话)现在passcallback属性公开。 (由 Mark Dickinson 在bpo-17643中贡献。)

xml.etree

新的解析器XMLPullParser允许非阻塞应用程序解析 XML 文档。可以在拉取 API 进行非阻塞解析查看示例。 (由bpo-17741中的 Antoine Pitrou 提供。)

xml.etree.ElementTree tostring()tostringlist()函数以及ElementTree write()方法现在具有* short_empty_elements * keyword-only parameter,可以控制不包含任何内容的元素是缩写形式(<tag />)还是扩展形式(<tag></tag>)。 (由bpo-14377由 Ariel Poliak 和 Serhiy Storchaka 提供。)

zipfile

PyZipFile类的writepy()方法具有一个新的* filterfunc *选项,可用于控制将哪些目录和文件添加到存档中。例如,这可用于从存档中排除测试文件。 (由 Christian Tismer 在bpo-19274中贡献。)

默认情况下,ZipFilePyZipfile的* allowZip64 *参数现在为True。 (由 William Mallard 在bpo-17201中贡献。)

CPython 实现更改

PEP 445:自定义 CPython 内存分配器

PEP 445添加了新的 C 级接口,以自定义 CPython 解释器中的内存分配。

See also

  • PEP 445 –添加新的 API 以自定义 Python 内存分配器

  • PEP 由 Victor Stinner 编写和实施。

PEP 442:安全对象完成

PEP 442消除了 CPython 中对象完成的当前限制和怪癖。有了它,可以将带有del()方法的对象以及带有finally子句的生成器作为参考循环的一部分来完成。

作为此更改的一部分,在大多数情况下,在解释器关闭期间,不再将模块全局变量强制设置为None,而是依靠循环垃圾收集器的正常操作。这避免了一整类解释器关闭时错误,通常涉及__del__方法,这些错误自从首次引入循环 GC 以来就困扰着 Python。

See also

  • PEP 442 –安全对象完成

  • PEP 由 Antoine Pitrou 编写和实施。

PEP 456:安全且可互换的哈希算法

PEP 456跟进了对 Python 哈希算法所做的早期安全修复工作,以解决某些 DOS 攻击,而这些攻击可能受到字典查找支持的面向公众的 API 的攻击。 (有关本轮改进的开始,请参阅bpo-14621。)PEP 统一了 CPython 的哈希码,以使打包程序更容易替换其他哈希算法,并在具有 64 位的平台上将 Python 的默认实现切换为 SipHash 实现。数据类型。与旧版 FNV 算法相比,任何性能差异都是微不足道的。

PEP 向名为sys.hash_info的 Tuples 添加其他字段,以描述当前执行的二进制文件正在使用的哈希算法。否则,PEP 不会更改任何现有的 CPython API。

PEP 436:Arguments 诊所

“ Argument Clinic”( PEP 436)现在是 CPython 构建过程的一部分,可用于简化为用 C 实现的内建程序和标准库扩展模块定义和维护准确签名的过程。

一些标准库扩展模块已转换为在 Python 3.4 中使用 Argument Clinic,并且pydocinspect已相应更新。

可以预期,作为 Python 3.4 维护版本的一部分,用于程序自省的签名元数据将添加到用 C 实现的其他可调用项中。

Note

Argument Clinic PEP 尚未完全了解实施状态。在这种情况下,发布 Manager 和核心开发团队认为这是可以接受的,因为 Argument Clinic 将不会作为公共 API 提供给 Python 3.4 中的第三方使用。

See also

  • PEP 436 –论点诊所 DSL

  • PEP 由 Larry Hastings 编写和实施。

其他内部版本和 C API 的更改

  • 新的PyType_GetSlot()函数已添加到稳定的 ABI 中,允许在使用受限 API 时从命名类型槽检索函数指针。 (由 Martin vonLöwis 在bpo-17162中贡献。)

  • 新的Py_SetStandardStreamEncoding()预初始化 API 允许嵌入 CPython 解释器的应用程序为标准流可靠地强制执行特定的编码和错误处理程序。 (由 Bastien Montagne 和 Nick Coghlan 在bpo-16129中贡献。)

  • 现在,大多数不更改字符串参数的 Python C API 都已正确标记为接受const char *而不是char *。 (由 Serhiy Storchaka 在bpo-1772673中贡献。)

  • 即使没有 python 解释器(例如,在交叉编译方案中),也可以使用新的python-config shell 版本。

  • PyUnicode_FromFormat()现在支持%s%A%U%V%S%R的宽度和精度规格。 (由 Ysj Ray 和 Victor Stinner 在bpo-7330中贡献。)

  • 新FunctionPyStructSequence_InitType2()对现有的PyStructSequence_InitType()Function进行了补充。区别在于,成功返回0,失败返回-1

  • 现在可以使用最新版本的 GCC 和 clang 的地址完整性检查Function来编译 CPython 源:小型对象分配器中的错误警报已被静音。 (由 Dhiru Kholia 在bpo-18596中贡献。)

  • Windows 版本现在使用地址空间布局随机化数据执行保护。 (由 Chris Heimes 在bpo-16632中贡献。)

  • 新FunctionPyObject_LengthHint()operator.length_hint()等效。 (由 Armin Ronacher 在bpo-16148中贡献。)

Other Improvements

  • python命令具有一个新的option -I,这使其以“隔离模式”运行,这意味着sys.path既不包含脚本的目录也不包含用户的site-packages目录,并且所有 PYTHON*环境变量都将被忽略(这意味着-s-E)。将来也可能会应用其他限制,目的是将脚本的执行与用户环境隔离开。例如,当使用 Python 运行系统脚本时,这是适当的。在大多数 POSIX 系统上,可以并且应该在系统脚本的#!行中使用它。 (由 Chris Heimes 在bpo-16499中贡献。)

  • 现在,在支持readline的系统上,默认情况下在交互式解释器中启用了制表符完成Function。默认情况下,历史记录也是启用的,并且会写入~/.python-history(和从中读取)。 (由bpo-5845中的 Antoine Pitrou 和ÉricAraujo 贡献。)

  • 现在,使用--version调用 Python 解释器会将版本输出到标准输出,而不是标准错误(bpo-18338)。对argparse(bpo-18920)和其他具有脚本调用Function(bpo-18922)的其他模块进行了类似的更改。

  • 现在,CPython Windows 安装程序会在注册 extensions 时将.py添加到 PATHEXT变量中,从而允许用户pass在 Windows 命令提示符下键入不带.pyextensions 的名称来运行 python 脚本。 (由 Paul Moore 在bpo-18569中贡献。)

  • 新的make目标coverage-report将构建 python,运行测试套件,并使用gcovlcov为 C 代码库生成 HTML 覆盖率报告。

  • python 回归测试套件-R选项现在也使用sys.getallocatedblocks()检查内存分配泄漏。 (由bpo-13390中的 Antoine Pitrou 提供。)

  • python -m现在可用于名称空间包。

  • stat模块现在用 C 实现,这意味着它从 C 头文件中获取其常量的值,而不是像以前那样在 python 模块中对其进行硬编码。

  • 现在,可以从单个 OS 模块(.so.dll)加载多个 python 模块正常工作(以前,它以静默方式返回了文件中的第一个 python 模块)。 (由 VáclavŠmilauer 在bpo-16421中贡献。)

  • 添加了一个新的操作码LOAD_CLASSDEREF,以修复可能由prepare的某些使用触发的在类体中加载自由变量的错误。 (由本杰明·彼得森在bpo-17853中贡献。)

  • Victor Stinner 使用基于 PEP 445pyfailmalloc工具(bpo-18408bpo-18520)识别并修复了许多与 MemoryError 相关的崩溃。

  • pyvenv命令现在接受--copies选项以使用副本而不是符号链接,即使在默认情况下符号链接的系统上也是如此。 (由 Vinay Sajip 在bpo-18807中贡献。)

  • pyvenv命令还接受--without-pip选项,以禁止将 pip 自动引导到虚拟环境中。 (由 PEP 453实现的一部分,由尼克·科兰(Nick Coghlan)在bpo-19552中贡献。)

  • 现在,在为 PYTHONIOENCODING环境变量设置的值中,编码名称是可选的。这样就可以仅设置错误处理程序,而无需更改默认编码。 (由 Serhiy Storchaka 在bpo-18818中贡献。)

  • bz2lzmagzip模块openFunction现在支持x(独占创建)模式。 (由 Tim Heaney 和 Vajrasky Kok 在bpo-19201bpo-19222bpo-19223中贡献。)

Significant Optimizations

  • UTF-32 解码器现在快了 3 到 4 倍。 (由 Serhiy Storchaka 在bpo-14625中贡献。)

  • 集的哈希冲突的成本现在降低了。现在,每个哈希表探针都将检查一系列连续的,相邻的键/哈希对,然后 continue 对哈希表进行随机探针。这样可以利用缓存局部性来降低冲突解决的成本。可以将冲突解决方案描述为线性探测和开放式寻址的混合。附加线性探头的数量默认为九。pass将 LINEAR_PROBES 定义为任何值,可以在编译时更改此值。设置 LINEAR_PROBES = 0 可以完全关闭线性探测。 (由 Raymond Hettinger 在bpo-18771中贡献。)

  • Interpreter 的启动速度提高了约 30%。采取了一些措施来加快速度。解释程序在启动时会加载较少的模块,例如默认情况下,不再导入recollectionslocale模块及其依赖项。改进了 marshal 模块,以更快地加载编译的 Python 代码。 (由 Antoine Pitrou,Christian Heimes 和 Victor Stinner 在bpo-19219bpo-19218bpo-19209bpo-19205bpo-9548中贡献。)

  • 在大多数情况下,bz2.BZ2File现在比 Python2 版本快或快。 lzma.LZMAFile也已优化。 (由 Serhiy Storchaka 和 Nadeem Vawda 在bpo-16034中贡献。)

  • 小整数(最常见的用例)的random.getrandbits()快 20%-40%。 (由 Serhiy Storchaka 在bpo-16674中贡献。)

  • pass利用新的字符串存储格式,字符串的 Pickling 现在大大加快了。 (由 Victor Stinner 和 Antoine Pitrou 在bpo-15596中贡献。)

  • io.FileIO.readall()中的性能问题已解决。这尤其会影响 Windows,并显着加快了passsubprocess传递大量数据的情况。 (由 Richard Oudkerk 在bpo-15758中贡献。)

  • html.escape()现在快了 10 倍。 (由 Matt 布莱恩特在bpo-18020中贡献。)

  • 在 Windows 上,现在使用本机VirtualAlloc代替obmalloc中的 CRT malloc。人工基准测试显示大约可节省 3%的内存。

  • os.urandom()现在使用延迟打开的持久文件 Descriptors,以避免在从多个线程并行运行时避免使用许多文件 Descriptors。 (由bpo-18756中的 Antoine Pitrou 提供。)

Deprecated

本节介绍了 Python 3.4 中已弃用的各种 API 和其他Function,并将在 Python 3.5 或更高版本中将其删除。在大多数(但不是全部)情况下,如果在启用了弃用警告的情况下运行解释器(例如,使用-Wd),则使用弃用的 API 会产生DeprecationWarning

Python API 中的弃用

Deprecated Features

  • 不推荐使用带有-n标志运行IDLE(没有子进程)。但是,除非解决了bpo-18823,否则不会删除该Function。

  • 不建议在 sys.path 中添加“ site-python”目录的站点模块(如果存在)(bpo-19375)。

Removed

不再支持的 os

从源代码和构建工具中删除了对以下 os 的支持:

API 和Function删除

已删除以下过时且先前不推荐使用的 API 和Function:

  • 不需要维护的Misc/TextMateMisc/vim目录已删除(有关替代方法的建议,请参见devguide)。

  • 删除了SO makefile 宏(已被SHLIB_SUFFIXEXT_SUFFIX宏替换)(bpo-16754)。

  • PyThreadState.tick_counter字段已删除;自 Python 3.2 引入“新 GIL”(bpo-19199)以来,其值就毫无意义。

  • PyLoaderPyPycLoader已从importlib中删除。 (由 Taras Lyapun 在bpo-15641中贡献。)

  • HTTPConnectionHTTPSConnection的* strict *参数已删除。不再支持 HTTP 0.9 样式的“简单响应”。

  • 已弃用的urllib.request.Request getter 和 setter 方法add_datahas_dataget_dataget_typeget_hostget_selectorset_proxyget_origin_req_hostis_unverifiable(改为使用直接属性访问)。

  • marshal中删除了对加载已弃用的TYPE_INT64的支持。 (由 Dan Riti 在bpo-15480中贡献。)

  • inspect.Signature:现在仅位置参数必须具有有效名称。

  • object.format()不再接受非空格式的字符串,现在改为引发TypeError。从 Python 3.2 开始不推荐使用非空字符串。进行此更改是为了防止以前的工作(但不正确)的代码在对象获得__format_方法的情况下开始失败的情况,这意味着如果您将's'格式的代码与对象一起使用,则代码现在可能会引发TypeError没有处理它的__format_方法。有关背景,请参见bpo-7994

  • difflib.SequenceMatcher.isbjunk()difflib.SequenceMatcher.isbpopular()在 3.2 中已弃用,现在已被删除:使用x in sm.bjunkx in sm.bpopular,其中* sm *是SequenceMatcher对象(bpo-13248)。

Code Cleanups

  • 未使用且未记录的内部Scanner类已从pydoc模块中删除。

  • 专用的有效未使用的_gestalt模块以及专用的platform函数_mac_ver_lookup_mac_ver_gstalt_bcd2str已被删除,只有在严重损坏的 OSX 系统上才可以调用它们(请参阅bpo-18393)。

  • tarfile模块名称空间中包含的某些stat常量的硬编码副本已被删除。

移植到 Python 3.4

本节列出了先前描述的更改以及可能需要对代码进行更改的其他错误修正。

'python'命令行为的更改

  • 在 posix shell 中,将 PATH环境变量设置为空值等同于根本不设置它。但是,将 PYTHONPATH设置为空值并不等于根本不设置:将 PYTHONPATH设置为空值等同于将其设置为.,这在以类似方式推理 PATH时会引起混淆。现在,该行为符合 PATH的 posix 约定。

  • 默认情况下,CPython 解释器的调试(--with-pydebug)构建的[X refs,Y blocks]输出现已关闭。可以使用-X showrefcount选项重新启用它。 (由 Ezio Melotti 在bpo-17323中贡献。)

  • python 命令和大多数 stdlib 脚本(以及argparse)现在将--version信息输出到stdout而不是stderr(有关问题列表,请参见上面的Other Improvements)。

Python API 中的更改

  • 现在,在importlib.abc中定义的 ABC 引发适当的异常或返回默认值,而不是盲目地提出NotImplementedError。这只会影响调用super()并一直到达 ABC 的代码。为了兼容,请根据需要捕获NotImplementedError或适当的异常。

  • 现在,模块类型默认将packageloader属性初始化为None。要确定是否以向后兼容的方式设置这些属性,请使用例如getattr(module, '__loader__', None) is not None。 (bpo-17115。)

  • importlib.util.module_for_loader()现在无条件设置__loader____package__以正确支持重新加载。如果不希望这样做,则需要手动设置这些属性。您可以使用importlib.util.module_to_load()进行模块 Management。

  • 现在,导入会在重新加载时无条件重置相关属性(例如__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。这是为了警告,无论原始文件的文件路径类型如何,导入都将使用常规文件覆盖这些文件。

  • 当正在加载的源代码触发SyntaxErrorUnicodeDecodeError时,importlib.abc.SourceLoader.get_source()不再引发ImportError。因为ImportError仅在找不到源代码时才被提出,但应该被提出,所以当找到源代码但结构不正确时,它被认为是超出/超载了该含义。如果您之前遇到过 ImportError 并希望 continue 忽略语法或解码问题,请立即捕获所有这三个异常。

  • 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__,当脚本已使用相对路径直接执行脚本时除外)(由bpo-18416的 Brett Cannon 提供)。在命令行上指定)(bpo-18416)。

  • 如果要在位置而不是pass关键字指定其余参数,则删除HTTPConnectionHTTPSConnection的* strict *参数会更改其余参数的含义。如果您一直在关注弃用警告,则您的代码应该已经pass关键字指定了任何其他参数。

  • from __future__ import ...语句之间的字符串现在(总是)引发SyntaxError。以前,如果没有前导文档字符串,则插页式字符串有时会被忽略。这使 CPython 符合语言规范。 Jython 和 PyPy 已经存在。 (bpo-17434)。

  • 现在,当未连接SSLSocket时,ssl.SSLSocket.getpeercert()ssl.SSLSocket.do_handshake()ENOTCONN一起引发OSError,而不是以前的AttributeError引发行为。此外,如果握手尚未完成,getpeercert()将引发ValueError

  • 现在,当 Importing 字符串包含非 b32 字母字符而不是TypeError时,base64.b32decode()引发binascii.Error。转换其他TypeError时,错过了该特定的TypeError。 (由 Serhiy Storchaka 在bpo-18011中贡献。)注意:Python 3.3.3. 中也无意中应用了此更改。

  • 现在,当创建的cgi.FieldStorage实例被垃圾回收时,file属性将自动关闭。如果要从cgi.FieldStorage实例中单独拉出文件对象并且不使该实例保持活动状态,则应该存储整个cgi.FieldStorage实例,或者在cgi.FieldStorage实例被垃圾回收之前读取文件的内容。

  • 现在,在封闭的 SSL 套接字上调用readwrite会生成信息丰富的ValueError,而不是先前更为神秘的AttributeError(bpo-9177)。

  • slice.indices()不再为巨大的值产生OverflowError。由于此修复,如果给定的长度为slice.indices(),则现在提高ValueError。以前它返回废话值(bpo-14794)。

  • 如果对象的__complex__特殊方法返回complex构造函数,则complex构造函数与cmath函数不同,它错误地接受float值。现在将引发TypeError。 (bpo-16290。)

  • 3.2 和 3.3 中的int构造函数错误地接受了* _base *参数的float值。不太可能有人这样做,但是如果是这样,它将现在引发TypeError(bpo-16772)。

  • 现在,仅关键字参数的默认值将在之后常规关键字参数的默认值而不是之前。希望没有人编写任何依赖于先前的越野车行为(bpo-16967)的代码。

  • 现在,在fork()之后清除了过时的线程状态。这可能会导致释放以前错误地永久保持活动状态的某些系统资源(例如,数据库连接保留在线程本地存储中)。 (bpo-17094。)

  • __kwdefaults__类似,现在可以正确处理__annotations__字典中的参数名称。 (由 Yury Selivanov 在bpo-20625中贡献。)

  • hashlib.hash.name现在始终以小写形式返回标识符。以前,某些内置的哈希具有大写的名称,但是现在,它是一个正式的公共接口,其命名已变得一致(bpo-18532)。

  • 因为unittest.TestSuite现在在运行测试后会删除对测试的引用,所以重新使用TestSuite重新运行一组测试的测试工具可能会失败。测试套件不应以这种方式重复使用,因为它意味着状态在测试运行之间得以保留,从而破坏了unittest旨在提供的测试隔离。但是,如果认为缺乏隔离是可以接受的,则可以pass创建TestSuite子类来恢复旧的行为,该子类定义了不执行任何操作的_removeTestAtIndex方法(请参见TestSuite.iter())(bpo-11798)。

  • unittest现在使用argparse进行命令行解析。有一些以前无法使用的无效命令格式;从理论上讲,这应该不会引起向后兼容性问题,因为不允许的命令格式没有任何意义,而且不太可能被使用。

  • 现在,当要匹配的字符串是bytes-like object时,match对象的re.split()re.findall()re.sub()函数以及group()groups()方法始终返回* bytes *对象。以前,返回类型与 Importing 类型匹配,因此,如果您的代码取决于返回值(例如bytearray),则需要更改代码。

  • 现在,如果传递了字符串 Importing,则audioop函数立即引发错误,而不是稍后在(bpo-16685)上随机失败。

  • 为了向后兼容,HTMLParser的新* convert_charrefs *参数当前默认为False,但finally将更改为默认值为True。建议您在代码中的任何HTMLParser调用(bpo-13633)中添加具有适当值的此关键字。

  • 由于将来hmac.new()函数的* digestmod 参数将没有默认值,因此应更改对hmac.new()的所有调用以显式指定 digestmod *(bpo-17276)。

  • 不推荐使用SO键调用sysconfig.get_config_var()或在对sysconfig.get_config_vars()的调用结果中查找SO。根据上下文(bpo-19555),应将此键替换为EXT_SUFFIXSHLIB_SUFFIX

  • 对指定Uopen函数的任何调用都应进行修改。 U在 Python3 中无效,如果使用,finally会引发错误。根据函数的不同,可以使用* newline 参数来实现其等效的旧 Python2 行为,或者在必要时pass将流包装在TextIOWrapper中以使用其 newline *参数(bpo-15204)来实现。

  • 如果您在脚本中使用pyvenv并希望不安装 pip *,则必须将--without-pip添加到命令调用中。

  • 指定缩进时的默认行为json.dump()json.dumps()已更改:在行尾将逗号分隔的项目之后,它不再产生尾随空格。仅当您的测试正在对此类输出(bpo-16333)进行空格敏感的比较时,这才有意义。

  • doctest现在在扩展模块__doc__的字符串中查找 doctest,因此,如果您的 doctest 测试发现包括扩展模块,这些扩展模块中的内容看起来像 doctest,则您可能会看到运行测试之前从未见过的测试失败(bpo-3158)。

  • collections.abc模块已作为 Python 启动改进的一部分进行了稍微的重构。因此,不再需要导入collections自动导入collections.abc。如果您的程序依赖于(未记录的)隐式导入,则需要添加一个显式的import collections.abc(bpo-20784)。

C API 的更改

已在 3.4.3 中更改

PEP 476:默认情况下为 stdlib httpClient 端启用证书验证

http.client和使用它的模块(例如urllib.requestxmlrpc.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)