What’s New In Python 3.4

作者:R. David Murray <rdmurray@bitdance.com> (Editor)

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

也可以看看

PEP 429 - Python 3.4发布计划

Summary – Release Highlights

新语法特性:

  • 在Python 3.4中未添加新的语法。

其他新功能:

新库模块:

显着改进库模块:

安全改进:

CPython实现改进:

请阅读面向用户的更改的完整列表,包括许多其他较小的改进,CPython优化,弃用和潜在的移植问题。

New Features

PEP 453: Explicit Bootstrapping of PIP in Python Installations

Bootstrapping pip By Default

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

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

pyvenv命令行实用程序和venv模块使用ensurepip模块使pip环境。When using the command line utility, pip is installed by default, while when using the venv module API installation of pip must be requested explicitly.

For CPython source builds on POSIX systems, the make install and make altinstall commands bootstrap pip by default. 此行为可以通过配置选项控制,并通过Makefile选项覆盖。

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

作为在PEP中讨论的,平台包装器可以选择不默认地安装这些命令,只要在被调用时,它们提供关于如何在该平台上安装它们的清楚和简单的指示(通常使用系统包管理器)。

注意

为了避免并行Python 2和Python 3安装之间的冲突,当调用ensurepip时,只有版本化的pip3pip3.4命令被默认引导直接 - 需要--default-pip选项来请求未版本化的pip命令。pyvenv和Windows安装程序确保在这些环境中提供不合格的pip命令,pip总是可以通过-m切换,而不是直接避免使用多个Python安装的系统上的歧义。

Documentation Changes

作为此更改的一部分,文档的Installing Python ModulesDistributing Python Modules部分已完全重新设计为简短入门和常见问题文档。大多数包装文档现已移至Python包装管理局维护的Python包装用户指南和各个项目的文档。

但是,由于此迁移目前仍不完整,这些指南的旧版本仍保留为Installing Python Modules (Legacy version)Distributing Python Modules (Legacy version)

也可以看看

PEP 453 - 在Python安装中显式引导pip
PEP由Donald Stufft和Nick Coghlan编写,由Donald Stufft,Nick Coghlan,Martin vonLöwis和Ned Deily执行。

PEP 446: Newly Created File Descriptors Are Non-Inheritable

PEP 446使新创建的文件描述器non-inheritable一般来说,这是应用程序想要的行为:当启动一个新进程时,当前打开的文件也在新进程中打开可能导致各种各样的难以找到的错误,并可能导致安全问题。

然而,有时候需要继承。为了支持这些情况,提供了以下新功能和方法:

也可以看看

PEP 446 - 创建新创建的文件描述器不可继承
PEP由Victor Stinner编写和实施。

Improvements to Codec Handling

自从第一次引入以来,codecs模块总是用作类型中立的动态编码和解码系统。但是,它与Python文本模型(特别是内置strbytesbytearray类型上的类型限制方便方法)掩盖了这一事实。

作为澄清情况的关键步骤,现在可以在Python 2.7,3.3和3.4中正确记录codecs.encode()codecs.decode()便利函数。这些函数存在于codecs模块中(并且已经被回归测试套件覆盖),因为Python 2.4以前只能通过运行时内省发现。

strbytesbytearray上的方便方法不同,codecs方便功能支持任意编解码器,和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 TransformsText Transforms中详细说明。

(由Nick Coghlan在问题7475问题17827问题17828问题19619提供)

PEP 451: A ModuleSpec Type for the Import System

PEP 451提供了有关导入机制将用来加载模块的信息(即模块规范)的封装。这有助于简化导入实现和几个导入相关的API。这种变化也是几个未来进口相关改进的垫脚石。

PEP的面向公众的变化是完全向后兼容的。此外,它们应该对每个人都是透明的,但对进口商的作者是透明的。主键查找器和加载器方法已被弃用,但它们将继续工作。新进口商应使用PEP中描述的新方法。应更新现有进口商以实施新方法。有关应替换的方法及其替换的列表,请参阅Deprecated部分。

Other Language Changes

对核心Python语言所做的一些小改动是:

  • Unicode数据库更新为UCD版本6.3。
  • min()max()现在接受一个默认关键字参数,可用于指定它们返回的值正在评估没有元素。(由Julian Berman在issue 18111提供。)
  • 模块对象现在为weakref'。
  • 当直接使用相对路径执行脚本时,模块__file__属性(和相关值)现在应始终包含绝对路径,唯一的例外是__main__.__file__(由Brett Cannon在issue 18416中提供。)
  • 除了使用surrogatepass错误处理程序,除UTF-16解码器(它接受有效的代理对之外),所有UTF- *编解码器(UTF-7除外)现在在编码和解码期间都拒绝代理)和UTF-16编码器(它们在编码非BMP字符时产生它们)。(由Victor Stinner,Kang-Hao(Kenny)Lu和Serhiy Storchaka撰写,发行12892。)
  • 新德国EBCDIC codec cp273(由Michael Bierenfeld和Andrew Kuchling在问题1097797中提供。)
  • 新乌克兰语codec cp1125(由Serhiy Storchaka提供在issue 19668。)
  • bytes .join()和bytearray .join()现在接受任意缓冲区对象作为参数。(由Antoine Pitrou在发行15958提供。)
  • int构造函数现在接受任何具有基本参数的__index__方法的对象。(由Mark Dickinson在issue 16772中提供。)
  • 框架对象现在有一个clear()方法,清除框架中对局部变量的所有引用。(由Antoine Pitrou提供issue 17934。)
  • memoryview现在注册为Sequence,并支持reversed()内置。(由Nick Coghlan和Claudiu Popa在问题18690问题19078提供)。
  • Signatures reported by help() have been modified and improved in several cases as a result of the introduction of Argument Clinic and other changes to the inspect and pydoc modules.
  • __length_hint__()现在是形式语言规范的一部分(参见 PEP 424)。(由Armin Ronacher在问题16148中提供。)

New Modules

asyncio

新的asyncio模块(在 PEP 3156中定义)为Python提供了标准的可插入事件循环模型, ,并使其他事件循环实现更容易与标准库和彼此互操作。

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

也可以看看

PEP 3156 - 异步IO支持重新启动:“asyncio”模块
PEP编写和实现由Guido van Rossum领导。

ensurepip

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

ensurepip包含pip的捆绑副本,与其发布的CPython版本的首次发布候选版本相同(这适用于维护版本和功能版本)。ensurepip不能访问互联网。如果安装具有Internet访问权限,在运行ensurepip之后,捆绑的pip可用于将pip升级到捆绑的版本。(请注意,此类升级版本的pip被视为单独安装的软件包,如果卸载了Python,则不会将其删除。)

模块名为确保 pip,因为如果在pip已经安装时调用,它不会做任何事情。It also has an --upgrade option that will cause it to install the bundled copy of pip if the existing installed version of pip is older than the bundled copy.

