python 3.4的新功能

作者

R.David Murray<rdmurray@bittance.com>(编辑)

本文解释了与3.3相比,python 3.4中的新特性。python 3.4于2014年3月16日发布。有关详细信息,请参阅 changelog .

参见

PEP 429 --python 3.4发布计划

总结——发布亮点

新语法功能:

  • 在python 3.4中没有添加新的语法功能。

其他新功能:

新库模块:

显著改进了库模块:

安全改进:

CPython实施改进:

请继续阅读有关面向用户的更改的全面列表,包括许多其他较小的改进、cpython优化、拒绝以及潜在的移植问题。

新特点

PEP453:python安装中PIP的显式引导

默认情况下引导PIP

新的 ensurepip 模块(定义见 PEP 453 )提供标准的跨平台机制,将PIP安装程序引导到Python安装和虚拟环境中。版本 pip 包含在python 3.4.0中的是 pip 1.5.4和未来的3.4.x维护版本将把捆绑版本更新为 pip 这在创建候选发布时可用。

默认情况下,命令 pipXpipX.Y 将安装在所有平台上(其中x.y代表python安装的版本),以及 pip python包及其依赖项。在Windows和所有平台上的虚拟环境中, pip 还将安装命令。在其他平台上,系统范围内的非版本化 pip 命令通常引用单独安装的python 2版本。

这个 pyvenv 命令行实用程序和 venv 模块利用 ensurepip 模块制作 pip 在虚拟环境中随时可用。使用命令行实用程序时, pip 默认情况下,当使用 venv 模块 API 安装 pip 必须明确要求。

为Cpthon source builds on POSIX systems , the make installmake altinstall 命令引导 pip 默认情况下。可以通过配置选项控制此行为,并通过makefile选项覆盖此行为。

在Windows和Mac OS X上,cpython安装程序现在默认为安装 pip 以及cpython本身(用户可以在安装过程中选择不安装它)。窗口用户需要选择自动 PATH 修改 pip 默认情况下从命令行中可用,否则仍可以通过用于Windows的python启动程序访问 py -m pip .

AS discussed in the PEP ,在默认情况下,平台打包程序可以选择不安装这些命令,只要当调用时,它们提供关于如何在该平台上安装这些命令的清晰和简单的指导(通常使用系统包管理器)。

注解

为了避免并行的python 2和python 3安装之间的冲突,只有版本控制的 pip3pip3.4 默认情况下,当 ensurepip 直接调用- --default-pip 还需要选项来请求未版本化的 pip 命令。 pyvenv Windows安装程序确保 pip 命令在这些环境中可用,并且 pip 始终可以通过调用 -m 切换而不是直接切换,以避免在具有多个Python安装的系统上出现歧义。

文件变更

作为这一变化的一部分, 安装python模块分发python模块 文档的各个部分已完全重新设计为简短的入门和常见问题文档。大多数打包文档现在已经被转移到维护的python打包机构 Python Packaging User Guide _以及各个项目的文档。

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

参见

PEP 453 --python安装中PIP的显式引导

由Donald Stufft和Nick Coghlan撰写的PEP,由Donald Stufft、Nick Coghlan、Martin von L_wis和Ned Deily实施。

PEP 446:新创建的文件描述符不可继承

PEP 446 生成新创建的文件描述符 non-inheritable . 一般来说,这是应用程序需要的行为:当启动新进程时,在新进程中同时打开当前打开的文件可能会导致各种难以发现的错误,并可能导致安全问题。

然而,有时需要继承。为了支持这些情况,可以使用以下新的函数和方法:

参见

PEP 446 --使新创建的文件描述符不可继承

由Victor Stinner编写并实施PEP计划。

对编解码器处理的改进

自从它第一次被引进以来, codecs 模块一直被设计成一个中立型的动态编码和解码系统。但是,它与Python文本模型的紧密耦合,特别是内置的类型限制了方便方法 strbytesbytearray 从历史上看,这些类型掩盖了这一事实。

作为澄清形势的关键步骤, codecs.encode()codecs.decode() 方便功能现在在python 2.7、3.3和3.4中得到了正确的记录。这些功能存在于 codecs 从python 2.4开始,模块(并且已经被回归测试套件所覆盖),但以前只有通过运行时内省才能发现。

与上的便利方法不同 strbytesbytearray , the 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)

最后,正如上面的示例所示,这些改进允许恢复在Python3.2中恢复的非Unicode编解码器的方便别名。这意味着,与十六进制表示形式(例如)之间的二进制数据编码现在可以写成:

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

标准库中提供的二进制和文本转换在 二进制转换文本转换 .

