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中未添加新的语法。
其他新功能:
- pip should always be available( PEP 453)。
- Newly created file descriptors are non-inheritable( PEP 446)。
- isolated mode(问题16499)的命令行选项。
- improvements in the handling of codecs,不是文本编码(多个问题)。
- A ModuleSpec Type for the Import System (PEP 451). (影响进口商作者。)
- The
marshal
format has been made more compact and efficient (issue 16475).
新库模块:
asyncio
:New provisional API for asynchronous IO的新临时API( PEP 3156)。ensurepip
:Bootstrapping the pip installer( PEP 453)。enum
:Support for enumeration types( PEP 435)。pathlib
:Object-oriented filesystem paths( PEP 428)。selectors
: High-level and efficient I/O multiplexing, built upon theselect
module primitives (part of PEP 3156).statistics
:基本numerically stable statistics library( PEP 450)。tracemalloc
:Trace Python memory allocations( PEP 454)。
显着改进库模块:
- Single-dispatch generic functions in
functools
(PEP 443). - 新
pickle
protocol 4( PEP 3154)。 multiprocessing
现在具有an option to avoid using os.fork on Unix(问题8713)。email
has a new submodule,contentmanager
, and a newMessage
subclass (EmailMessage
) that simplify MIME handling (issue 18891).inspect
和pydoc
模块现在能够正确反映更多种类的可调用对象,这改进了Pythonhelp()
ipaddress
模块API已声明为稳定
安全改进:
- Secure and interchangeable hash algorithm( PEP 456)。
- Make newly created file descriptors non-inheritable( PEP 446),以避免泄露文件描述器到子进程。
- isolated mode的新命令行选项(问题16499)。
multiprocessing
现在具有an option to avoid using os.fork on Unix。spawn和forkserver更安全,因为它们避免与子进程共享数据。multiprocessing
Windows上的子进程不再继承所有父级的可继承句柄,只有必要的句柄。- 新的
hashlib.pbkdf2_hmac()
函数提供PKCS#5基于密码的密钥导出函数2。 - TLSv1.1 and TLSv1.2 support用于
ssl
。 - Retrieving certificates from the Windows system cert store support检索
ssl
的证书。 - Server-side SNI (Server Name Indication) support for
ssl
. ssl.SSLContext
类具有lot of improvements。- 支持SSL的标准库中的所有模块现在都支持服务器证书验证,包括主机名匹配(
ssl.match_hostname()
)和CRL(证书吊销列表,参见ssl.SSLContext.load_verify_locations()
)。
CPython实现改进:
- Safe object finalization( PEP 442)。
- 利用 PEP 442,在大多数情况下,module globals are no longer set to None during finalization(问题18214)期间不再设置为无。
- Configurable memory allocators( PEP 445)。
- Argument Clinic( PEP 436)。
请阅读面向用户的更改的完整列表,包括许多其他较小的改进,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
在创建发布候选时可用。
默认情况下,命令pipX
和pipX.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
时,只有版本化的pip3
和pip3.4
命令被默认引导直接 - 需要--default-pip
选项来请求未版本化的pip
命令。pyvenv
和Windows安装程序确保在这些环境中提供不合格的pip
命令,pip
总是可以通过-m
切换,而不是直接避免使用多个Python安装的系统上的歧义。
Documentation Changes¶
作为此更改的一部分,文档的Installing Python Modules和Distributing 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。一般来说,这是应用程序想要的行为:当启动一个新进程时,当前打开的文件也在新进程中打开可能导致各种各样的难以找到的错误,并可能导致安全问题。
然而,有时候需要继承。为了支持这些情况,提供了以下新功能和方法:
os.get_inheritable()
,os.set_inheritable()
os.get_handle_inheritable()
,os.set_handle_inheritable()
socket.socket.get_inheritable()
,socket.socket.set_inheritable()
也可以看看
- PEP 446 - 创建新创建的文件描述器不可继承
- PEP由Victor Stinner编写和实施。
Improvements to Codec Handling¶
自从第一次引入以来,codecs
模块总是用作类型中立的动态编码和解码系统。但是,它与Python文本模型(特别是内置str
,bytes
和bytearray
类型上的类型限制方便方法)掩盖了这一事实。
作为澄清情况的关键步骤,现在可以在Python 2.7,3.3和3.4中正确记录codecs.encode()
和codecs.decode()
便利函数。这些函数存在于codecs
模块中(并且已经被回归测试套件覆盖),因为Python 2.4以前只能通过运行时内省发现。
与str
,bytes
和bytearray
上的方便方法不同,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 Transforms和Text Transforms中详细说明。
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 theinspect
andpydoc
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 flag,FAIL_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_size
和name
属性(和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中提供。)
HTMLParser
的strict参数现已弃用。(由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 对话框中获取。
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,这意味着runpy
和python -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中提供。)
SocketHandler
和DatagramHandler
现在支持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 methods,spawn
和forkserver
,用于使用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__
spawn
或forkserver
启动方法。这解决了一些边缘情况,其中组合多处理,-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.
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_MSGQUEUE
,RLIMIT_NICE
,RLIMIT_RTPRIO
,RLIMIT_RTTIME
和RLIMIT_SIGPENDING
。(Contributed by Christian Heimes in issue 19324。)
在FreeBSD版本9和更高版本上,有一些新的FreeBSD特定常量:RLIMIT_SBSIZE
,RLIMIT_SWAP
和RLIMIT_NPTS
。(Contributed by Claudiu Popa in issue 19343。)
select¶
epoll
对象现在支持上下文管理协议。当在with
语句中使用时,close()
方法将在块结束时自动调用。(由Serhiy Storchaka在问题16488中提供。)
devpoll
对象现在具有fileno()
和close()
方法,以及一个新属性closed
。(由Victor Stinner在发行18794提供。)
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 flag,get_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_1
和PROTOCOL_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_DEFAULT
,VERIFY_CRL_CHECK_LEAF
,VERIFY_CRL_CHECK_CHAIN
或VERIFY_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
扩展项:crlDistributionPoints
,calIssuers
和OCSP
URI。(Contributed by Christian Heimes in issue 18379。)
stat¶
stat
模块现在由_stat
中的C实现支持。需要C实现,因为大多数值不是标准化的并且是平台相关的。(由Christian Heimes撰写,问题11016。)
该模块支持新的ST_MODE
标志,S_IFDOOR
,S_IFPORT
和S_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
. 如果您不想使用此新行为,可以在 PYTHONSTARTUP
,sitecustomize
或usercustomize
通过从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_url
或data
属性,所有相关的内部属性都会更新。这意味着,例如,现在可以在多个OpenerDirector.open()
调用中使用与数据 t6不同的Request
>参数,或修改Request
的url
,而不是从头重新计算。还有一个新的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=0
,i=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()
对象现在具有readline
和readlines
方法。(由Toshio Kuratomi提供在issue 17467。)
venv¶
venv
现在包含csh
和fish
shell的激活脚本。(由Andrew Svetlov在问题15417中提供。)
EnvBuilder
和create()
方便函数带有一个新的关键字参数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。)
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,并且相应地更新了pydoc
和inspect
。
期望用于程序化内省的声明元数据将被添加到在C中实现的附加可调用中作为Python 3.4维护版本的一部分。
注意
参数诊所PEP不完全符合实施状态。在这种情况下,发布经理和核心开发团队认为这是可以接受的,因为Argument Clinic不会作为第三方在Python 3.4中使用的公共API。
也可以看看
- PEP 436 - 参数诊所DSL
- PEP由Larry Hastings编写和实施。
Other Build and C API Changes¶
- 新的
PyType_GetSlot()
函数已添加到稳定ABI中,从而允许在使用受限API时从命名类型槽检索函数指针。(由Martin vonLöwis在issue 17162中提供。) - 新的
Py_SetStandardStreamEncoding()
预初始化API允许嵌入CPython解释器的应用程序可靠地强制标准流的特定编码和错误处理程序。(由Bastien Montagne和Nick Coghlan在问题16129提供。) - 大多数不会改变字符串参数的Python C API已正确标记为接受
const char *
char *
。(由Serhiy Storchaka提供在issue 1772673。) - 即使python解释器不可用(例如,在交叉编译场景中),也可以使用新的shell版本的
python-config
。 PyUnicode_FromFormat()
现在支持%s
,%A
,%U
,%V
,%S
和%R
。(由Ysj Ray和Victor Stinner在issue 7330中提供。)- 新函数
PyStructSequence_InitType2()
补充现有的PyStructSequence_InitType()
函数。区别在于成功时返回0
,失败时返回-1
。 - 现在可以使用最新版本的GCC和clang的地址健全检查功能来编译CPython源:小对象分配器中的假警报已被停止。(由Dhiru Kholia提供在issue 18596。)
- Windows版本现在使用地址空间布局随机化和数据执行保护。(Contributed by Christian Heimes in issue 16632。)
- 新函数
PyObject_LengthHint()
是operator.length_hint()
的C API等同物。(由Armin Ronacher在问题16148中提供。)
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中提供。) bz2
,lzma
和gzip
模块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%。几个措施导致加速。解释器在启动时加载较少的模块,例如。默认情况下不再导入
re
,collections
和locale
模块及其依赖项。改进了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
中的CRTmalloc
。人工基准显示节省3%的内存。 os.urandom()
现在使用一个延迟打开的持久性文件描述器,以避免在从多个线程并行运行时使用许多文件描述器。(由Antoine Pitrou在issue 18756提供。)
Deprecated¶
本节包含已在Python 3.4中弃用的各种API和其他功能,并将在Python 3.5或更高版本中删除。在大多数(但不是全部)情况下,如果解释器在启用弃用警告的情况下运行(例如,使用-Wd
),则使用弃用的API将产生DeprecationWarning
。
Deprecations in the Python API¶
- As mentioned in PEP 451: A ModuleSpec Type for the Import System, a number of
importlib
methods and functions are deprecated:importlib.find_loader()
is replaced byimportlib.util.find_spec()
;importlib.machinery.PathFinder.find_module()
is replaced byimportlib.machinery.PathFinder.find_spec()
;importlib.abc.MetaPathFinder.find_module()
is replaced byimportlib.abc.MetaPathFinder.find_spec()
;importlib.abc.PathEntryFinder.find_loader()
andfind_module()
are replaced byimportlib.abc.PathEntryFinder.find_spec()
; all of thexxxLoader
ABCload_module
methods (importlib.abc.Loader.load_module()
,importlib.abc.InspectLoader.load_module()
,importlib.abc.FileLoader.load_module()
,importlib.abc.SourceLoader.load_module()
) should no longer be implemented, instead loaders should implement anexec_module
method (importlib.abc.Loader.exec_module()
,importlib.abc.InspectLoader.exec_module()
importlib.abc.SourceLoader.exec_module()
) and let the import system take care of the rest; andimportlib.abc.Loader.module_repr()
,importlib.util.module_for_loader()
,importlib.util.set_loader()
, andimportlib.util.set_package()
are no longer needed because their functions are now handled automatically by the import system. imp
模块正在等待废弃。为了保持与Python 2/3代码库的兼容性,目前未安排模块的删除。formatter
模块正在等待废弃,并预定在Python 3.6中删除。MD5
作为hmac.new()
函数的默认digestmod已弃用。Python 3.6将需要一个显式摘要名称或构造函数作为digestmod参数。- 在
ftplib
模块中的内部Netrc
类已被记录为在其docstring中已过时的一段时间。它现在发出DeprecationWarning
,将在Python 3.5中完全删除。 subprocess.Popen.wait()
的未记录的endtime参数不应该被公开,并且希望不会使用;它已被弃用,并且很可能在Python 3.5中被删除。- 不推荐使用
HTMLParser
的strict参数。 - The
plistlib
readPlist()
,writePlist()
,readPlistFromBytes()
, andwritePlistToBytes()
functions are deprecated in favor of the corresponding new functionsload()
,dump()
,loads()
, anddumps()
.Data()
,而仅使用bytes
构造函数。 sysconfig
键SO
已弃用,已替换为EXT_SUFFIX
。- 不同的
open
函数接受的U
模式已弃用。在Python3中,它不会做任何有用的事情,应该通过适当使用io.TextIOWrapper
(如果需要)及其换行符参数来替换。 - The parser argument of
xml.etree.ElementTree.iterparse()
has been deprecated, as has the html argument ofXMLParser()
. 要准备删除后者,XMLParser
的所有参数都应该通过关键字传递。
Deprecated Features¶
- 使用
-n
标志(无子过程)运行IDLE已被弃用。但是,在问题18823解决之前,该功能将不会被删除。 - 如果网站模块向sys.path添加了“site-python”目录(如果存在),则不推荐使用(issue 19375)。
Removed¶
不再支持操作系统¶
支持以下操作系统已从源代码和构建工具中删除:
- OS / 2(issue 16135)。
- Windows 2000(更改集e52df05b496a)。
- Windows系统
COMSPEC
指向command.com
(问题14470)。 - VMS(issue 16136)。
API and Feature Removals¶
已删除以下过时和以前已弃用的API和功能:
- 未保存的
Misc/TextMate
和Misc/vim
目录已删除(请参阅devguide以获取有关要使用的建议)。 SO
makefile宏已删除(由SHLIB_SUFFIX
和EXT_SUFFIX
宏替代)(问题16754)。PyThreadState.tick_counter
字段已删除;它的值自从Python 3.2,当“新GIL”被引入(问题19199)以来一直没有意义。PyLoader
和PyPycLoader
已从importlib
中移除。(由Taras Lyapun在issue 15641提供。)HTTPConnection
和HTTPSConnection
的strict参数已删除。不再支持HTTP 0.9样式的“简单响应”。- The deprecated
urllib.request.Request
getter and setter methodsadd_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
, andis_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()
anddifflib.SequenceMatcher.isbpopular()
were deprecated in 3.2, and have now been removed: usex in sm.bjunk
andx in sm.bpopular
, where sm is aSequenceMatcher
object (issue 13248).
Porting to Python 3.4¶
本节列出了之前描述的更改和其他可能需要更改代码的错误。
Changes in ‘python’ Command Behavior¶
- 在posix shell中,将
PATH
环境变量设置为空值相当于不设置它。However, settingPYTHONPATH
to an empty value was not equivalent to not setting it at all: settingPYTHONPATH
to an empty value was equivalent to setting it to.
, which leads to confusion when reasoning by analogy to howPATH
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 tostdout
instead ofstderr
(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 usehasattr(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 raisesImportError
when the source code being loaded triggers aSyntaxError
orUnicodeDecodeError
. 因为ImportError
意味着只有当源代码找不到但是它应该被提出时,当发现源代码但是结构不正确时,感觉是意义过度或超载。如果你之前捕获ImportError,并希望继续忽略语法或解码问题,现在捕获所有三个异常。functools.update_wrapper()
和functools.wraps()
现在可以将__wrapped__
属性正确设置为要包装的函数,即使该函数其__wrapped__
属性集。这意味着__wrapped__
属性现在正确链接一堆修饰函数,而不是链中指向最内层函数的每个__wrapped__
属性。假定之前行为是有意的自省库可以使用inspect.unwrap()
访问链中没有__wrapped__
属性的第一个函数。inspect.getfullargspec()
已在inspect.signature()
之上重新实现,因此可处理比过去更多的可调用对象。期望额外的内置和扩展模块调用程序将在Python 3.4系列过程中获得声明元数据。假设inspect.getfullargspec()
在非Python可调用项上失败的代码可能需要相应调整。importlib.machinery.PathFinder
现在将当前工作目录传递到sys.path_hooks
中的对象作为空字符串。这导致sys.path_importer_cache
从不包含''
,因此根据sys.path
迭代sys.path_importer_cache
将不会找到所有的键。当在当前工作目录中导入时,模块的__file__
现在也将具有绝对路径,包括当使用解释器使用-m
时(除了__main__.__file__
当使用相对路径直接执行脚本时)(由Brett Cannon在issue 18416中提供)。在命令行上指定)(issue 18416)。- 删除
HTTPConnection
和HTTPSConnection
的strict参数会更改剩余参数的含义,如果您通过位置指定而不是关键字。如果您一直注意弃用警告,您的代码应该已经通过关键字指定任何其他参数。 - Strings between
from __future__ import ...
statements now always raise aSyntaxError
. 以前,如果没有前导docstring,有时会忽略插页式字符串。这使CPython符合语言规范; Jython和PyPy已经。(问题17434)。 ssl.SSLSocket.getpeercert()
和ssl.SSLSocket.do_handshake()
现在引入OSError
与ENOTCONN
未连接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套接字上调用
read
或write
现在引发信息性的ValueError
,而不是之前更神秘的AttributeError
issue 9177)。 slice.indices()
不再为巨大的值产生OverflowError
。作为此修复的结果,如果给定负长度,slice.indices()
现在引发ValueError
以前它返回无意义值(issue 14794)。- The
complex
constructor, unlike thecmath
functions, was incorrectly acceptingfloat
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()
, andre.sub()
functions, and thegroup()
andgroups()
methods ofmatch
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 theSO
key, or lookingSO
up in the results of a call tosysconfig.get_config_vars()
is deprecated. 根据上下文(issue 19555),此键应替换为EXT_SUFFIX
或SHLIB_SUFFIX
。 - 应该修改对指定
U
的open
函数的任何调用。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¶
PyEval_EvalFrameEx()
,PyObject_Repr()
和PyObject_Str()
以及其他一些内部C API现在包括一个调试断言,不用于它们可能默默地丢弃当前活动的异常的情况。在期望和期望丢弃活动异常的情况下(例如,因为它已经用PyErr_Fetch()
本地保存或者被故意地替换为不同的异常),显式的PyErr_Clear()
调用,以避免在调用这些操作(直接或间接)并针对使用断言编译的Python版本时触发断言。PyErr_SetImportError()
now setsTypeError
when its msg argument is not set. 以前只返回了未设置任何异常的NULL
。PyOS_ReadlineFunctionPointer
回调的结果现在必须是由PyMem_RawMalloc()
或PyMem_RawRealloc()
或NULL t9 >如果发生错误,而不是由PyMem_Malloc()
或PyMem_Realloc()
(问题16742)分配的字符串PyThread_set_key_value()
现在总是设置值。在Python 3.3中,如果键已经存在(如果当前值是非空指针),函数什么也不做。- 已删除
PyFrameObject
结构的f_tstate
(线程状态)字段以修复错误:有关基本原理,请参阅issue 14432。
Changed in 3.4.3¶
PEP 476: Enabling certificate verification by default for stdlib http clients¶
http.client
和使用它的模块(例如urllib.request
和xmlrpc.client
)现在将验证服务器是否提供证书由平台信任存储中的CA签名,并且其主机名与默认请求的主机名匹配,从而显着提高许多应用程序的安全性。
对于需要旧的先前行为的应用程序,它们可以传递备用上下文:
import urllib.request
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)