enum

新的enum模块(在 PEP 435中定义)提供了枚举类型的标准实现,允许其他模块(例如socket

也可以看看

PEP 435 - 向Python标准库添加枚举类型
PEF由巴里华沙,Eli Bendersky和Ethan Furman编写,由Ethan Furman执行。

pathlib

新的pathlib模块提供了表示具有适合于不同操作系统的语义的文件系统路径的类。路径类在纯路径具体路径之间划分,它提供纯粹的计算操作,而不是I / O,它继承纯路径,但也提供I / O操作。

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

也可以看看

PEP 428 - pathlib模块 - 面向对象的文件系统路径
PEP由Antoine Pitrou编写和实施。

selectors

The new selectors module (created as part of implementing PEP 3156) allows high-level and efficient I/O multiplexing, built upon the select module primitives.

statistics

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

也可以看看

PEP 450 - 将统计模块添加到标准库
PEP由Steven D'Aprano编写和实施

tracemalloc

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

  • 跟踪分配对象的位置
  • 每个文件名和每行编号分配的内存块的统计信息:已分配内存块的总大小,数量和平均大小
  • 计算两个快照之间的差异以检测内存泄漏

也可以看看

PEP 454 - 添加新的tracemalloc模块以跟踪Python内存分配
PEP由Victor Stinner编写和实施

Improved Modules

abc

新函数abc.get_cache_token()可用于知道何时使受对象图中的更改影响的缓存失效。(由ŁukaszLanga撰写,issue 16832。)

新类ABC具有ABCMeta作为其元类。使用ABC作为基类与指定metaclass=abc.ABCMeta具有基本相同的效果,但更容易输入和更容易阅读。(由Bruno Dupuis提供,载于第16049期。)

aifc

getparams()方法现在返回一个namedtuple而不是一个简单的元组。(Contributed by Claudiu Popa in issue 17818。)

aifc.open()现在支持上下文管理协议:当在with块时,返回对象的close()在块的末尾自动调用。(由Serhiy Storchacha提供在问题16486。)

writeframesraw()writeframes()方法现在接受任何bytes-like object(由Serhiy Storchaka在issue 8311中提供。)

argparse

FileType类现在接受编码错误参数,传递到open()(由Lucas Maystre提供,载于issue 11175。)

audioop

audioop现在支持24位样本。(由Serhiy Storchaka提供issue 12866。)

新的byteswap()函数将big-endian样本转换为little-endian,反之亦然。(由Serhiy Storchaka在issue 19641中提供。)

所有audioop函数现在接受任何bytes-like object字符串不被接受:他们以前没有工作,现在他们引发一个错误马上。(由Serhiy Storchaka在问题16685中提供。)

base64

The encoding and decoding functions in base64 now accept any bytes-like object in cases where it previously required a bytes or bytearray instance. (由Nick Coghlan在问题17839中提供。)

New functions a85encode(), a85decode(), b85encode(), and b85decode() provide the ability to encode and decode binary data from and to Ascii85 and the git/mercurial Base85 formats, respectively. a85函数具有可用于使它们与Ascii85编码的变体(包括Adobe变体)兼容的选项。(由Martin Morrison撰写,Mercurial项目,Serhiy Storchaka和Antoine Pitrou在问题17618。)

collections

ChainMap.new_child()方法现在接受m参数,指定要添加到链中的子映射。这允许为孩子使用现有的映射和​​/或自定义映射类型。(Contributed by Vinay Sajip in issue 16613。)

colorsys

用于RGB-YIQ转换的系数中的位数已经被扩展,使得它们匹配FCC NTSC版本。结果的变化应小于1%,并可能更好地匹配其他地方的结果。(由Brian Landers和Serhiy Storchaka在issue 14323提供。)

contextlib

新的contextlib.suppress上下文管理器有助于澄清有意从单个语句中抑制异常的代码的意图。(由Raymond Hettinger在issue 15806和Zero Piraeus在问题19266中提供)。

新的contextlib.redirect_stdout()上下文管理器使实用程序脚本更容易处理不灵活的API,将其输出写入sys.stdout,并且不提供任何重定向选项它。使用上下文管理器,可以将sys.stdout输出重定向到任何其他流或与io.StringIO结合的字符串。后者可以是特别有用的,例如,捕获来自被实现命令行接口的函数的输出。它仅推荐用于实用程序脚本,因为它会影响sys.stdout的全局状态。(由Raymond Hettinger在issue 15805中提供。)

contextlib文档也已更新,以包含单次使用,可重用和可重用上下文管理器之间差异的discussion

dbm

dbm.open()对象现在支持上下文管理协议。当在with语句中使用时,数据库对象的close方法将在块结束时自动调用。(由Claudiu Popa和Nick Coghlan在issue 19282中提供。)

dis

Functions show_code(), dis(), distb(), and disassemble() now accept a keyword-only file argument that controls where they write their output.

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,用于以人类可读的形式和迭代指令检查字节码。The Bytecode constructor takes the same arguments that get_instruction() does (plus an optional current_offset), and the resulting object can be iterated to produce Instruction objects. 但它也有一个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在问题11816和Claudiu Popa在问题17916提供)

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

doctest

当检测到第一个故障时,新的option flagFAIL_FAST暂停测试运行。(由R. David Murray和Daniel Urban在问题16522中提供。)

doctest命令行界面现在使用argparse,并且有两个新选项:-o-f-o允许在命令行上指定doctest options-f/ t17> FAIL_FAST(以并入unittest CLI支持的类似选项)。(由R.David Murray提供在issue 11390。)

doctest现在将在扩展模块__doc__中找到doctests。(由Zachary Ware提供issue 3158。)

email

as_string()现在接受policy参数,以在生成消息的字符串表示时覆盖消息的默认策略。这意味着as_string现在可以在更多情况下使用,而不必创建和使用generator,以将格式化参数传递到flatten(由R. David Murray提供,issue 18600。)

新方法as_bytes()以类似于as_string生成字符串表示的方式添加以产生消息的字节表示。它不接受maxheaderlen参数,但接受unixfrom策略参数。Message __bytes__()方法调用它,意味着bytes(mymsg)现在将产生直观的结果:信息。(由R. David Murray提供,issue 18600。)

Message.set_param()消息现在接受替换关键字参数。指定时,将更新关联的头,而不更改其在头列表中的位置。为了向后兼容,默认值为False(由R. David Murray提供,issue 18891。)

A pair of new subclasses of Message have been added (EmailMessage and MIMEPart), along with a new sub-module, contentmanager and a new policy attribute content_manager. 所有文档目前都在新模块中,该模块将作为电子邮件新的provisional API的一部分添加。这些类提供了许多新方法,使得从电子邮件中提取内容和将内容插入到电子邮件中更容易。有关详情,请参阅contentmanager文档和Examples using the Provisional API这些API添加完成了计划作为email6项目一部分的大部分工作。当前临时API计划在Python 3.5中成为最终的(可能在错误处理领域有一些小的添加)。(由R. David Murray提供,issue 18891。)