(由Nick Coghlan在 bpo-7475bpo-17827bpo-17828bpo-19619

PEP 451:导入系统的模块类型

PEP 451 提供有关导入机制将用于加载模块(即模块规范)的信息的封装。这有助于简化导入实现和几个与导入相关的API。这一变化也是 several future import-related improvements .

PEP面向公众的更改完全向后兼容。此外,除了importers作者之外,它们对所有人都应该是透明的。键查找器和加载程序方法已被弃用,但它们将继续工作。新importers应采用PEP中所述的新方法。应该更新现有的导入程序以实现新方法。见 已弃用 有关应替换方法及其替换方法的列表的部分。

其他语言更改

对核心python语言所做的一些较小的更改是:

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

  • min()max() 现在接受 default 仅关键字参数,如果要计算的ITerable没有元素,则可以使用该参数指定返回的值。(朱利安·伯曼在 bpo-18111

  • 模块对象现在 weakref 能干。

  • 模块 __file__ 默认情况下,属性(和相关值)现在应始终包含绝对路径,唯一例外是 __main__.__file__ 直接使用相对路径执行脚本时。(布雷特·坎农在 bpo-18416

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

  • 新德语EBCDIC codec cp273 . (迈克尔·比伦费尔德和安德鲁·库奇林在 bpo-1097797

  • 新乌克兰语 codec cp1125 . (Serhiy Storchaka在 bpo-19668

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

  • 这个 int 构造函数现在接受具有 __index__ 方法 base 参数。(马克·狄金森在 bpo-16772

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

  • memoryview 现在注册为 Sequence 并支持 reversed() 内建帐户。(由Nick Coghlan和Claudiu Popa在 bpo-18690bpo-19078

  • 签名报告人 help() 在一些案例中,由于引入了Argument Clinic和其他对 inspectpydoc 模块。

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

新模块

asyncio

新的 asyncio 模块(定义见 PEP 3156 )为python提供标准的可插拔事件循环模型,在标准库中提供可靠的异步IO支持,并使其他事件循环实现更容易与标准库和彼此进行互操作。

对于python 3.4,此模块被认为是 provisional API .

参见

PEP 3156 --异步IO支持重启:“异步IO”模块

由Guido van Rossum领导编写和实施PEP。

紧随其后

新的 ensurepip 模块是 PEP 453 实施。在事件的正常过程中,最终用户不需要与此模块交互,但可以使用它手动引导 pip 如果拒绝自动引导到安装或虚拟环境中。

ensurepip 包括的捆绑副本 pip ,最新版本,从随附的CPython发布的第一个候选版本开始(这适用于维护发布和功能发布)。 ensurepip 无法访问Internet。如果安装可以访问Internet,则在 ensurepip 是捆绑的吗? pip 可用于升级 pip 到比捆绑版本更新的版本。(注意这样的升级版本 pip 被视为单独安装的包,如果卸载python,则不会删除该包。)

模块命名为 确保 pip因为如果调用时 pip 已安装,但不起任何作用。它也有一个 --upgrade 使其安装的捆绑副本的选项 pip 如果现有安装的版本 pip 比捆绑副本旧。

枚举

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

参见

PEP 435 --向python标准库添加枚举类型

PEP由巴里·华沙、伊莱·本德尔斯基和伊桑·弗曼撰写,由伊桑·弗曼实施。

pathlib

新的 pathlib 模块提供了表示文件系统路径的类,其语义适合于不同的操作系统。路径类在 纯路径 提供纯计算操作而不需要I/O,以及 具体路径 ,它继承纯路径,但也提供I/O操作。

对于python 3.4,此模块被认为是 provisional API .

参见

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

PEP由Antoine Pitrou编写并实施。

选择器

新的 selectors 模块(作为实现的一部分创建 PEP 3156 )允许在 select 模块原语。

统计学

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

参见

PEP 450 --向标准库添加统计模块

PEP由Steven D'Aprano编写并实施

tracemalloc

新的 tracemalloc 模块(定义见 PEP 454 )是跟踪由python分配的内存块的调试工具。它提供以下信息:

  • 跟踪对象的分配位置

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

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

参见

PEP 454 --添加新的tracemalloc模块以跟踪python内存分配

由Victor Stinner编写和实现

改进的模块

ABC公司

新功能 abc.get_cache_token() 可以用来知道何时使受对象图更改影响的缓存失效。(由Ukasz Langa在 bpo-16832

新类 ABCABCMeta 作为它的元类。使用 ABC 作为一个基类与指定 metaclass=abc.ABCMeta ,但更容易打字和阅读。(布鲁诺·杜普伊斯在 bpo-16049

aifc

这个 getparams() 方法现在返回一个NamedDuple而不是一个纯元组。(克劳迪乌波巴在 bpo-17818

aifc.open() 现在支持上下文管理协议:当在 withclose() 返回对象的方法将在块的末尾自动调用。(由Serhiy Storchacha在 bpo-16486

这个 writeframesraw()writeframes() 方法现在接受任何 bytes-like object . (Serhiy Storchaka在 bpo-8311

argparse

这个 FileType 类现在接受 encodingerrors 参数,传递给 open() . (卢卡斯·梅斯特里在 bpo-11175

录音磁带

audioop 现在支持24位采样。(Serhiy Storchaka在 bpo-12866

新的 byteswap() 函数将big-endian示例转换为little-endian,反之亦然。(Serhiy Storchaka在 bpo-19641

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

Base64

中的编码和解码功能 base64 现在接受任何 bytes-like object 如果之前要求 bytesbytearray 实例。(由Nick Coghlan在 bpo-17839

新功能 a85encode()a85decode()b85encode()b85decode() 提供对来自和到的二进制数据进行编码和解码的能力 Ascii85 以及Git/Mercurial Base85 分别设置格式。这个 a85 函数具有可用于使它们与 Ascii85 编码,包括Adobe变体。(由马丁·莫里森、Mercurial项目、Serhiy Storchaka和Antoine Pitrou在 bpo-17618

收藏

这个 ChainMap.new_child() 方法现在接受 m 指定要添加到链的子映射的参数。这允许为子级使用现有映射和/或自定义映射类型。(由Vinay Sajip在 bpo-16613

colorsys

对rgb---yiq转换系数中的位数进行了扩展,使其与fcc ntsc版本相匹配。结果的变化应小于1%,并且可能更好地匹配其他地方的结果。(由Brian Landers和Serhiy Storchaka在 bpo-14323

contextlib

新的 contextlib.suppress 上下文管理器有助于澄清故意抑制单个语句中异常的代码的意图。(由Raymond Hettinger在 bpo-15806 把比雷埃夫斯归零 bpo-19266

新的 contextlib.redirect_stdout() 上下文管理器使实用程序脚本更容易处理不灵活的API,这些API将其输出写入 sys.stdout 不要提供任何重定向选项。使用上下文管理器, sys.stdout 输出可以重定向到任何其他流,或者与 io.StringIO ,一个字符串。后者尤其有用,例如,从为实现命令行接口而编写的函数中捕获输出。建议仅用于实用程序脚本,因为它会影响 sys.stdout . (由Raymond Hettinger在 bpo-15805

这个 contextlib 文件也已更新,包括 discussion 单一使用、可重用和可重入上下文管理器之间的区别。

数据库管理

dbm.open() 对象现在支持上下文管理协议。当用于 with 语句 close 数据库对象的方法将在块的末尾自动调用。(由Claudiu Popa和Nick Coghlan在 bpo-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在 bpo-11816 还有克劳迪乌波巴 bpo-17916

新功能 stack_effect() 计算给定操作码和参数对python堆栈的影响,这些信息在其他方面不可用。(拉里·黑斯廷斯在 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 现在将在扩展模块中找到doctests __doc__ 串。(由Zachary Ware在 bpo-3158

电子邮件

as_string() 现在接受 policy 参数,用于在生成消息的字符串表示形式时重写该消息的默认策略。这意味着 as_string 现在可以在更多情况下使用,而不必创建和使用 generator 为了将格式化参数传递给 flatten 方法。(R.David Murray在 bpo-18600

新方法 as_bytes() 添加以生成消息的字节表示形式,类似于 as_string 生成字符串表示形式。它不接受 麦克海德伦 但不接受 unixfrompolicy 参数。这个 Message __bytes__() 方法调用它,这意味着 bytes(mymsg) 现在将产生直观的结果:一个字节对象包含完全格式化的消息。(R.David Murray在 bpo-18600

这个 Message.set_param() 消息现在接受 代替 关键字参数。指定后,将更新关联的头,而不更改其在头列表中的位置。对于向后兼容性,默认值为 False . (R.David Murray在 bpo-18891

一对新的子类 Message 已添加 (EmailMessageMIMEPart )以及新的子模块, contentmanager 和一个新的 policy 属性 content_manager . 所有文档当前都在新模块中,该模块将作为电子邮件新模块的一部分添加。 provisional API . 这些类提供了许多新的方法,使从电子邮件中提取内容和将内容插入电子邮件更加容易。有关详细信息,请参见 contentmanager 文件和 email 实例 . 这些API添加完成了作为email6项目一部分计划的大部分工作。目前临时的API计划在Python3.5中成为最终版本(可能在错误处理方面有一些小的添加)。(R.David Murray在 bpo-18891

菲利普

一个新的 clear_cache() 功能提供清除 filecmp 比较缓存,使用 os.stat() 用于确定文件自上次比较后是否已更改的信息。例如,如果文件更改和重新签入的时间少于特定文件系统的文件修改时间字段的解析时间,则可以使用此选项。(马克·莱维特在 bpo-18149

新建模块属性 DEFAULT_IGNORES 提供用作默认值的目录列表 忽视 的参数 dircmp() 功能。(由Eli Bendersky在 bpo-15442

功能工具

新的 partialmethod() 描述符将部分参数应用程序引入描述符,就像 partial() 提供普通可调用文件。新的描述符还使获取任意可调用文件(包括 partial() 实例)在包含在类定义中时的行为与普通实例方法类似。(由Alon Horev和Nick Coghlan在 bpo-4331

新的 singledispatch() decorator为python标准库提供了对单分派通用函数的支持。当面向对象编程侧重于将公共数据集上的多个操作分组到一个类中时,通用函数侧重于将允许它使用的操作的多个实现分组。 不同的 各种数据。

参见

PEP 443 --单调度通用函数

PEP由_Ukasz Langa编写和实施。

total_ordering() 现在支持返回值 NotImplemented 来自基础比较函数。(凯蒂·米勒在 bpo-10042

纯Python版本的 partial() 函数现在在stdlib中;在cpython中,它被C加速版本覆盖,但它可供其他实现使用。(布莱恩·索恩在 bpo-12428

GC

新功能 get_stats() 返回自解释器启动后包含集合统计信息的每代三个字典的列表。(由Antoine Pitrou在 bpo-16351

格洛布

一个新函数 escape() 提供一种方法来转义文件名中的特殊字符,以便它们不会成为全局扩展的一部分,而是按字面匹配。(Serhiy Storchaka在 bpo-8402

hashlib

一个新的 hashlib.pbkdf2_hmac() 函数提供 PKCS#5 password-based key derivation function 2 .(由Christian Heimes在 bpo-18582

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

hmac

hmac 现在接受 bytearray 以及 bytes 对于 key 参数 new() 函数,以及 msg 参数 new() 函数和 update() 方法现在接受 hashlib 模块。(由Jonas Borgster_m在 bpo-18240

这个 食糜 参数 hmac.new() 函数现在可以是由 hashlib . 此外,当前行为中 食糜 默认为 MD5 已弃用:在将来的Python版本中,将没有默认值。(由Christian Heimes在 bpo-17276

加上 block_sizename 属性(以及 digest_size 属性) hmac 模块现在完全符合 PEP 247 应用程序编程接口。(由Christian Heimes在 bpo-18775

HTML

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

HTMLParser 接受新的关键字参数 convert_charrefs 当,当 True ,自动转换所有字符引用。对于向后兼容性,其值默认为 False ,但它将变为 True 在将来的Python版本中,我们邀请您显式地设置它,并更新代码以使用这个新特性。(由Ezio Melotti在 bpo-13633

这个 strict 的参数 HTMLParser 现已弃用。(由Ezio Melotti在 bpo-15114

HTTP协议

send_error() 现在接受一个可选的附加 解释 可用于提供扩展错误描述的参数,如果存在硬编码默认值,则覆盖该默认值。此扩展错误描述将使用 error_message_format 属性并作为错误响应的正文发送。(卡尔·考恩供稿) bpo-12921

这个 http.server command line interface 现在有一个 -b/--bind 使服务器侦听特定地址的选项。(由麦芽粉提供) bpo-17764

idlelib和idle

由于idlelib实现了idle shell和编辑器,并且不打算由其他程序导入,所以它在每个版本中都得到了改进。见 Lib/idlelib/NEWS.txt 对于自3.3.0以来的累积更改列表,以及在未来3.4.x版本中所做的更改。此文件也可从空闲 Help ‣ About IDLE 对话框。

importlib

这个 InspectLoader ABC定义了一种新方法, source_to_code() 它接受源数据和路径并返回代码对象。默认实现等效于 compile(data, path, 'exec', dont_inherit=True) . (埃里克·斯诺和布雷特·坎农在 bpo-15627

InspectLoader 现在还具有 get_code() 方法。但是,出于性能原因,通常需要重写默认实现。(布雷特·坎农在 bpo-18072

这个 reload() 函数已从移动 impimportlib 作为其中的一部分 imp 模块弃用。(由Berker Peksag在 bpo-18193

importlib.util 现在有一个 MAGIC_NUMBER 提供对字节码版本号的访问的属性。这将取代 get_magic() 中的函数已弃用 imp 模块。(布雷特·坎农在 bpo-18192

新的 importlib.util 功能 cache_from_source()source_from_cache() 替换已弃用的 imp 模块。(布雷特·坎农在 bpo-18194

这个 importlib 引导程序 NamespaceLoader 现在符合 InspectLoader ABC,意思是 runpypython -m 现在可以用于命名空间包。(布雷特·坎农在 bpo-18058

importlib.util 具有新功能 decode_source() 它使用通用换行处理从字节解码源代码。这对于实现 InspectLoader.get_source() 方法。

importlib.machinery.ExtensionFileLoader 现在有一个 get_filename() 方法。这在最初的实现中被无意中省略了。(埃里克·斯诺在 bpo-19152

检查

这个 inspect 模块现在提供了一个基本的 command line interface 快速显示模块、类和函数的源代码和其他信息。(由Claudiu Popa和Nick Coghlan在 bpo-18626

unwrap() 使其易于解开由创建的封装器函数链 functools.wraps() (以及设置 __wrapped__ 封装函数的属性)。(Daniel Urban、Aaron Iles和Nick Coghlan在 bpo-13266

作为新的 enum 模块 inspect 模块现在对自定义有了更好的支持 __dir__ 方法和通过元类提供的动态类属性。(伊桑·弗曼在 bpo-18929bpo-19030

getfullargspec()getargspec() 现在使用 signature() 应用程序编程接口。这允许他们支持更广泛的可调用文件,包括那些 __signature__ 属性,那些具有Argument Clinic提供的元数据的属性, functools.partial() 对象等等。注意,不同于 signature() ,这些函数仍然忽略 __wrapped__ 属性,并报告已绑定方法的第一个参数,因此仍然需要更新代码以使用 signature() 如果需要这些功能,直接使用。(由Yury Selivanov在 bpo-17481

signature() 现在支持duck类型的cpython函数,这增加了对用cython编译的函数的支持。(由Stefan Behnel和Yury Selivanov在 bpo-17159

IP地址

ipaddress 在python 3.3中作为 provisional API . 随着python 3.4的发布,这个限制已经被删除: ipaddress 现在被认为是一个稳定的API,被正常的标准库要求所覆盖以保持向后兼容性。

一个新的 is_global 属性是 True 如果地址是全局可路由的。(彼得·穆迪在 bpo-17400

登录

这个 TimedRotatingFileHandler 有新的 atTime 可用于指定发生滚动的日期时间的参数。(由Ronald Oussoren在 bpo-9556

SocketHandlerDatagramHandler 现在支持Unix域套接字(通过设置 portNone )(由Vinay Sajip在提交CE46195B56A9时提供。)

fileConfig() 现在接受 configparser.RawConfigParser 的子类实例 filename 参数。当日志记录配置只是整个应用程序配置的一部分时,或者当应用程序在将配置传递给 fileConfig() . (由Vinay Sajip在 bpo-16110

通过记录从套接字接收的配置数据 logging.config.listen() 现在可以在处理函数之前验证函数,方法是将验证函数作为参数提供给新的 validate 关键字参数。(由Vinay Sajip在 bpo-15452

marshal

默认值 marshal 版本被修改为3。实现新版本的代码恢复了python2的行为,即只记录一个内部字符串副本并在反序列化时保留内部,并将此“一个副本”功能扩展到任何对象类型(包括处理递归引用)。这就减少了 .pyc 当模块从 .pyc (或) .pyo 文件。(由Kristj_n Valur J_nsson在 bpo-16475 ,安托万·皮特鲁在 bpo-19219

MMAP

mmap对象现在可以 weakref 编辑(瓦莱丽·兰伯特在 bpo-4885

多重处理

关于UNIX的两个新 start methodsspawnforkserver ,已添加用于启动进程,使用 multiprocessing . 这使得进程与线程的混合更加健壮,并且 spawn 方法匹配多处理在Windows上一直使用的语义。新建函数 get_all_start_methods() 报告平台上可用的所有启动方法, get_start_method() 报告当前的启动方法,以及 set_start_method() 设置开始方法。(由Richard Oudkerk在 bpo-8713

multiprocessing 现在还有一个概念 context ,它决定如何创建子进程。新建函数 get_context() 返回使用指定的Start方法的上下文。它与 multiprocessing 模块本身,以便您可以使用它来创建 Pool s和将在该上下文中操作的其他对象。这允许框架和应用程序或同一应用程序的不同部分在不相互干扰的情况下使用多处理。(由Richard Oudkerk在 bpo-18999

除了使用旧的 fork start方法,子进程不再从其父进程继承不需要的句柄/文件描述符(属于 bpo-8713

multiprocessing 现在依靠 runpy (实现了 -m 开关)初始化 __main__ 当使用 spawnforkserver 启动方法。这解决了一些边缘情况,其中结合多处理 -m 命令行切换和显式的相对导入可能会导致子进程中出现不明显的失败。(由Nick Coghlan在 bpo-19946

操作人员

新功能 length_hint() 提供规范的实现,说明 __length_hint__() 应使用特殊方法,作为 PEP 424 此语言特性的形式说明。(由Armin Ronacher在 bpo-16148

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

os

有新的函数来获取和设置 inheritable flag 文件描述符的 (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驱动器根目录下的卷。(蒂姆·戈尔登在 bpo-9035

os.open() 在提供它们的平台上支持两个新标志, O_PATH (未打开的文件描述符),以及 O_TMPFILE (未命名的临时文件;从3.4.0版本开始,仅在内核版本为3.11或更高版本且带有UAPI头文件的Linux系统上可用)。(由Christian Heimes在 bpo-18673 分别是本杰明·彼得森。)

pdb

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

这个 print 命令已从中删除 pdb ,恢复对python的访问 print() 来自PDB命令行的函数。Python 2 pdb 没有一个 print 命令;相反,输入 print 执行 print 语句。在Python 3中 print 被错误地称为PDB的别名 p 命令。 p 但是,打印 repr 它的参数,而不是 str 就像 Python 2 print 命令确实如此。更糟的是, Python 3 pdb print 命令隐藏了 Python 3 print 函数,使其在 pdb 提示。(康纳·奥斯本于 bpo-18764

泡菜

pickle 现在支持(但默认情况下不使用)新的pickle协议,协议4。这个新协议解决了以前协议中存在的一些问题,例如嵌套类、非常大的字符串和容器的序列化,以及 __new__() 方法只接受关键字参数。它还提供了一些效率改进。

参见

PEP 3154 --pickle协议4

PEP由Antoine Pitrou编写,Alexandre Vassalotti实施。

普利斯利布

plistlib 现在有了一个类似于stdlib序列化协议的标准模式的API,新的 load()dump()loads()dumps() 功能。(旧的API现在已被弃用。)除了已经支持的XML plist格式之外 (FMT_XML ,它现在还支持二进制plist格式。 (FMT_BINARY )(由Ronald Oussoren和其他人在 bpo-14455

poplib

添加了两种新方法 poplibcapa() ,返回pop服务器公布的功能列表,以及 stls() ,如果pop服务器支持,它会将明文pop3会话切换为加密的pop3会话。(由Lorenzo Catucci在 bpo-4473

印记

这个 pprint 模块的 PrettyPrinter 类及其 pformat()pprint() 函数有一个新选项, 契约 ,控制输出的格式。当前设置 契约True 意味着序列将打印尽可能多的序列元素 宽度 在每一行(缩进)。(Serhiy Storchaka在 bpo-19132

长字符串现在使用Python的正常行继续语法进行封装。(由Antoine Pitrou在 bpo-17150

PTY

pty.spawn() 现在返回状态值 os.waitpid() 在子进程上,而不是 None .(格雷戈里·史密斯供稿)

pydoc

这个 pydoc 模块现在直接基于 inspect.signature() 内省API,允许它为各种各样的可调用对象提供签名信息。这一变化也意味着 __wrapped__ 现在,在显示帮助信息时会考虑属性。(拉里·黑斯廷斯在 bpo-19674

这个 pydoc 模块不再显示 self 已绑定方法的参数。相反,它旨在始终显示所提供可调用文件的确切当前签名。(拉里·黑斯廷斯在 bpo-20710

除了对 pydoc 直接,它对海关的处理 __dir__ 方法和各种描述符行为也因 inspect 模块。

作为 help() 内置设备基于 pydoc 上述变化也会影响 help() .

重新

新的 fullmatch() 功能和 regex.fullmatch() 方法将模式锚定在字符串的两端以匹配。这提供了一种明确匹配目标的方法,从而避免了一类细微的错误,其中 $ 在代码更改或添加现有正则表达式的替代项时,字符会丢失。(马修·巴内特在 bpo-16203

RPR regex objects 现在包括图案和flag;代表 match objects 现在包括开始、结束和匹配的字符串部分。(由Hugo Lopes Tavares和Serhiy Storchaka在 bpo-13592bpo-17087

资源

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

在Linux内核版本2.6.36或更高版本上,还有一些新的特定于Linux的常量: RLIMIT_MSGQUEUERLIMIT_NICERLIMIT_RTPRIORLIMIT_RTTIMERLIMIT_SIGPENDING . (由Christian Heimes在 bpo-19324

在FreeBSD版本9和更高版本上,有一些新的FreeBSD特定常量: RLIMIT_SBSIZERLIMIT_SWAPRLIMIT_NPTS . (克劳迪乌波巴在 bpo-19343

选择

epoll 对象现在支持上下文管理协议。当用于 with 语句 close() 方法将在块的末尾自动调用。(Serhiy Storchaka在 bpo-16488

devpoll 对象现在有 fileno()close() 方法以及新属性 closed .(由Victor Stinner在 bpo-18794

搁置

Shelf 实例现在可用于 with 语句,并将在 with 块。(菲利普·格鲁兹基在 bpo-13896

shutil

copyfile() 现在提出一个具体的 Error 子类, SameFileError 当源文件和目标文件相同时,允许应用程序对此特定错误采取适当的操作。(由石本刚雄和施拉瓦克在 bpo-1492704

短信网关

这个 SMTPServerSMTPChannel 课程现在接受 map 关键字参数,如果指定,则传入到 asynchat.async_chat 作为其 map 参数。这允许应用程序避免影响全局套接字映射。(由Vinay Sajip在 bpo-11959

SMTPLIB

SMTPException 现在是的子类 OSError ,它允许通过只关心是否发生错误的代码在一条try/except语句中捕获套接字级错误和SMTP协议级错误。(内德·杰克逊在 bpo-2118

Socket

Socket模块现在支持 CAN_BCM 支持它的平台上的协议。(布莱恩·索恩在 bpo-15359

socket对象有新的方法来获取或设置 inheritable flagget_inheritable()set_inheritable() .

这个 socket.AF_*socket.SOCK_* 常量现在是使用新的 enum 模块。这允许在调试期间打印有意义的名称,而不是整数“幻数”。

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

inet_pton()inet_ntop() 现在Windows支持。(石本atsuo在 bpo-7171

sqlite3

新的布尔参数 connect() 函数, uri ,可用于指示 database 参数是 uri (见 SQLite URI documentation )(由poq在 bpo-13773

SSL

PROTOCOL_TLSv1_1PROTOCOL_TLSv1_2 (tlsv1.1和tlsv1.2支持)已添加;仅当python与openssl 1.0.1或更高版本链接时,才支持这些协议。(Michele Orr_和Antoine Pitrou在 bpo-16692

新功能 create_default_context() 提供获取 SSLContext 其设置旨在在兼容性和安全性之间实现合理的平衡。这些设置比 SSLContext 如果最佳做法的安全要求发生变化,则可以在未来对其进行调整,而无需事先取消预测。使用支持SSL的stdlib库的新推荐最佳实践是使用 create_default_context() 获得 SSLContext 对象,根据需要修改它,然后将其作为 context 相应stdlib api的参数。(由Christian Heimes在 bpo-19689

SSLContext 方法 load_verify_locations() 接受新的可选参数 卡塔塔 可以分别通过字符串或字节直接提供PEM或DER编码的证书。(由Christian Heimes在 bpo-18138

新功能 get_default_verify_paths() 返回路径和环境变量的命名元组, set_default_verify_paths() 方法用于设置OpenSSL的默认值 cafilecapath . 这有助于调试默认验证问题。(由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_DEFAULTVERIFY_CRL_CHECK_LEAFVERIFY_CRL_CHECK_CHAINVERIFY_X509_STRICT . 默认情况下,openssl不进行任何crl验证。(克里斯汀·海默斯在 bpo-8813

新的 SSLContext 方法 load_default_certs() 从默认位置加载一组默认的“证书颁发机构”(CA)证书,这些证书根据平台的不同而不同。它可用于加载两个TLS Web服务器身份验证证书 ( purpose=SERVER_AUTH ),用于客户端验证服务器,用于服务器验证客户端证书的证书 ( purpose=CLIENT_AUTH )。(由Christian Heimes在 bpo-19292

两个新的仅Windows功能, enum_certificates()enum_crls() 提供从Windows证书存储检索证书、证书信息和CRL的功能。(由Christian Heimes在 bpo-17134

支持使用新的 ssl.SSLContext.set_servername_callback() 方法。(丹尼尔·布莱克在 bpo-8109

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

斯达

这个 stat 模块现在由中的C实现支持 _stat .C实现是必需的,因为大多数值都不是标准化的,并且依赖于平台。(由Christian Heimes在 bpo-11016

模块支持新的 ST_MODE flag, S_IFDOORS_IFPORTS_IFWHT . (由基督教希姆斯在 bpo-11016

结构

新功能 iter_unpack 和一个新的 struct.Struct.iter_unpack() 编译格式上的方法提供包含给定数据格式重复实例的缓冲区的流式解包。(由Antoine Pitrou在 bpo-17804

子过程

check_output() 现在接受一个 input 可用于提供 stdin 用于运行的命令。(扎克·温伯格在 bpo-16624

getstatus()getstatusoutput() 现在在Windows上工作。这一变化实际上是在3.3.4中无意中做出的。(蒂姆·戈尔登在 bpo-10197

sunau

这个 getparams() 方法现在返回一个NamedDuple而不是一个纯元组。(克劳迪乌波巴在 bpo-18901

sunau.open() 现在支持上下文管理协议:当在 withclose 返回对象的方法将在块的末尾自动调用。(Serhiy Storchaka在 bpo-18878

AU_write.setsampwidth() 现在支持24位样本,因此增加了使用模块编写24个样本的支持。(Serhiy Storchaka在 bpo-19261

这个 writeframesraw()writeframes() 方法现在接受任何 bytes-like object . (Serhiy Storchaka在 bpo-8311

系统

新功能 sys.getallocatedblocks() 返回解释器分配的当前块数。(在cpython中,默认为 --with-pymalloc 设置,这是通过 PyObject_Malloc() 这对于跟踪内存泄漏非常有用,尤其是通过测试套件实现自动化时。(由Antoine Pitrou在 bpo-13390

当python解释器在 interactive mode ,它检查 __interactivehook__ 属性 sys 模块。如果该属性存在,则在启动交互模式之前,不使用任何参数调用其值。支票是在 PYTHONSTARTUP 文件已被读取,因此可以在其中设置。这个 site 模块 sets it 到启用选项卡完成和历史记录保存的函数(在 ~/.python-history )如果平台支撑 readline . 如果不希望此(新)行为,可以在 PYTHONSTARTUPsitecustomizeusercustomize 通过从中删除此属性 sys (或将其设置为其他可调用项)。(由_ric Araujo和Antoine Pitrou在 bpo-5845

tarfile

这个 tarfile 模块现在支持一个简单的 命令行界面 当作为脚本直接或通过调用时 -m . 这可以用来创建和提取tarfile档案。(由Berker Peksag在 bpo-13477

文本片段

这个 TextWrapper 类有两个新的属性/构造函数参数: max_lines ,限制输出中的行数,以及 placeholder ,这是一个字符串,如果由于以下原因而被截断,它将出现在输出的末尾 max_lines . 基于这些能力,新的便利功能 shorten() 将输入中的所有空白折叠为单个空格,并生成给定的一行 宽度 最后是 占位符 (默认情况下, [...] )(由Antoine Pitrou和Serhiy Storchaka在 bpo-18585bpo-18725

线程加工

这个 Thread 表示主线程的对象可以从 main_thread() 功能。在正常情况下,这将是启动Python解释器的线程。(由Andrew Svetlov在 bpo-18882

追溯

一个新的 traceback.clear_frames() 函数获取一个回溯对象,并清除它引用的所有帧中的局部变量,从而减少所消耗的内存量。(安德鲁库奇林在 bpo-1565525

类型

一个新的 DynamicClassAttribute() 描述符提供了一种定义属性的方法,该属性在通过实例对象查找时正常工作,但它被路由到 classes __getattr__ 通过这个类。这允许在类上具有活动的属性,并在具有相同名称的类上具有虚拟属性(请参见 Enum 例如)。(伊桑·弗曼在 bpo-19030

urllib

urllib.request 现在支持 data: 通过URL DataHandler 类。(由Mathias Panzenb_ck在 bpo-16423

将由 Request 现在可以通过设置 method 子类上的类属性。(由Jason R Coombs在 bpo-18978

Request 对象现在可以重用:如果 full_urldata 修改属性,更新所有相关的内部属性。例如,这意味着现在可以使用相同的 Request 多个对象中的对象 OpenerDirector.open() 用不同的 data 参数,或修改 Requesturl 而不是从头开始重新计算。还有一个新的 remove_header() 可用于从 Request . (Alexey Kachayev在 bpo-16464 ,丹尼尔·沃兹尼亚克 bpo-17485 和Damien Brecht和Senthil Kumaran bpo-17272

HTTPError 对象现在有一个 headers 提供对与错误关联的HTTP响应头的访问的属性。(由Berker Peksag在 bpo-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=0i=1 等)。见 使用子测试区分测试迭代 对于此示例的完整版本。(由Antoine Pitrou在 bpo-16997

unittest.main() 现在接受的测试名称不可重复 默认测试 ,以前它只接受一个测试名称作为字符串。(由Jyrki Puliainen在 bpo-15132

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

discover() 现在对发现的文件进行排序,以提供一致的测试顺序。(马丁·梅林和杰夫·拉姆纳尼在 bpo-16709

TestSuite 现在,如果测试成功,则在测试运行后立即删除对测试的引用。在执行垃圾收集的python解释器上,如果没有其他内容保存对测试的引用,则允许对测试进行垃圾收集。可以通过创建 TestSuite 定义自定义的子类 _removeTestAtIndex 方法。(由Tom Wardill、Matt McClure和Andrew Svetlov在 bpo-11798

一个新的测试断言上下文管理器, assertLogs() ,将确保给定的代码块使用 logging 模块。默认情况下,消息可以来自任何记录器,优先级为 INFO 或者更高,但可以同时指定记录器名称和可选的最低日志记录级别。可以查询上下文管理器返回的对象 LogRecord 记录的S和/或格式化消息。(由Antoine Pitrou在 bpo-18937

测试发现现在可用于命名空间包(由Claudiu Popa在 bpo-17457

unittest.mock 对象现在在匹配调用时检查其规范签名,这意味着参数现在可以通过位置或名称来匹配,而不是仅通过位置来匹配。(由Antoine Pitrou在 bpo-17015

mock_open() 对象现在有 readlinereadlines 方法。(由Toshio Kuratomi在 bpo-17467

venv

venv 现在包括的激活脚本 cshfish 贝壳。(由Andrew Svetlov在 bpo-15417

EnvBuilder 以及 create() 便利函数接受一个新的关键字参数 with_pip ,默认为 False ,控制是否 EnvBuilder 确保 pip 安装在虚拟环境中。(由Nick Coghlan在 bpo-19552 作为其中的一部分 PEP 453 实施。)

wave

这个 getparams() 方法现在返回一个NamedDuple而不是一个纯元组。(克劳迪乌波巴在 bpo-17487

wave.open() 现在支持上下文管理协议。(克劳迪乌波巴在 bpo-17616

wave 现在可以 write output to unseekable files . (由大卫·琼斯、吉尔默·波罗和塞尔希·斯托查卡于 bpo-5202

这个 writeframesraw()writeframes() 方法现在接受任何 bytes-like object . (Serhiy Storchaka在 bpo-8311

韦克里夫

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

新的 finalize 类使注册回调成为可能,以便在垃圾收集对象时调用回调,而无需仔细管理弱引用本身的生命周期。(由Richard Oudkerk在 bpo-15528

ref 现在通过 __callback__ 属性。(马克·狄金森在 bpo-17643

xml.etree

一个新的解析器, XMLPullParser ,允许非阻塞应用程序解析XML文档。示例见 拉api进行非阻塞解析 . (由Antoine Pitrou在 bpo-17741

这个 xml.etree.ElementTree tostring()tostringlist() 函数,以及 ElementTree write() 方法,现在有一个 short_empty_elements keyword-only parameter 控制没有内容的元素是否以缩写形式写入 (<tag /> )或扩大 (<tag></tag> )形式。(由Ariel Poliak和Serhiy Storchaka在 bpo-14377

压缩文件

这个 writepy() 方法 PyZipFile 类有新的 菲尔特芬克 可用于控制哪些目录和文件添加到存档的选项。例如,这可以用于从存档中排除测试文件。(由Christian Tismer于 bpo-19274

这个 允许ZIP64 参数到 ZipFilePyZipfile 现在是 True 默认情况下。(威廉·马尔拉德在 bpo-17201

CPython实施变更

PEP 445:cpython内存分配器的定制

PEP 445 添加新的C级接口来定制cpython解释器中的内存分配。

参见

PEP 445 --添加新的API以自定义python内存分配器

由Victor Stinner编写并实施PEP计划。

PEP 442:安全对象定案

PEP 442 消除了cpython中对象最终化的当前限制和怪癖。有了它,对象 __del__() 方法,以及 finally 当子句是引用循环的一部分时,它们可以最终确定。

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

参见

PEP 442 --安全对象终结

PEP由Antoine Pitrou编写并实施。

PEP456:安全和可互换的hash算法

PEP 456 跟进先前对python散列算法的安全修复工作,以解决某些DoS攻击,这些攻击可能受到字典查找支持的面向公共的API的影响。(见 bpo-14621 对于当前一轮改进的开始),pep统一了cpython的散列代码,使打包程序更容易替换不同的散列算法,并将python的默认实现切换到具有64位数据类型的平台上的siphash实现。与旧的FNV算法相比,任何性能差异都是微不足道的。

政治公众人物向 sys.hash_info 命名元组以描述当前执行的二进制文件正在使用的哈希算法。否则,PEP不会更改任何现有的CPython api。

PEP436:Argument Clinic

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

在python 3.4中,一些标准的库扩展模块已经转换为使用参数clinic,并且 pydocinspect 已相应更新。

预计用于编程自省的签名元数据将作为Python3.4维护版本的一部分添加到C中实现的其他可调用文件中。

注解

Argument Clinic PEP与执行情况不完全一致。在这种情况下,发布管理器和核心开发团队认为这是可以接受的,因为Argument Clinic不能作为第三方在Python3.4中使用的公共API提供。

参见

PEP 436 -- The Argument Clinic DSL

由拉里·黑斯廷斯撰写并实施的PEP计划。

其他构建和C API更改

  • 新的 PyType_GetSlot() 函数已添加到稳定的ABI中,允许在使用受限API时从命名类型槽中检索函数指针。(马丁·冯·卢维斯在 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 失败论。

  • 现在可以使用最新版本的gcc和clang的地址健全性检查功能来编译cpython源:小对象分配器中的错误警报已被消声。(由Dhiru Kholia在 bpo-18596

  • Windows版本现在使用 Address Space Layout RandomizationData Execution Prevention .(由Christian Heimes在 bpo-16632

  • 新功能 PyObject_LengthHint() C API是否等同于 operator.length_hint() . (由Armin Ronacher在 bpo-16148

其他改进

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

  • 现在,默认情况下,在支持的系统上的交互式解释器中启用选项卡完成功能。 readline . 默认情况下还启用历史记录,并写入(和读取)文件 ~/.python-history . (由Antoine Pitrou和_ric Araujo在 bpo-5845

  • 使用调用python解释器 --version 现在将版本输出到标准输出而不是标准错误 (bpo-18338 )对 argparse (bpo-18920 )以及其他具有类似脚本的调用功能的模块 (bpo-18922

  • cpython Windows安装程序现在添加了 .pyPATHEXT 变量在注册扩展时,允许用户在Windows命令提示下只键入其名称而不键入 .py 延伸。(保罗·摩尔在 bpo-18569

  • 一个新的 make 目标 coverage-report 将构建python,运行测试套件,并使用 gcovlcov .

  • 这个 -R 选择权 python regression test suite 现在还检查内存分配泄漏,使用 sys.getallocatedblocks() . (由Antoine Pitrou在 bpo-13390

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

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

  • 从单个操作系统模块加载多个python模块 (.so.dll )现在可以正常工作了(以前它静默地返回文件中的第一个python模块)。(V_clav_milauer在 bpo-16421

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

  • 维克多·斯廷纳利用他的 PEP 445 基于 pyfailmalloc 工具 (bpo-18408bpo-18520

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

  • 这个 pyvenv 命令还接受 --without-pip 选项以禁止将PIP自动引导到虚拟环境中。(由Nick Coghlan在 bpo-19552 作为其中的一部分 PEP 453 实施。)

  • 编码名称现在在的值集中是可选的 PYTHONIOENCODING 环境变量。这样就可以只设置错误处理程序,而不更改默认编码。(Serhiy Storchaka在 bpo-18818

  • 这个 bz2lzmagzip 模块 open 功能现在支持 x (独占创建)模式。(蒂姆·希尼和金刚士基·柯克在 bpo-19201bpo-19222bpo-19223

重大优化

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

  • 现在,集的hash冲突成本降低了。现在,每个hash表探测检查一系列连续的相邻键/hash对,然后继续通过hash表进行随机探测。这会利用缓存位置降低冲突解决的成本。碰撞解决方案可以描述为线性探测和开放寻址的混合。附加线性探针的数量默认为9个。这可以在编译时通过将线性探针定义为任意值来更改。设置Linear_Probe=0以完全关闭线性探测。(由Raymond Hettinger在 bpo-18771

  • 解释器启动速度大约快30%。一些措施导致加速。解释器在启动时加载的模块较少,例如 recollectionslocale 默认情况下,模块及其依赖项不再导入。对marshal模块进行了改进,以更快地加载编译后的python代码。(安托万·皮特鲁、克里斯蒂安·海姆斯和维克托·斯廷纳在 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

  • 通过利用字符串的新存储格式,现在对字符串的酸洗速度显著加快。(由Victor Stinner和Antoine Pitrou在 bpo-15596

  • 中的性能问题 io.FileIO.readall() 已经解决。这尤其会影响窗口,并显著加快通过管道传输大量数据的速度。 subprocess . (由Richard Oudkerk在 bpo-15758

  • html.escape() 现在快了10倍。(Matt Bryant在 bpo-18020

  • 在Windows上,本机 VirtualAlloc 现在使用而不是CRT malloc 在里面 obmalloc .人工基准测试显示大约节省了3%的内存。

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

已弃用

本节介绍了各种API和其他在python 3.4中已被弃用的特性,这些特性将在python 3.5或更高版本中被删除。在大多数(但不是所有)情况下,使用不推荐使用的API将产生 DeprecationWarning 当解释器在启用了反预测警告的情况下运行时(例如,通过使用 -Wd

python api中的弃用

不推荐使用的功能

  • 运行 IDLE-n 标志(无子进程)已弃用。但是,只有在 bpo-18823 解决了。

  • 不推荐使用向sys.path添加“site python”目录(如果存在)的站点模块。 (bpo-19375

弃用

不再支持操作系统

已从源和生成工具中删除对以下操作系统的支持:

  • 操作系统/ 2 (bpo-16135

  • Windows 2000(变更集E52DF05B496A)。

  • Windows系统 COMSPEC 指向 command.com (bpo-14470

  • VMS (bpo-16136

API和功能删除

已删除以下过时和以前不推荐使用的API和功能:

  • 未经维护的 Misc/TextMateMisc/vim 目录已被删除(请参见 devguide 关于使用什么的建议)。

  • 这个 SO 已删除makefile宏(它已被替换为 SHLIB_SUFFIXEXT_SUFFIX 宏指令) (bpo-16754

  • 这个 PyThreadState.tick_counter 字段已被删除;自从python 3.2引入“new gil”以来,它的值就毫无意义。 (bpo-19199

  • PyLoaderPyPycLoader 已从中删除 importlib . (由Taras Lyapun在 bpo-15641

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

  • 被蔑视的 urllib.request.Request getter和setter方法 add_datahas_dataget_dataget_typeget_hostget_selectorset_proxyget_origin_req_hostis_unverifiable 已删除(请改用直接属性访问)。

  • 支持加载已弃用的 TYPE_INT64 已从中删除 marshal . (Dan Riti在 bpo-15480

  • inspect.Signature :只有位置参数现在需要有一个有效的名称。

  • object.__format__() 不再接受非空格式字符串,它现在引发 TypeError 相反。自python 3.2以来,不推荐使用非空字符串。此更改是为了防止以前工作(但不正确)的代码在对象获得 __format__ 方法,这意味着您的代码现在可以引发 TypeError 如果使用 's' 使用没有 __format__ 处理它的方法。见 bpo-7994 背景。

  • difflib.SequenceMatcher.isbjunk()difflib.SequenceMatcher.isbpopular() 已在3.2中弃用,现在已删除:使用 x in sm.bjunkx in sm.bpopular 在哪里 sm 是一个 SequenceMatcher 对象 (bpo-13248

代码清理

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

  • 私人和有效未使用的 _gestalt 模块已被删除,同时 platform 功能 _mac_ver_lookup_mac_ver_gstalt_bcd2str 只会在严重损坏的OSX系统上调用(请参见 bpo-18393

  • 某些文件的硬拷贝 stat 包含在 tarfile 模块命名空间已删除。

移植到python 3.4

本节列出了前面描述的更改和可能需要更改代码的其他错误修复。

“python”命令行为的更改

  • 在posix shell中,设置 PATH 环境变量为空值等于根本不设置它。但是,设置 PYTHONPATH 到一个空值是 not 相当于完全不设置:设置 PYTHONPATH 空值等于将其设置为 . 这会导致在类比如何推理时产生混淆。 PATH 作品。该行为现在符合的posix约定 PATH .

  • 这个 [X参考,Y块] 调试输出 (--with-pydebug )默认情况下,cpython解释器的构建现在处于关闭状态。可以使用 -X showrefcount 选择权。(由Ezio Melotti在 bpo-17323

  • python命令和大多数stdlib脚本(以及 argparse 现在输出 --version 信息发送至 stdout 而不是 stderr (有关问题列表,请参阅 其他改进 以上)。

python api中的更改

  • 中定义的ABC importlib.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() 不再引发 ImportError 当加载的源代码触发 SyntaxErrorUnicodeDecodeError . AS ImportError 仅在找不到源代码时才引发,但在发现源代码但结构不正确时,会感觉到它超出了该含义的范围/过载。如果您以前捕获了importerror,并且希望继续忽略语法或解码问题,那么现在就捕获这三个异常。

  • functools.update_wrapper()functools.wraps() 现在正确设置 __wrapped__ 被封装的函数的属性,即使该函数还具有 __wrapped__ 属性集。这意味着 __wrapped__ 属性现在可以正确地链接一堆修饰函数,而不是 __wrapped__ 链中引用最内部函数的属性。假设先前行为是有意的内省库可以使用 inspect.unwrap() 访问链中没有 __wrapped__ 属性。

  • inspect.getfullargspec() 已在 inspect.signature() 因此,它处理的可调用对象比过去要广泛得多。预计在Python3.4系列的过程中,额外的内置和扩展模块可调用文件将获得签名元数据。假定为 inspect.getfullargspec() 非python可调用文件上的will fail可能需要相应地调整。

  • importlib.machinery.PathFinder 现在将当前工作目录传递给 sys.path_hooks 对于空字符串。这导致 sys.path_importer_cache 从不包含 '' 从而迭代 sys.path_importer_cache 基于 sys.path 无法找到所有密钥。模块的 __file__ 当导入到当前工作目录中时,现在也将有一个绝对路径,包括使用时 -m 与口译员(除了 __main__.__file__ 当直接使用相对路径执行脚本时(由Brett Cannon在 bpo-18416 )在命令行上指定) (bpo-18416

  • 移除 strict 参数 HTTPConnectionHTTPSConnection 如果是按位置而不是按关键字指定其余参数,则更改这些参数的含义。如果您一直注意到拒绝警告,那么您的代码应该已经通过关键字指定了任何其他参数。

  • 字符串之间 from __future__ import ... 现在陈述 总是 举起一个 SyntaxError . 以前,如果没有前导docstring,间隙字符串有时会被忽略。这使cpython符合语言规范;jython和pypy已经是。 (bpo-17434

  • ssl.SSLSocket.getpeercert()ssl.SSLSocket.do_handshake() 现在提出一个 OSError 具有 ENOTCONNSSLSocket 未连接,而不是以前引发 AttributeError .此外, getpeercert() 将提高 ValueError 如果握手尚未完成。

  • base64.b32decode() 现在提出一个 binascii.Error 当输入字符串包含非B32字母字符时,而不是 TypeError .这个特别的 TypeError 当另一个 TypeError s已转换。(Serhiy Storchaka在 bpo-18011 注意:这个更改在Python3.3.3中也被无意中应用。

  • 这个 file 属性现在在创建时自动关闭 cgi.FieldStorage 实例被垃圾收集。如果将文件对象从 cgi.FieldStorage 如果不保持实例活动,则应存储整个 cgi.FieldStoragecgi.FieldStorage 实例被垃圾收集。

  • 调用 readwrite 在一个封闭的SSL套接字上,现在引发了一个信息性的 ValueError 而不是以前更神秘的 AttributeError (bpo-9177

  • slice.indices() 不再产生 OverflowError 为了巨大的价值。由于这种解决方案, slice.indices() 现在提出一个 ValueError 如果给定的长度为负;以前它返回无意义的值 (bpo-14794

  • 这个 complex 构造函数,不同于 cmath 功能,接受错误 float 如果对象的 __complex__ 特殊方法返回了一个。这现在引发了 TypeError . (bpo-16290

  • 这个 int 3.2和3.3中的构造函数错误地接受 float 值为 base 参数。不太可能有人这样做,但如果是这样,它现在将提高 TypeError (bpo-16772

  • 现在只计算关键字参数的默认值 之后 常规关键字参数的默认值,而不是之前的。希望没有人写任何依赖于先前错误行为的代码。 (bpo-16967

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

  • 中的参数名称 __annotations__ 听写现在被正确地损坏,类似于 __kwdefaults__ . (由Yury Selivanov在 bpo-20625

  • hashlib.hash.name 现在总是返回小写的标识符。以前,一些内置散列有大写的名称,但是现在它是一个正式的公共接口,命名已经变得一致了。 (bpo-18532

  • 因为 unittest.TestSuite 现在在测试运行后删除对测试的引用,测试重用 TestSuite 重新运行一组测试可能会失败。测试套件不应该以这种方式重新使用,因为它意味着状态在测试运行之间被保留,从而破坏了 unittest 旨在提供。但是,如果认为缺乏隔离是可以接受的,那么可以通过创建 TestSuite 定义一个 _removeTestAtIndex 不起作用的方法(请参见 TestSuite.__iter__() ) (bpo-11798

  • unittest 现在使用 argparse 用于命令行分析。有些无效的命令表单曾经是不允许的;从理论上讲,这不应该导致向后兼容性问题,因为不允许的命令表单没有任何意义,并且不太可能被使用。

  • 这个 re.split()re.findall()re.sub() 函数,以及 group()groups() 方法 match 对象现在总是返回 字节 当要匹配的字符串是 bytes-like object . 以前,返回类型与输入类型匹配,因此如果您的代码依赖于返回值,例如 bytearray ,您需要更改代码。

  • audioop 函数现在在传递字符串输入时立即引发错误,而不是稍后随机失败 (bpo-16685

  • 新的 convert_charrefs 参数 HTMLParser 当前默认为 False 对于向后兼容性,但最终将更改为默认为 True . 建议将具有适当值的关键字添加到 HTMLParser 在您的代码中调用 (bpo-13633

  • 自从 食糜 参数 hmac.new() 函数将来将没有默认值,所有调用 hmac.new() 应更改为显式指定 食糜 (bpo-17276

  • 调用 sysconfig.get_config_var()SO 关键还是看 SO 在调用结果中 sysconfig.get_config_vars() 已弃用。这把钥匙应该换成 EXT_SUFFIXSHLIB_SUFFIX ,取决于上下文 (bpo-19555

  • 任何调用 open 指定的函数 U 应该修改。 U 在python3中无效,如果使用,最终会产生错误。根据函数的不同,可以使用 newline 参数,或者在必要时将流封装在 TextIOWrapper 使用它 newline 参数 (bpo-15204

  • 如果你使用 pyvenv 在一个脚本和愿望,匹普 not 必须添加 --without-pip 命令调用。

  • 的默认行为 json.dump()json.dumps() 当指定的缩进已更改时:它不再在行尾分隔逗号的项后产生尾随空格。只有当您的测试正在对这些输出进行对空白区域敏感的比较时,这才重要。 (bpo-16333

  • doctest 现在在扩展模块中查找doctest __doc__ 字符串,因此,如果doctest测试发现包含扩展模块,并且扩展模块中的内容与doctest类似,那么在运行测试时,您可能会看到以前从未见过的测试失败。 (bpo-3158

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

C API中的更改

在3.4.3中更改

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

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)