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中没有添加新的语法功能。
其他新功能:
Newly created file descriptors are non-inheritable (PEP 446 )
的命令行选项 isolated mode (bpo-16499 )
improvements in the handling of codecs 这不是文本编码(多个问题)。
A ModuleSpec Type 对于输入系统 (PEP 451 )。(影响importers作者。)
这个
marshal
已设置格式 more compact and efficient (bpo-16475 )
新库模块:
asyncio
: New provisional API for asynchronous IO (PEP 3156 )selectors
: High-level and efficient I/O multiplexing ,建立在select
模块原语(模块原语的一部分 PEP 3156 )statistics
一个基本的 numerically stable statistics library (PEP 450 )
显著改进了库模块:
新的
pickle
protocol 4 (PEP 3154 )multiprocessing
现在有 an option to avoid using os.fork on Unix (bpo-8713 )email
有一个新的子模块,contentmanager
和一个新的Message
子类 (EmailMessage
) simplify MIME handling (bpo-18891 )这个
inspect
和pydoc
模块现在能够对各种各样的可调用对象进行正确的内省,从而改进了Python的输出。help()
系统。这个
ipaddress
模块API已声明为稳定
安全改进:
Make newly created file descriptors non-inheritable (PEP 446 )以避免向子进程泄漏文件描述符。
的新命令行选项 isolated mode , (bpo-16499 )
multiprocessing
现在有 an option to avoid using os.fork on Unix . 产卵 和 福克斯服务器 更安全,因为它们避免与子进程共享数据。multiprocessing
Windows上的子进程不再继承父进程的所有可继承句柄,只继承必要的句柄。一个新的
hashlib.pbkdf2_hmac()
函数提供 PKCS#5 password-based key derivation function 2 .Retrieving certificates from the Windows system cert store support 对于
ssl
.这个
ssl.SSLContext
类有 lot of improvements .标准库中支持SSL的所有模块现在都支持服务器证书验证,包括主机名匹配 (
ssl.match_hostname()
)和crls(证书吊销列表,请参见ssl.SSLContext.load_verify_locations()
)
CPython实施改进:
请继续阅读有关面向用户的更改的全面列表,包括许多其他较小的改进、cpython优化、拒绝以及潜在的移植问题。
新特点¶
PEP453:python安装中PIP的显式引导¶
默认情况下引导PIP¶
新的 ensurepip
模块(定义见 PEP 453 )提供标准的跨平台机制,将PIP安装程序引导到Python安装和虚拟环境中。版本 pip
包含在python 3.4.0中的是 pip
1.5.4和未来的3.4.x维护版本将把捆绑版本更新为 pip
这在创建候选发布时可用。
默认情况下,命令 pipX
和 pipX.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 install
和 make 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安装之间的冲突,只有版本控制的 pip3
和 pip3.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文本模型的紧密耦合,特别是内置的类型限制了方便方法 str
, bytes
和 bytearray
从历史上看,这些类型掩盖了这一事实。
作为澄清形势的关键步骤, codecs.encode()
和 codecs.decode()
方便功能现在在python 2.7、3.3和3.4中得到了正确的记录。这些功能存在于 codecs
从python 2.4开始,模块(并且已经被回归测试套件所覆盖),但以前只有通过运行时内省才能发现。
与上的便利方法不同 str
, bytes
和 bytearray
, 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-7475 , bpo-17827 , bpo-17828 和 bpo-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 )bytes
连接()和bytearray
.join()现在接受任意缓冲区对象作为参数。(由Antoine Pitrou在 bpo-15958 )框架对象现在有一个
clear()
从帧中清除对局部变量的所有引用的方法。(由Antoine Pitrou在 bpo-17934 )memoryview
现在注册为Sequence
并支持reversed()
内建帐户。(由Nick Coghlan和Claudiu Popa在 bpo-18690 和 bpo-19078 )签名报告人
help()
在一些案例中,由于引入了Argument Clinic和其他对inspect
和pydoc
模块。__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编写并实施。
选择器¶
统计学¶
新的 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 )
新类 ABC
有 ABCMeta
作为它的元类。使用 ABC
作为一个基类与指定 metaclass=abc.ABCMeta
,但更容易打字和阅读。(布鲁诺·杜普伊斯在 bpo-16049 )
aifc¶
这个 getparams()
方法现在返回一个NamedDuple而不是一个纯元组。(克劳迪乌波巴在 bpo-17818 )
aifc.open()
现在支持上下文管理协议:当在 with
块 close()
返回对象的方法将在块的末尾自动调用。(由Serhiy Storchacha在 bpo-16486 )
这个 writeframesraw()
和 writeframes()
方法现在接受任何 bytes-like object . (Serhiy Storchaka在 bpo-8311 )
argparse¶
这个 FileType
类现在接受 encoding 和 errors 参数,传递给 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 如果之前要求 bytes
或 bytearray
实例。(由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 flag , FAIL_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
生成字符串表示形式。它不接受 麦克海德伦 但不接受 unixfrom 和 policy 参数。这个 Message
__bytes__()
方法调用它,这意味着 bytes(mymsg)
现在将产生直观的结果:一个字节对象包含完全格式化的消息。(R.David Murray在 bpo-18600 )
这个 Message.set_param()
消息现在接受 代替 关键字参数。指定后,将更新关联的头,而不更改其在头列表中的位置。对于向后兼容性,默认值为 False
. (R.David Murray在 bpo-18891 )
一对新的子类 Message
已添加 (EmailMessage
和 MIMEPart
)以及新的子模块, 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_size
和 name
属性(以及 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版本中所做的更改。此文件也可从空闲 对话框。
importlib¶
这个 InspectLoader
ABC定义了一种新方法, source_to_code()
它接受源数据和路径并返回代码对象。默认实现等效于 compile(data, path, 'exec', dont_inherit=True)
. (埃里克·斯诺和布雷特·坎农在 bpo-15627 )
InspectLoader
现在还具有 get_code()
方法。但是,出于性能原因,通常需要重写默认实现。(布雷特·坎农在 bpo-18072 )
这个 reload()
函数已从移动 imp
到 importlib
作为其中的一部分 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,意思是 runpy
和 python -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-18929 和 bpo-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,被正常的标准库要求所覆盖以保持向后兼容性。
登录¶
这个 TimedRotatingFileHandler
有新的 atTime 可用于指定发生滚动的日期时间的参数。(由Ronald Oussoren在 bpo-9556 )
SocketHandler
和 DatagramHandler
现在支持Unix域套接字(通过设置 port 到 None
)(由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¶
多重处理¶
关于UNIX的两个新 start methods , spawn
和 forkserver
,已添加用于启动进程,使用 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__
当使用 spawn
或 forkserver
启动方法。这解决了一些边缘情况,其中结合多处理 -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
已经增强了处理生成器的能力, yield
和 yield 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¶
添加了两种新方法 poplib
: capa()
,返回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 )
重新¶
新的 fullmatch()
功能和 regex.fullmatch()
方法将模式锚定在字符串的两端以匹配。这提供了一种明确匹配目标的方法,从而避免了一类细微的错误,其中 $
在代码更改或添加现有正则表达式的替代项时,字符会丢失。(马修·巴内特在 bpo-16203 )
RPR regex objects 现在包括图案和flag;代表 match objects 现在包括开始、结束和匹配的字符串部分。(由Hugo Lopes Tavares和Serhiy Storchaka在 bpo-13592 和 bpo-17087 )
资源¶
新的 prlimit()
函数在内核版本为2.6.36或更高版本、glibc为2.13或更高版本的Linux平台上可用,它提供了查询或设置进程资源限制的功能,而不是调用进程的资源限制。(由Christian Heimes在 bpo-16595 )
在Linux内核版本2.6.36或更高版本上,还有一些新的特定于Linux的常量: RLIMIT_MSGQUEUE
, RLIMIT_NICE
, RLIMIT_RTPRIO
, RLIMIT_RTTIME
和 RLIMIT_SIGPENDING
. (由Christian Heimes在 bpo-19324 )
在FreeBSD版本9和更高版本上,有一些新的FreeBSD特定常量: RLIMIT_SBSIZE
, RLIMIT_SWAP
和 RLIMIT_NPTS
. (克劳迪乌波巴在 bpo-19343 )
选择¶
epoll
对象现在支持上下文管理协议。当用于 with
语句 close()
方法将在块的末尾自动调用。(Serhiy Storchaka在 bpo-16488 )
devpoll
对象现在有 fileno()
和 close()
方法以及新属性 closed
.(由Victor Stinner在 bpo-18794 )
搁置¶
shutil¶
copyfile()
现在提出一个具体的 Error
子类, SameFileError
当源文件和目标文件相同时,允许应用程序对此特定错误采取适当的操作。(由石本刚雄和施拉瓦克在 bpo-1492704 )
短信网关¶
这个 SMTPServer
和 SMTPChannel
课程现在接受 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 flag , get_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_1
和 PROTOCOL_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的默认值 cafile
和 capath
. 这有助于调试默认验证问题。(由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_DEFAULT
, VERIFY_CRL_CHECK_LEAF
, VERIFY_CRL_CHECK_CHAIN
或 VERIFY_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
扩展项: crlDistributionPoints
, calIssuers
和 OCSP
URI。(由Christian Heimes在 bpo-18379 )
斯达¶
这个 stat
模块现在由中的C实现支持 _stat
.C实现是必需的,因为大多数值都不是标准化的,并且依赖于平台。(由Christian Heimes在 bpo-11016 )
模块支持新的 ST_MODE
flag, S_IFDOOR
, S_IFPORT
和 S_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()
现在支持上下文管理协议:当在 with
块 close
返回对象的方法将在块的末尾自动调用。(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
. 如果不希望此(新)行为,可以在 PYTHONSTARTUP
, sitecustomize
或 usercustomize
通过从中删除此属性 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-18585 和 bpo-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_url
或 data
修改属性,更新所有相关的内部属性。例如,这意味着现在可以使用相同的 Request
多个对象中的对象 OpenerDirector.open()
用不同的 data 参数,或修改 Request
的 url
而不是从头开始重新计算。还有一个新的 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=0
, i=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()
对象现在有 readline
和 readlines
方法。(由Toshio Kuratomi在 bpo-17467 )
venv¶
venv
现在包括的激活脚本 csh
和 fish
贝壳。(由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 参数到 ZipFile
和 PyZipfile
现在是 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,并且 pydoc
和 inspect
已相应更新。
预计用于编程自省的签名元数据将作为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 Randomization 和 Data 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安装程序现在添加了
.py
到PATHEXT
变量在注册扩展时,允许用户在Windows命令提示下只键入其名称而不键入.py
延伸。(保罗·摩尔在 bpo-18569 )一个新的
make
目标 coverage-report 将构建python,运行测试套件,并使用gcov
和 lcov .这个
-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-18408 , bpo-18520 )这个
pyvenv
命令现在接受--copies
选项使用副本而不是符号链接,即使在默认使用符号链接的系统上也是如此。(由Vinay Sajip在 bpo-18807 )这个
pyvenv
命令还接受--without-pip
选项以禁止将PIP自动引导到虚拟环境中。(由Nick Coghlan在 bpo-19552 作为其中的一部分 PEP 453 实施。)编码名称现在在的值集中是可选的
PYTHONIOENCODING
环境变量。这样就可以只设置错误处理程序,而不更改默认编码。(Serhiy Storchaka在 bpo-18818 )这个
bz2
,lzma
和gzip
模块open
功能现在支持x
(独占创建)模式。(蒂姆·希尼和金刚士基·柯克在 bpo-19201 , bpo-19222 和 bpo-19223 )
重大优化¶
UTF-32解码器现在快了3到4倍。(Serhiy Storchaka在 bpo-14625 )
现在,集的hash冲突成本降低了。现在,每个hash表探测检查一系列连续的相邻键/hash对,然后继续通过hash表进行随机探测。这会利用缓存位置降低冲突解决的成本。碰撞解决方案可以描述为线性探测和开放寻址的混合。附加线性探针的数量默认为9个。这可以在编译时通过将线性探针定义为任意值来更改。设置Linear_Probe=0以完全关闭线性探测。(由Raymond Hettinger在 bpo-18771 )
解释器启动速度大约快30%。一些措施导致加速。解释器在启动时加载的模块较少,例如
re
,collections
和locale
默认情况下,模块及其依赖项不再导入。对marshal模块进行了改进,以更快地加载编译后的python代码。(安托万·皮特鲁、克里斯蒂安·海姆斯和维克托·斯廷纳在 bpo-19219 , bpo-19218 , bpo-19209 , bpo-19205 和 bpo-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
现在使用而不是CRTmalloc
在里面obmalloc
.人工基准测试显示大约节省了3%的内存。os.urandom()
现在使用一个延迟打开的持久文件描述符,以避免在从多个线程并行运行时使用许多文件描述符。(由Antoine Pitrou在 bpo-18756 )
已弃用¶
本节介绍了各种API和其他在python 3.4中已被弃用的特性,这些特性将在python 3.5或更高版本中被删除。在大多数(但不是所有)情况下,使用不推荐使用的API将产生 DeprecationWarning
当解释器在启用了反预测警告的情况下运行时(例如,通过使用 -Wd
)
python api中的弃用¶
如上所述 PEP 451:导入系统的模块类型 ,一个数字
importlib
方法和函数已弃用:importlib.find_loader()
被替换importlib.util.find_spec()
;importlib.machinery.PathFinder.find_module()
被替换importlib.machinery.PathFinder.find_spec()
;importlib.abc.MetaPathFinder.find_module()
被替换importlib.abc.MetaPathFinder.find_spec()
;importlib.abc.PathEntryFinder.find_loader()
和find_module()
被替换importlib.abc.PathEntryFinder.find_spec()
所有的xxxLoader
ABCload_module
方法 (importlib.abc.Loader.load_module()
,importlib.abc.InspectLoader.load_module()
,importlib.abc.FileLoader.load_module()
,importlib.abc.SourceLoader.load_module()
)不应再实现,相反,加载程序应实现exec_module
方法 (importlib.abc.Loader.exec_module()
,importlib.abc.InspectLoader.exec_module()
importlib.abc.SourceLoader.exec_module()
)让输入系统处理其余的问题;importlib.abc.Loader.module_repr()
,importlib.util.module_for_loader()
,importlib.util.set_loader()
和importlib.util.set_package()
不再需要,因为它们的功能现在由导入系统自动处理。这个
imp
模块正等待取消预测。为了保持与Python2/3代码库的兼容性,目前没有计划删除该模块。这个
formatter
模块正在等待取消预测,并计划在python 3.6中删除。MD5
作为默认 食糜 对于hmac.new()
函数已弃用。python 3.6将需要一个显式的摘要名称或构造函数作为 食糜 参数。内部
Netrc
类中ftplib
在相当长一段时间内,模块在其docstring中被记录为已弃用。它现在发出一个DeprecationWarning
将在python 3.5中完全删除。无证件者 结束时间 参数
subprocess.Popen.wait()
不应该被公开,希望不会被使用;它已被弃用,很可能会在Python3.5中被删除。这个 strict 的参数
HTMLParser
被贬低。这个
plistlib
readPlist()
,writePlist()
,readPlistFromBytes()
和writePlistToBytes()
函数被弃用,取而代之的是相应的新函数load()
,dump()
,loads()
和dumps()
.Data()
不赞成使用bytes
构造函数。这个
sysconfig
钥匙SO
已弃用,已被替换为EXT_SUFFIX
.这个
U
各种接受的模式open
函数已弃用。在python3中,它不起任何作用,应该用适当的io.TextIOWrapper
(如果需要)及其 newline 参数。这个 语法分析器 的参数
xml.etree.ElementTree.iterparse()
已被弃用,正如 html 的参数XMLParser()
. 为了准备删除后者,所有的参数XMLParser
应通过关键字传递。
不推荐使用的功能¶
弃用¶
不再支持操作系统¶
已从源和生成工具中删除对以下操作系统的支持:
API和功能删除¶
已删除以下过时和以前不推荐使用的API和功能:
未经维护的
Misc/TextMate
和Misc/vim
目录已被删除(请参见 devguide 关于使用什么的建议)。这个
SO
已删除makefile宏(它已被替换为SHLIB_SUFFIX
和EXT_SUFFIX
宏指令) (bpo-16754 )这个
PyThreadState.tick_counter
字段已被删除;自从python 3.2引入“new gil”以来,它的值就毫无意义。 (bpo-19199 )PyLoader
和PyPycLoader
已从中删除importlib
. (由Taras Lyapun在 bpo-15641 )这个 strict 参数
HTTPConnection
和HTTPSConnection
已删除。不再支持HTTP 0.9样式的“简单响应”。被蔑视的
urllib.request.Request
getter和setter方法add_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
和is_unverifiable
已删除(请改用直接属性访问)。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.bjunk
和x in sm.bpopular
在哪里 sm 是一个SequenceMatcher
对象 (bpo-13248 )
代码清理¶
移植到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
当加载的源代码触发SyntaxError
或UnicodeDecodeError
. ASImportError
仅在找不到源代码时才引发,但在发现源代码但结构不正确时,会感觉到它超出了该含义的范围/过载。如果您以前捕获了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 参数
HTTPConnection
和HTTPSConnection
如果是按位置而不是按关键字指定其余参数,则更改这些参数的含义。如果您一直注意到拒绝警告,那么您的代码应该已经通过关键字指定了任何其他参数。字符串之间
from __future__ import ...
现在陈述 总是 举起一个SyntaxError
. 以前,如果没有前导docstring,间隙字符串有时会被忽略。这使cpython符合语言规范;jython和pypy已经是。 (bpo-17434 )ssl.SSLSocket.getpeercert()
和ssl.SSLSocket.do_handshake()
现在提出一个OSError
具有ENOTCONN
当SSLSocket
未连接,而不是以前引发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.FieldStorage
在cgi.FieldStorage
实例被垃圾收集。调用
read
或write
在一个封闭的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
,您需要更改代码。新的 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_SUFFIX
或SHLIB_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中的更改¶
PyEval_EvalFrameEx()
,PyObject_Repr()
和PyObject_Str()
与其他一些内部C API一起,现在包含一个调试断言,确保它们不会在可能会自动放弃当前活动异常的情况下使用。在预期和期望放弃活动异常的情况下(例如,因为已在本地用PyErr_Fetch()
或者被故意替换为另一个例外),一个明确的PyErr_Clear()
当调用这些操作(直接或间接)并针对启用断言编译的Python版本运行时,需要调用以避免触发断言。PyErr_SetImportError()
现在集TypeError
当其 msg 参数未设置。以前只NULL
返回时未设置异常。The result of the
PyOS_ReadlineFunctionPointer
callback must now be a string allocated byPyMem_RawMalloc()
orPyMem_RawRealloc()
, orNULL
if an error occurred, instead of a string allocated byPyMem_Malloc()
orPyMem_Realloc()
(bpo-16742)PyThread_set_key_value()
现在总是设置值。在Python3.3中,如果键已经存在(如果当前值是非“NULL”指针),则该函数将不执行任何操作。这个
f_tstate
(线程状态)字段PyFrameObject
已删除结构以修复错误:请参见 bpo-14432 理由是。
在3.4.3中更改¶
PEP 476:默认情况下为stdlib http客户端启用证书验证¶
http.client
以及使用它的模块,例如 urllib.request
和 xmlrpc.client
,现在将验证服务器是否提供由平台信任存储中的CA签名的证书,其主机名是否与默认请求的主机名匹配,从而显著提高了许多应用程序的安全性。
对于需要以前的旧行为的应用程序,它们可以传递备用上下文:
import urllib.request
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)