filecmp

新的clear_cache()函数提供清除filecmp比较缓存的功能,它使用os.stat()信息来确定文件自上次比较以来发生了变化。例如,如果文件可能已经在比特定文件系统的文件修改时间字段的分辨率更短的时间内被改变和重新检查,则可以使用这种方式。(由Mark Levitt在issue 18149中提供。)

新模块属性DEFAULT_IGNORES提供用作dircmp()函数的忽略参数的默认值的目录列表。(由Eli Bendersky提供在issue 15442。)

functools

新的partialmethod()描述器将部分参数应用程序带到描述器,就像partial()提供正常可调用。新的描述器也使包含在类定义中的任意可调用对象(包括partial()实例)更容易表现得像正常实例方法。(由Alon Horev和Nick Coghlan在issue 4331中提供。)

新的singledispatch()装饰器支持单分派通用函数到Python标准库。在面向对象编程集中于将一组公共数据集合到一个类中时,通用函数集中于对操作的多个实现进行分组,以允许它使用不同种类的数据。

也可以看看

PEP 443 - 单分派通用功能
PEP由ŁukaszLanga编写和实施。

total_ordering()现在支持从底层比较函数返回值NotImplemented(由Katie Miller在issue 10042中提供。)

partial()函数的纯python版本现在在stdlib中;在CPython中,它被C加速版覆盖,但它可供其他实现使用。(由Brian Thorne在issue 12428中提供。)

gc

新函数get_stats()返回包含自解析器启动后的容器统计信息的三个每代字典的列表。(由Antoine Pitrou提供,载于issue 16351。)

glob

新函数escape()提供了一种方法来转义文件名中的特殊字符,以使它们不会成为globbing扩展的一部分,而是字面上匹配。(由Serhiy Storchaka在issue 8402中提供。)

hashlib

新的hashlib.pbkdf2_hmac()函数提供PKCS#5基于密码的密钥导出函数2(Contributive by Christian Heimes in issue 18582。)

hashlib哈希对象的name属性现在是一个正式支持的接口。它总是存在于CPython的hashlib(虽然它没有返回所有支持的散列的小写名称),但它不是一个公共接口,所以一些其他Python实现以前没有支持它。(由Jason R. Coombs在issue 18532中提供。)

hmac

hmac now accepts bytearray as well as bytes for the key argument to the new() function, and the msg parameter to both the new() function and the update() method now accepts any type supported by the hashlib module. (由JonasBorgström在issue 18240中提供。)

hmac.new()函数的digestmod参数现在可以是由hashlib识别的任何哈希摘要名称。此外,不建议使用digestmod的值默认为MD5的当前行为:在Python的未来版本中,不会有默认值。(Contributo by Christian Heimes in issue 17276。)

通过添加block_sizename属性(和digest_size属性的形式文档),hmac现在完全符合 PEP 247 API。(Contribute by Christian Heimes in issue 18775。)

html

新函数unescape()函数将HTML5字符引用转换为相应的Unicode字符。(由Ezio Melotti在issue 2927中提供。)

HTMLParser接受新的关键字参数convert_charrefs,当True时,会自动转换所有字符引用。对于向后兼容性,其值默认为False,但在未来版本的Python中它将更改为True,因此请您明确设置它并更新代码以使用此新功能。(由Ezio Melotti在issue 13633中提供。)

HTMLParserstrict参数现已弃用。(由Ezio Melotti在issue 15114中提供。)

http

send_error()现在接受可选的附加说明参数,可用于提供扩展错误描述,覆盖硬编码的默认值(如果有的话)。此扩展错误描述将​​使用error_message_format属性格式化,并作为错误响应的正文发送。(供稿人:Karl Cow,第12921期。)

http.server command line interface现在有一个-b/--bind选项,使服务器侦听特定地址。(由Malte Swart在问题17764提供。)

idlelib and 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) t4 >(由Eric Snow和Brett Cannon撰写,问题15627。)

InspectLoader现在还具有get_code()方法的默认实现。但是,出于性能原因,通常需要覆盖默认实现。(由Brett Cannon在issue 18072中提供。)

作为imp模块弃用的一部分,reload()函数已从imp移动到importlib(由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 bootstrap NamespaceLoader现在符合InspectLoader ABC,这意味着runpypython -m现在可以与命名空间包一起使用。(由Brett Cannon在issue 18058中提供。)

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

importlib.machinery.ExtensionFileLoader现在有一个get_filename()方法。这在最初的实现中被无意地省略。(由Eric Snow在issue 19152中提供。)

inspect

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

unwrap()可以轻松地解开由functools.wraps()(以及任何其他设置__wrapped__属性)创建的包装函数链包装函数)。(由Daniel Urban,Aaron Iles和Nick Coghlan在问题13266提供。)

作为新enum模块实现的一部分,inspect模块现在对自定义__dir__方法和动态类属性元类。(由Ethan Furman在第18929期发行19030提供)。

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

signature()现在支持鸭类型的CPython函数,这增加了对使用Cython编译的函数的支持。(由Stefan Behnel和Yury Selivanov在问题17159提供。)

ipaddress

ipaddress作为provisional API添加到Python 3.3中的标准库中。随着Python 3.4的发布,此资格已被删除:ipaddress现在被认为是一个稳定的API,涵盖了正常的标准库要求,以保持向后兼容性。

如果地址是全球可路由的,则新的is_global属性为True(由Peter Moody提供在issue 17400。)

logging

TimedRotatingFileHandler有一个新的atTime参数,可用于指定发生翻转的时间。(由Ronald Oussoren在issue 9556中提供。)

SocketHandlerDatagramHandler现在支持Unix域套接字(通过将端口设置为None)。(由Vinay Sajip提交,提交ce46195b56a9.)

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

通过logging.config.listen()函数从套接字接收的日志配置数据现在可以通过提供验证函数作为新验证的参数进行处理之前进行验证,关键字参数。(Contributed by Vinay Sajip in issue 15452。)

marshal

默认的marshal版本已更改为3。实现新版本的代码恢复了Python2的行为,只记录一个互联字符串的副本,并保留反序列化的实现,并将这种“一个副本”能力扩展到任何对象类型(包括处理递归引用)。这减少了.pyc文件的大小和模块从.pyc(或.pyo(由KristjánValurJónsson在问题16475 t>中提供,由Antoine Pitrou在问题19219中增加了加速)。

mmap

mmap对象现在可以weakref ed。(由Valerie Lambert在issue 4885提供。)

multiprocessing

在Unix上,已经添加了两个新的start methodsspawnforkserver,用于使用multiprocessing启动进程。这些使得进程与线程的混合更加健壮,并且spawn方法匹配多处理在Windows上始终使用的语义。新功能get_all_start_methods()报告平台上可用的所有启动方法,get_start_method()报告当前启动方法,set_start_method()(由Richard Oudkerk在issue 8713中提供。)

multiprocessing现在还具有context的概念,它确定如何创建子进程。新函数get_context()返回使用指定的start方法的上下文。它具有与multiprocessing模块本身相同的API,因此您可以使用它来创建Pool和在该上下文中操作的其他对象。这允许框架和应用或相同应用的不同部分使用多处理而不彼此干扰。(由Richard Oudkerk在issue 18999中提供。)

除了使用旧的fork start方法时,子进程不再从父进程(问题8713的一部分)继承不需要的句柄/文件描述器。

multiprocessing现在依靠runpy(实现-m开关)在子进程中适当地初始化__main__ spawnforkserver启动方法。这解决了一些边缘情况,其中组合多处理,-m命令行开关和显式相对导入可能导致子进程中的模糊故障。(由Nick Coghlan提供,载于issue 19946。)

operator

新函数length_hint()提供了如何使用__length_hint__()特殊方法作为 PEP 424这种语言特征的形式规范。(由Armin Ronacher在问题16148中提供。)

现在有一个纯python版本的operator模块可供参考和供Python的替代实现使用。(由Zachary Ware提供问题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,and Charles-FrançoisNatali in issue 17914提供。)

os.path.samestat()现在可在Windows平台上使用(os.path.samefile()实现现在在Unix和Windows之间共享)。(由Brian Curtin在issue 11939中提供。)

os.path.ismount()现在可以识别安装在Windows驱动器根目录下的卷。(由Tim Golden在issue 9035中提供。)

os.open()在提供它们的平台上支持两个新标志O_PATH(未打开的文件描述器)和O_TMPFILE临时文件;从3.4.0版本开始,仅在具有uapi头的内核版本为3.11或更高版本的Linux系统上可用)。(分别由Christian Heimes在问题18673和Benjamin Peterson提供)。

pdb

pdb has been enhanced to handle generators, yield, and yield from in a more useful fashion. 这在调试基于asyncio的程序时特别有用。(由Andrew Svetlov和Xavier de Gaye提供,问题16596。)

已从pdb中删除print命令,从pdb命令行恢复对Python print()函数的访问。Python2的pdb没有print命令;而是输入print来执行print语句。在Python3中,print被错误地作为pdb p命令的别名。p, however, prints the repr of its argument, not the str like the Python2 print command did. 更糟糕的是,Python3 pdb 打印命令隐藏了Python3 print函数,使其无法在pdb提示。(由Connor Osborn提供在issue 18764。)

pickle

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

也可以看看

PEP 3154 - Pickle协议4
PEP由Antoine Pitrou编写,由Alexandre Vassalotti执行。

plistlib

plistlib现在具有类似于stdlib序列化协议的标准模式的API,新的load()dump()loads()dumps()函数。(旧版API现已淘汰。)除了已经支持的XML plist格式(FMT_XML),它现在还支持二进制plist格式(FMT_BINARY)。(由Ronald Oussoren和其他人在问题14455提供。)

poplib

已向poplib添加了两种新方法:capa(),它返回POP服务器发布的功能列表,stls() ,如果POP服务器支持,将明文POP3会话切换到加密的POP3会话。(由Lorenzo Catucci提供,载于issue 4473。)

pprint

The pprint module’s PrettyPrinter class and its pformat(), and pprint() functions have a new option, compact, that controls how the output is formatted. 目前将compact设置为True意味着序列将打印与每个(缩进)行上适合width的序列元素一样多的序列元素。(由Serhiy Storchaka在issue 19132提供。)

长字符串现在使用Python的正常行连续语法包装。(由Antoine Pitrou在问题17150提供。)

pty

pty.spawn()现在返回子进程上的os.waitpid()的状态值,而不是None(供稿:Gregory P.史密斯。)

pydoc

pydoc模块现在直接基于inspect.signature()自检API,允许它为更多种类的可调用对象提供声明信息。此更改还意味着显示帮助信息时,现在会考虑__wrapped__属性。(由Larry Hastings在issue 19674中提供。)

pydoc模块不再显示已绑定方法的self参数。相反,它旨在始终显示所提供的可调用的当前声明的当前声明。(由Larry Hastings在问题20710中提供。)

In addition to the changes that have been made to pydoc directly, its handling of custom __dir__ methods and various descriptor behaviours has also been improved substantially by the underlying changes in the inspect module.

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

re

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

regex objects的repr现在包括模式和标志; match objects的repr现在包括开始,结束和匹配的字符串的部分。(由Hugo Lopes Tavares和Serhiy Storchaka在问题13592问题17087提供)。

resource

新的prlimit()函数可用于内核版本为2.6.36或更高版本和glibc为2.13或更高版本的Linux平台上,可以查询或设置除一个以外的进程的资源限制打电话。(由Christian Heimes提供,问题16595。)

在Linux内核版本2.6.36或更高版本上,还有一些新的Linux特定常量:RLIMIT_MSGQUEUERLIMIT_NICERLIMIT_RTPRIORLIMIT_RTTIMERLIMIT_SIGPENDING(Contributed by Christian Heimes in issue 19324。)

在FreeBSD版本9和更高版本上,有一些新的FreeBSD特定常量:RLIMIT_SBSIZERLIMIT_SWAPRLIMIT_NPTS(Contributed by Claudiu Popa in issue 19343。)

select

epoll对象现在支持上下文管理协议。当在with语句中使用时,close()方法将在块结束时自动调用。(由Serhiy Storchaka在问题16488中提供。)

devpoll对象现在具有fileno()close()方法,以及一个新属性closed(由Victor Stinner在发行18794提供。)

shelve

Shelf实例现在可以在with语句使用,并且将在with块结束时自动关闭。(由FilipGruszczyński撰写,第13896期。)

shutil

copyfile()现在引用特定的Error子类,SameFileError,当源和目标是同一个文件时,动作对这个特定的错误。(由Atsuo Ishimoto和Hynek Schlawack提供,issue 1492704。)

smtpd

The SMTPServer and SMTPChannel classes now accept a map keyword argument which, if specified, is passed in to asynchat.async_chat as its map argument. 这允许应用程序避免影响全局套接字映射。(Contributed by Vinay Sajip in issue 11959。)

smtplib

SMTPException现在是OSError的子类,允许在一个try / except语句中通过代码捕获套接字级错误和SMTP协议级错误,这些代码只关心是否发生错误。(由Ned Jackson Lovely在issue 2118发表)。

socket

套接字模块现在在支持它的平台上支持CAN_BCM协议。(由Brian Thorne在发行15359提供。)

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

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

AF_LINK常数现在可在BSD和OSX上使用。

inet_pton()inet_ntop()现在在Windows上受支持。(由Atsuo Ishimoto在issue 7171中提供。)

sqlite3

A new boolean parameter to the connect() function, uri, can be used to indicate that the database parameter is a uri (see the SQLite URI documentation). (由poq提供在issue 13773。)

ssl

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

新函数create_default_context()提供了一种获得SSLContext的标准方法,其设置旨在实现兼容性和安全性之间的合理平衡。这些设置比由SSLContext构造函数提供的默认设置更严格,如果最佳实践安全性要求更改,可以在将来调整,而无需事先弃用。The new recommended best practice for using stdlib libraries that support SSL is to use create_default_context() to obtain an SSLContext object, modify it if needed, and then pass it as the context argument of the appropriate stdlib API. (由Christian Heimes提供,载于第19689期。)

SSLContext方法load_verify_locations()接受一个新的可选参数cadata,可用于通过字符串或字节直接提供PEM或DER编码的证书,分别。(Contributed by Christian Heimes in issue 18138。)

New function get_default_verify_paths() returns a named tuple of the paths and environment variables that the set_default_verify_paths() method uses to set OpenSSL’s default cafile and capath. 这可以帮助调试默认验证问题。(Contributo by Christian Heimes in issue 18143。)

SSLContext有一个新方法cert_store_stats(),报告载入的X.509证书数量,X。 509 CA证书和证书撤销列表(crl)以及get_ca_certs()返回加载的CA证书的列表。(Contribute by Christian Heimes in issue 18147。)

如果OpenSSL 0.9.8或更高版本可用,则SSLContext有一个新属性verify_flags,可用于控制证书验证过程,将其设置为新常量的某种组合VERIFY_DEFAULTVERIFY_CRL_CHECK_LEAFVERIFY_CRL_CHECK_CHAINVERIFY_X509_STRICT默认情况下,OpenSSL不执行任何CRL验证。(由Christien Heimes提供,载于issue 8813。)

SSLContext方法load_default_certs()从默认位置加载一组默认的“证书颁发机构”(CA)证书,这取决于平台。它可以用于加载用于客户端用于验证服务器的两个TLS Web服务器认证证书(purpose= SERVER_AUTH),以及用于验证服务器的证书客户端证书(purpose= CLIENT_AUTH)。(由Christian Heimes提供,issue 19292。)

两个新的仅限Windows的函数enum_certificates()enum_crls()提供从Windows证书存储检索证书,证书信息和CRL的功能。(Contributed by Christian Heimes in issue 17134。)

使用新的ssl.SSLContext.set_servername_callback()方法支持服务器端SNI(服务器名称指示)。(由Daniel Black在发行8109提供。)

SSLSocket.getpeercert()返回的字典包含其他X509v3扩展项:crlDistributionPointscalIssuersOCSP URI。(Contributed by Christian Heimes in issue 18379。)

stat

stat模块现在由_stat中的C实现支持。需要C实现,因为大多数值不是标准化的并且是平台相关的。(由Christian Heimes撰写,问题11016。)

该模块支持新的ST_MODE标志,S_IFDOORS_IFPORTS_IFWHT(由Christian Hiemes在问题11016中提供。)

struct

新函数iter_unpack和新的struct.Struct.iter_unpack()方法提供了一个包含给定格式数据的重复实例的缓冲区分割。(由Antoine Pitrou在issue 17804中提供。)

subprocess

check_output()现在接受可用于为运行的命令提供stdin内容的输入参数。(由Zack Weinberg撰写,issue 16624。)

getstatus()getstatusoutput()现在可在Windows上运行。这种变化实际上是在3.3.4中做出的。(由Tim Golden在issue 10197中提供。)

sunau

getparams()方法现在返回一个namedtuple而不是一个简单的元组。(Contributed by Claudiu Popa in issue 18901。)

sunau.open()现在支持上下文管理协议:当在with块时,返回对象的close方法将被调用自动在块的结尾。(由Serhiy Storchaka在issue 18878中提供。)

AU_write.setsampwidth()现在支持24位采样,因此增加了使用模块编写24个采样的支持。(由Serhiy Storchaka在issue 19261提供。)

writeframesraw()writeframes()方法现在接受任何bytes-like object(由Serhiy Storchaka在issue 8311中提供。)

sys

新函数sys.getallocatedblocks()返回解释器分配的当前块数。(在CPython中,使用默认的--with-pymalloc设置,这是通过PyObject_Malloc() API进行的分配。这可以用于跟踪内存泄漏,特别是如果通过测试套件自动化。(由Antoine Pitrou提供,载于issue 13390。)

当Python解释器以interactive mode开始时,它会检查sys模块上的__interactivehook__属性。如果属性存在,则在交互模式开始之前,不使用参数调用其值。在读取 PYTHONSTARTUP文件后进行检查,因此可以在此处进行设置。The site module sets it to a function that enables tab completion and history saving (in ~/.python-history) if the platform supports readline. 如果您不想使用此新行为,可以在 PYTHONSTARTUPsitecustomizeusercustomize通过从sys删除此属性(或将其设置为某个其他可调用项)。(由ÉricAraujo和Antoine Pitrou提供,载于issue 5845。)

tarfile

当作为脚本直接调用或通过-m调用时,tarfile模块现在支持一个简单的Command Line Interface。这可以用于创建和提取tarfile档案。(由Berker Peksag提供在issue 13477。)

textwrap

TextWrapper类有两个新的属性/构造函数参数:max_lines,用于限制输出中的行数,placeholder字符串,如果由于max_lines而被截断,它将出现在输出结尾处。Building on these capabilities, a new convenience function shorten() collapses all of the whitespace in the input to single spaces and produces a single line of a given width that ends with the placeholder (by default, [...]). (由Antoine Pitrou和Serhiy Storchaka在问题18585问题18725提供)。

threading

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

traceback

新的traceback.clear_frames()函数接收一个跟踪对象,并清除其引用的所有帧中的局部变量,从而减少内存消耗量。(由Andrew Kuchling提供issue 1565525。)

types

新的DynamicClassAttribute()描述器提供了一种方法来定义通过实例对象查找时正常工作的属性,但路由到 __getattr__时,通过类查找。这允许在类上具有活动属性,并且在类上具有相同名称的虚拟属性(例如,参见Enum)。(由Ethan Furman在issue 19030提供。)

urllib

urllib.request现在通过DataHandler类支持data:(由MathiasPanzenböck在issue 16423中提供。)

现在可以通过在子类上设置method类属性来指定Request类将使用的http方法。(由Jason R Coombs在问题18978中提供。)

Request对象现在可以重用:如果修改full_urldata属性,所有相关的内部属性都会更新。这意味着,例如,现在可以在多个OpenerDirector.open()调用中使用与数据 t6不同的Request >参数,或修改Requesturl,而不是从头重新计算。还有一个新的remove_header()方法,可用于从Request中删除标题。(由Alexey Kachayev在问题16464中提供,Daniel Wozniak在问题17485和Damien Brecht和Senthil Kumaran在问题17272

HTTPError对象现在具有headers属性,用于访问与错误相关联的HTTP响应标头。(由Berker Peksag提供在issue 15701。)

unittest

TestCase类有一个新方法subTest(),它产生一个上下文管理器,其with块成为一个“子测试”。这个上下文管理器允许测试方法通过例如在循环中调用subTest上下文管理器来动态地生成子测试。因此,单个测试方法可以产生不定数量的单独识别和单独计数的测试,即使其中一个或多个失败,所有这些测试也将运行。例如:

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

将导致六个子测试,每个在单元测试详细输出中标识,其具有由变量名称i组成的标签和该变量的特定值(i=0i=1等)。有关此示例的完整版本,请参见Distinguishing test iterations using subtests(由Antoine Pitrou在问题16997提供。)

unittest.main()现在接受defaultTest的测试名称的迭代,之前它只接受一个测试名称作为字符串。(由Jyrki Pulliainen在issue 15132中提供。)

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

discover()现在排序发现的文件以提供一致的测试顺序。(由Martin Melin和Jeff Ramnani在issue 16709中提供。)

TestSuite现在在测试运行后立即删除对测试的引用,如果测试成功。在Python解释器,做垃圾容器,这允许测试是垃圾收集,如果没有其他任何东西保持测试的引用。可以通过创建定义自定义_removeTestAtIndex方法的TestSuite子类来覆盖此行为。(由Tom Wardill,Matt McClure和Andrew Svetlov在问题11798中供稿。)

新的测试断言上下文管理器assertLogs()将确保给定的代码块使用logging模块发出日志消息。默认情况下,消息可以来自任何记录器,优先级为INFO或更高,但可以指定记录器名称和备用最小记录级别。可以查询上下文管理器返回的对象是否记录了LogRecord和/或格式化的消息。(由Antoine Pitrou在问题18937中提供。)

测试发现现在可与命名空间包一起使用(由Claudiu Popa在问题17457中提供)。

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

mock_open()对象现在具有readlinereadlines方法。(由Toshio Kuratomi提供在issue 17467。)

venv

venv现在包含cshfish shell的激活脚本。(由Andrew Svetlov在问题15417中提供。)

EnvBuildercreate()方便函数带有一个新的关键字参数with_pip,默认为False无论EnvBuilder是否确保pip安装在虚拟环境中。(由Nick Coghlan在issue 19552中作为 PEP 453实施的一部分提供)。

wave

getparams()方法现在返回一个namedtuple而不是一个简单的元组。(Contributed by Claudiu Popa in issue 17487。)

wave.open()现在支持上下文管理协议。(Contributed by Claudiu Popa in issue 17616。)

wave现在可以write output to unseekable files(由David Jones,Guilherme Polo和Serhiy Storchaka在issue 5202提供。)

writeframesraw()writeframes()方法现在接受任何bytes-like object(由Serhiy Storchaka在issue 8311中提供。)

weakref

新的WeakMethod类模拟绑定方法的弱引用。(由Antoine Pitrou在问题14631中提供。)

新的finalize类可以在对象被垃圾回收时注册要调用的回调,而无需仔细管理弱引用本身的生命周期。(由Richard Oudkerk在issue 15528中提供。)

ref关联的回调(如果有)现在通过__callback__属性显示。(由Mark Dickinson在issue 17643中提供。)

xml.etree

新的解析器XMLPullParser允许非阻塞应用程序解析XML文档。可以在Pull API for non-blocking parsing中看到一个示例。(由Antoine Pitrou提供issue 17741。)

The xml.etree.ElementTree tostring() and tostringlist() functions, and the ElementTree write() method, now have a short_empty_elements keyword-only parameter providing control over whether elements with no content are written in abbreviated (<tag />) or expanded (<tag></tag>) form. (由Ariel Poliak和Serhiy Storchaka提供,issue 14377。)

zipfile

PyZipFile类的writepy()方法有一个新的filterfunc选项,可用于控制将哪些目录和文件添加到归档。例如,这可以用于从归档中排除测试文件。(Contributed by Christian Tismer in issue 19274。)

默认情况下,allowZip64参数为ZipFilePyZipfile现在为True(由William Mallard提供,问题17201。)

CPython Implementation Changes

PEP 445: Customization of CPython Memory Allocators

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

也可以看看

PEP 445 - 添加新API以自定义Python内存分配器
PEP由Victor Stinner编写和实施。

PEP 442: Safe Object Finalization

PEP 442删除CPython中对象最终化的当前限制和怪癖。使用它,具有__del__()方法的对象以及具有finally子句的生成器可以在它们是参考周期的一部分时被最终确定。

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

也可以看看

PEP 442 - 安全对象完成
PEP由Antoine Pitrou编写和实施。

PEP 456: Secure and Interchangeable Hash Algorithm

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

PEP向sys.hash_info结构序列添加附加字段,以描述当前执行的二进制使用的哈希算法。否则,PEP不会更改任何现有的CPython API。

PEP 436: Argument Clinic

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

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

期望用于程序化内省的声明元数据将被添加到在C中实现的附加可调用中作为Python 3.4维护版本的一部分。

注意

参数诊所PEP不完全符合实施状态。在这种情况下,发布经理和核心开发团队认为这是可以接受的,因为Argument Clinic不会作为第三方在Python 3.4中使用的公共API。

也可以看看

PEP 436 - 参数诊所DSL
PEP由Larry Hastings编写和实施。

Other Build and C API Changes

Other Improvements

  • python命令有一个新的option-I,它使它以“隔离模式”运行,这意味着sys.path既不包含脚本目录也不包含用户的site-packages目录,并且所有 PYTHON*环境变量都被忽略意味着-s-E)。将来还可以应用其他限制,目的是将脚本的执行与用户的环境隔离。这是适当的,例如,当Python用于运行系统脚本。在大多数POSIX系统上,它可以并且应该在#!中使用系统脚本行。(由Christian Heimes撰写,问题16499。)
  • 默认情况下,在支持readline的系统上的交互式解释器中已启用制表符完成。默认情况下启用历史记录,并写入(并从中读取)文件~/.python-history(由Antoine Pitrou和ÉricAraujo提供,载于问题5845。)
  • 使用--version调用Python解释器现在将输出版本到标准输出,而不是标准错误(issue 18338)。argparse问题18920)和具有类似脚本调用功能的其他模块(issue 18922)进行了类似的更改。
  • 当注册扩展时,CPython Windows安装程序现在将.py添加到 PATHEXT变量,允许用户在Windows命令提示符下运行python脚本只需键入其名称而不使用.py扩展名即可。(由Paul Moore提供,issue 18569。)
  • 新的make目标覆盖率报告将构建python,运行测试套件,并使用gcov为C代码库生成HTML coverage报告lcov
  • python regression test suite-R选项现在还使用sys.getallocatedblocks()来检查内存分配泄漏。(由Antoine Pitrou提供,载于issue 13390。)
  • python -m现在可与命名空间包配合使用。
  • stat模块现在在C中实现,这意味着它从C头文件中获取其常量的值,而不是像以前那样在python模块中硬编码值。
  • 从单个操作系统模块加载多个python模块(.so.dll)现在可以正常工作(以前它静默地返回文件中的第一个python模块)。(由VáclavŠmilauer在问题16421中提供。)
  • 添加了一个新的操作码LOAD_CLASSDEREF,以修复在类体中加载自由变量时可能由某些使用__prepare__触发的错误。(由Benjamin Peterson在issue 17853中提供。)
  • Victor Stinner使用他的 PEP 445 - 基于pyfailmalloc工具(问题18408 ,issue 18520)。
  • pyvenv命令现在接受一个--copies选项来使用副本,而不是符号链接,即使在符号链接是默认的系统上。(由Vinay Sajip提供,issue 18807。)
  • pyvenv命令还接受一个--without-pip选项,以禁止否则自动引导到虚拟环境中。(由Nick Coghlan在issue 19552中作为 PEP 453实施的一部分提供)。
  • 在为 PYTHONIOENCODING这使得可以只设置错误处理程序,而不更改默认编码。(由Serhiy Storchaka在issue 18818中提供。)
  • bz2lzmagzip模块open函数现在支持x创建)模式。(由Tim Heaney和Vajrasky Kok在发行19201 t>,发行19222发行19223提供)

Significant Optimizations

  • UTF-32解码器现在是3x到4x更快。(由Serhiy Storchaka提供在issue 14625。)
  • 集合的哈希冲突的成本现在降低。每个散列表探针现在在继续通过散列表进行随机探测之前检查一系列连续的,相邻的密钥/散列对。这利用缓存局部性,使冲突解决更便宜。冲突解决方案可以被描述为线性探测和开放寻址的混合。附加线性探头的数量默认为9。这可以在编译时通过将LINEAR_PROBES定义为任何值来更改。设置LINEAR_PROBES = 0以完全关闭线性探测。(由Raymond Hettinger在issue 18771中提供。)
  • 解释器开始快30%。几个措施导致加速。解释器在启动时加载较少的模块,例如。默认情况下不再导入recollectionslocale模块及其依赖项。改进了marshal模块以更快地加载编译的Python代码。(由Antoine Pitrou,Christian Heimes和Victor Stinner在发行19219发行19218发行19209发行19205 t3 >和issue 9548。)
  • bz2.BZ2File现在比大多数情况下的Python2版本快或快。lzma.LZMAFile也已优化。(由Serhiy Storchaka和Nadeem Vawda在issue 16034中提供。)
  • 对于小整数(最常见的用例),random.getrandbits()更快20%-40%。(由Serhiy Storchaka在问题16674中提供。)
  • 通过利用字符串的新存储格式,字符串的酸洗现在显着更快。(由Victor Stinner和Antoine Pitrou提供,载于issue 15596。)
  • io.FileIO.readall()中的性能问题已解决。这特别影响Windows,并显着加快通过subprocess管理大量数据的情况。(由Richard Oudkerk在issue 15758中提供。)
  • html.escape()现在快10倍。(由Matt Bryant在issue 18020中提供。)
  • 在Windows上,现在使用本机VirtualAlloc代替obmalloc中的CRT malloc人工基准显示节省3%的内存。
  • os.urandom()现在使用一个延迟打开的持久性文件描述器,以避免在从多个线程并行运行时使用许多文件描述器。(由Antoine Pitrou在issue 18756提供。)

Deprecated

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

Deprecations in the Python API

Deprecated Features

  • 使用-n标志(无子过程)运行IDLE已被弃用。但是,在问题18823解决之前,该功能将不会被删除。
  • 如果网站模块向sys.path添加了“site-python”目录(如果存在),则不推荐使用(issue 19375)。

Removed

不再支持操作系统

支持以下操作系统已从源代码和构建工具中删除:

API and Feature Removals

已删除以下过时和以前已弃用的API和功能:

  • 未保存的Misc/TextMateMisc/vim目录已删除(请参阅devguide以获取有关要使用的建议)。
  • SO makefile宏已删除(由SHLIB_SUFFIXEXT_SUFFIX宏替代)(问题16754)。
  • PyThreadState.tick_counter字段已删除;它的值自从Python 3.2,当“新GIL”被引入(问题19199)以来一直没有意义。
  • PyLoaderPyPycLoader已从importlib中移除。(由Taras Lyapun在issue 15641提供。)
  • HTTPConnectionHTTPSConnectionstrict参数已删除。不再支持HTTP 0.9样式的“简单响应”。
  • The deprecated urllib.request.Request getter and setter methods add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_host, and is_unverifiable have been removed (use direct attribute access instead).
  • 已从marshal中删除了对加载已弃用的TYPE_INT64的支持。(由Dan Riti在issue 15480中提供。)
  • inspect.Signature:现在需要具有有效名称的仅位置参数。
  • object.__format__()不再接受非空格式字符串,现在引入TypeError使用非空字符串自从Python 3.2以来已被弃用。此更改是为了防止以前的工作(但不正确)代码将开始失败,如果一个对象获得__format__方法,这意味着您的代码现在可以引入一个TypeError如果你使用's'格式代码与没有处理它的__format__方法的对象。有关背景,请参见问题7994
  • difflib.SequenceMatcher.isbjunk() and difflib.SequenceMatcher.isbpopular() were deprecated in 3.2, and have now been removed: use x in sm.bjunk and x in sm.bpopular, where sm is a SequenceMatcher object (issue 13248).

Code Cleanups

  • 未使用和未记录的内部Scanner类已从pydoc模块中删除。
  • 私人和有效未使用的_gestalt模块已连同私人platform功能_mac_ver_lookup_mac_ver_gstalt _bcd2str,它只会在严重破坏的OSX系统上被调用(参见问题18393)。
  • 包含在tarfile模块命名空间中的某些stat常量的硬编码副本已删除。

Porting to Python 3.4

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

Changes in ‘python’ Command Behavior

  • 在posix shell中,将 PATH环境变量设置为空值相当于不设置它。However, setting PYTHONPATH to an empty value was not equivalent to not setting it at all: setting PYTHONPATH to an empty value was equivalent to setting it to ., which leads to confusion when reasoning by analogy to how PATH works. 现在的行为符合 PATH的posix约定。
  • 默认情况下,CPython解释器的调试(--with-pydebug)构建的[X refs,Y blocks]输出现在关闭。可以使用-X showrefcount选项重新启用。(由Ezio Melotti在issue 17323中提供。)
  • The python command and most stdlib scripts (as well as argparse) now output --version information to stdout instead of stderr (for issue list see Other Improvements above).

Changes in the Python API

  • importlib.abc中定义的ABCs现在或者引入相应的异常,或者返回一个默认值,而不是盲目地提高NotImplementedError这将只影响调用super()的代码,并一直下降到ABC。为了兼容性,请根据需要同时捕获NotImplementedError或相应的异常。
  • 现在,模块类型默认将__package____loader__属性初始化为None属性。要确定这些属性是否以向后兼容的方式设置,请使用getattr(module, '__ loader __', None) is not 问题17115。)
  • importlib.util.module_for_loader()无条件地设置__loader____package__以正确支持重新加载。如果不需要,则需要手动设置这些属性。您可以使用importlib.util.module_to_load()进行模块管理。
  • 导入现在会重置相关属性(例如__name__, __loader__, __package__, __file__, __cached__) unconditionally when reloading. 注意,这恢复了3.3之前的行为,因为它意味着当重新加载(问题19413)时重新找到模块。
  • 冻结包不再将__path__设置为包含包名称的列表,现在将其设置为空列表。以前的行为可能导致导入系统对子模块导入执行错误的操作,如果还有一个与冻结软件包名称相同的目录。The correct way to determine if a module is a package or not is to use 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() no longer raises ImportError when the source code being loaded triggers a SyntaxError or UnicodeDecodeError. 因为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)。
  • 删除HTTPConnectionHTTPSConnectionstrict参数会更改剩余参数的含义,如果您通过位置指定而不是关键字。如果您一直注意弃用警告,您的代码应该已经通过关键字指定任何其他参数。
  • Strings between from __future__ import ... statements now always raise a SyntaxError. 以前,如果没有前导docstring,有时会忽略插页式字符串。这使CPython符合语言规范; Jython和PyPy已经。问题17434)。
  • ssl.SSLSocket.getpeercert()ssl.SSLSocket.do_handshake()现在引入OSErrorENOTCONN未连接SSLSocket,而不是提高AttributeError的先前行为。此外,如果握手尚未完成,getpeercert()将引发ValueError
  • base64.b32decode()现在引入binascii.Error,当输入字符串包含非b32字母字符而不是TypeError时。当其他TypeError被转换时,此特定TypeError错过。(由Serhiy Storchaka在问题18011中提供。)注意:这个改变也被无意中应用在Python 3.3.3中。
  • 当创建cgi.FieldStorage实例是垃圾收集时,file属性现在自动关闭。如果你从cgi.FieldStorage实例中单独拉出文件对象,而不是保持实例存在,则应该存储整个cgi.FieldStorage实例或读取在cgi.FieldStorage实例之前的文件内容是垃圾回收。
  • 在关闭的SSL套接字上调用readwrite现在引发信息性的ValueError,而不是之前更神秘的AttributeError issue 9177)。
  • slice.indices()不再为巨大的值产生OverflowError作为此修复的结果,如果给定负长度,slice.indices()现在引发ValueError以前它返回无意义值(issue 14794)。
  • The complex constructor, unlike the cmath functions, was incorrectly accepting float values if an object’s __complex__ special method returned one. 现在引发TypeError问题16290。)
  • 3.2和3.3中的int构造函数错误地接受base参数的float值。这是不可能的任何人都这样做,但如果是这样,它现在将引发TypeError问题16772)。
  • 仅限关键字参数的默认值现在为之后的计算默认为常规关键字参数,而不是之前。希望没有人写任何依赖于以前的错误行为的代码(issue 16967)。
  • 陈旧的线程状态现在在fork()之后清除。None问题17094。)
  • __kwdefaults__类似,__annotations__词典中的参数名称现在可正确标记。(Contributed by Yury Selivanov in issue 20625.)
  • hashlib.hash.name现在总是返回小写的标识符。以前,一些内置散列具有大写名称,但现在它是一个正式的公共接口,命名已经一致(问题18532)。
  • 因为unittest.TestSuite现在在运行测试后删除对测试的引用,因此重新使用TestSuite重新运行一组测试的测试工具可能会失败。测试套件不应该以这种方式重用,因为它意味着状态在测试运行之间保持,打破了unittest设计提供的测试隔离。但是,如果缺少隔离被认为是可接受的,可以通过创建定义了不做任何操作的_removeTestAtIndex方法的TestSuite子类来恢复旧的行为(见TestSuite.__iter__())(issue 11798)。
  • unittest现在使用argparse进行命令行解析。有一些无效的命令形式,以前工作,不再允许;在理论上这不应该导致向后兼容性问题,因为不允许的命令形式没有任何意义,并且不可能使用。
  • The re.split(), re.findall(), and re.sub() functions, and the group() and groups() methods of match objects now always return a bytes object when the string to be matched is a bytes-like object. 以前的返回类型与输入类型匹配,因此,如果您的代码取决于返回值,例如bytearray,则需要更改代码。
  • audioop函数现在如果传递字符串输入,立即引发错误,而不是随后随机失败(问题16685)。
  • 为了向后兼容性,HTMLParser的新convert_charrefs参数默认为False,但最终会更改为默认值True建议您使用适当的值将此关键字添加到代码中的任何HTMLParser调用(问题13633)。
  • 由于hmac.new()函数的digestmod参数将没有默认值,所有对hmac.new()改为明确指定digestmod问题17276)。
  • Calling sysconfig.get_config_var() with the SO key, or looking SO up in the results of a call to sysconfig.get_config_vars() is deprecated. 根据上下文(issue 19555),此键应替换为EXT_SUFFIXSHLIB_SUFFIX
  • 应该修改对指定Uopen函数的任何调用。U在Python3中无效,最终会引发错误(如果使用)。根据函数,可以使用换行参数,或者如果需要,通过将流包装在TextIOWrapper中来使用其换行符参数(issue 15204)。
  • 如果您在脚本中使用pyvenv并希望安装pip ,则必须在命令调用中添加--without-pip
  • 当指定缩进时,json.dump()json.dumps()的默认行为已更改:它不再产生尾随空格,线的末端。只有当你有对这样的输出(问题16333)进行空白空间敏感比较的测试时,这才有意义。
  • doctest现在在扩展模块__doc__中查找doctest,所以如果你的doctest测试发现包含的东西看起来像doctest的扩展模块,你可能会看到测试失败, ve在运行测试之前从未见过(issue 3158)。
  • collections.abc模块已作为Python启动改进的一部分进行了轻微重构。作为其结果,不再是导入collections自动导入collections.abc的情况。如果您的程序依赖于(无记录的)隐式导入,则需要添加一个显式的import 容器.abc问题20784 )。

Changes in the C API

Changed in 3.4.3

PEP 476: Enabling certificate verification by default for stdlib http clients

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)