Python 3.5 中的新功能¶
- 编辑:
Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>
本文介绍了 Python 3.5 相对于 3.4 的新功能。Python 3.5 于 2015 年 9 月 13 日发布。有关完整的更改列表,请参阅变更日志。
另请参阅
PEP 478 - Python 3.5 发布计划
摘要 – 版本亮点¶
新语法特性
新库模块
新的内置特性
bytes % args
,bytearray % args
: PEP 461 – 向 bytes 和 bytearray 添加%
格式化。新的
bytes.hex()
,bytearray.hex()
和memoryview.hex()
方法。(由 Arnon Yaari 在 bpo-9951 中贡献。)memoryview
现在支持元组索引(包括多维)。(由 Antoine Pitrou 在 bpo-23632 中贡献。)生成器有一个新的
gi_yieldfrom
属性,它返回yield from
表达式迭代的对象。(由 Benno Leslie 和 Yury Selivanov 在 bpo-24450 中贡献。)当达到最大递归深度时,现在会引发一个新的
RecursionError
异常。(由 Georg Brandl 在 bpo-19235 中贡献。)
CPython 实现改进
当
LC_TYPE
区域设置为 POSIX 区域(C
区域)时,sys.stdin
和sys.stdout
现在使用surrogateescape
错误处理程序,而不是strict
错误处理程序。(由 Victor Stinner 在 bpo-19977 中贡献。).pyo
文件不再使用,并已被更灵活的方案取代,该方案在.pyc
名称中显式包含优化级别。(请参阅PEP 488 概述。)内置模块和扩展模块现在以多阶段过程初始化,这类似于 Python 模块的加载方式。(请参阅PEP 489 概述。)
标准库中的重大改进
collections.OrderedDict
现在在 C 中实现,这使得它快 4 到 100 倍。ssl
模块获得了 对内存 BIO 的支持,它将 SSL 协议处理与网络 IO 解耦。新的
os.scandir()
函数提供了一种 更好且明显更快的方式进行目录遍历。functools.lru_cache()
大部分已在 C 中重新实现,从而产生更好的性能。新的
subprocess.run()
函数提供了一种 简化运行子进程的方法。
安全改进
SSLv3 现在已在整个标准库中禁用。 仍然可以通过手动实例化
ssl.SSLContext
来启用它。(有关更多详细信息,请参阅 bpo-22638;此更改已向后移植到 CPython 3.4 和 2.7。)为了防止潜在的注入攻击,HTTP cookie 解析现在更加严格。(由 Antoine Pitrou 在 bpo-22796 中贡献。)
Windows 改进
一个新的 Windows 安装程序已取代旧的 MSI。有关更多信息,请参阅 在 Windows 上使用 Python。
Windows 构建现在使用 Microsoft Visual C++ 14.0,扩展模块应使用相同的版本。
请继续阅读以获取面向用户的更改的全面列表,其中包括许多其他小的改进、CPython 优化、弃用和潜在的移植问题。
新功能¶
PEP 492 - 具有 async 和 await 语法的协程¶
PEP 492 通过添加 可等待对象、协程函数、异步迭代 和 异步上下文管理器,极大地改进了 Python 中对异步编程的支持。
协程函数使用新的 async def
语法声明
>>> async def coro():
... return 'spam'
在协程函数内部,可以使用新的 await
表达式来挂起协程的执行,直到结果可用。 只要对象通过定义 __await__()
方法来实现 可等待 协议,就可以 _await_ 任何对象。
PEP 492 还添加了 async for
语句,以便方便地遍历异步可迭代对象。
使用新语法编写的简陋 HTTP 客户端的示例
import asyncio
async def http_get(domain):
reader, writer = await asyncio.open_connection(domain, 80)
writer.write(b'\r\n'.join([
b'GET / HTTP/1.1',
b'Host: %b' % domain.encode('latin-1'),
b'Connection: close',
b'', b''
]))
async for line in reader:
print('>>>', line)
writer.close()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(http_get('example.com'))
finally:
loop.close()
与异步迭代类似,还有一种用于异步上下文管理器的新语法。 以下脚本
import asyncio
async def coro(name, lock):
print('coro {}: waiting for lock'.format(name))
async with lock:
print('coro {}: holding the lock'.format(name))
await asyncio.sleep(1)
print('coro {}: releasing the lock'.format(name))
loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
loop.run_until_complete(coros)
finally:
loop.close()
将输出
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
请注意,async for
和 async with
只能在用 async def
声明的协程函数内部使用。
协程函数旨在在兼容的事件循环(例如 asyncio 循环)内运行。
注意
在 3.5.2 版本中更改:从 CPython 3.5.2 开始,__aiter__
可以直接返回 异步迭代器。 返回 可等待 对象将导致 PendingDeprecationWarning
。
有关更多详细信息,请参阅 异步迭代器 文档部分。
另请参阅
- PEP 492 – 具有 async 和 await 语法的协程
由 Yury Selivanov 编写和实现的 PEP。
PEP 465 - 用于矩阵乘法的专用中缀运算符¶
PEP 465 为矩阵乘法添加了 @
中缀运算符。 目前,没有内置的 Python 类型实现新的运算符,但是可以通过为常规、反射和就地矩阵乘法定义 __matmul__()
、__rmatmul__()
和 __imatmul__()
来实现。 这些方法的语义类似于定义其他中缀算术运算符的方法的语义。
矩阵乘法在数学、科学、工程的许多领域中都是一项非常常见的运算,而 @
的添加允许编写更简洁的代码
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
而不是
S = dot((dot(H, beta) - r).T,
dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
NumPy 1.10 支持新运算符
>>> import numpy
>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])
>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> x @ m
array([ 1., 1., 1.])
另请参阅
- PEP 465 – 用于矩阵乘法的专用中缀运算符
由 Nathaniel J. Smith 撰写;由 Benjamin Peterson 实现的 PEP。
PEP 448 - 额外的解包泛化¶
PEP 448 扩展了 *
可迭代解包运算符和 **
字典解包运算符的允许用法。 现在可以在 函数调用 中使用任意数量的解包
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5
>>> def fn(a, b, c, d):
... print(a, b, c, d)
...
>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4
类似地,元组、列表、集合和字典显示允许多次解包(请参阅 表达式列表 和 字典显示)
>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
另请参阅
- PEP 448 – 额外的解包泛化
由 Joshua Landau 撰写;由 Neil Girdhar、Thomas Wouters 和 Joshua Landau 实现的 PEP。
PEP 461 - 对字节和 bytearray 的百分比格式化支持¶
PEP 461 为 bytes
和 bytearray
添加了对 %
插值运算符 的支持。
虽然插值通常被认为是字符串操作,但在某些情况下,对 bytes
或 bytearrays
进行插值是有意义的,而弥补这种缺失功能所需的工作会降低代码的整体可读性。 在处理线格式协议时,此问题尤其重要,这些协议通常是二进制和 ASCII 兼容文本的混合。
示例
>>> b'Hello %b!' % b'World'
b'Hello World!'
>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
%b
不允许使用 Unicode,但 %a
接受它(相当于 repr(obj).encode('ascii', 'backslashreplace')
)
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'
>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
请注意,%s
和 %r
转换类型虽然受支持,但应仅在需要与 Python 2 兼容的代码库中使用。
另请参阅
- PEP 461 – 向字节和 bytearray 添加 % 格式化
由 Ethan Furman 撰写;由 Neil Schemenauer 和 Ethan Furman 实现的 PEP。
PEP 484 - 类型提示¶
函数注释语法自 3.0 版 (PEP 3107) 以来一直是 Python 的一项功能,但是注释的语义一直未定义。
经验表明,大多数函数注释用途是为函数参数和返回值提供类型提示。 很明显,如果标准库包含类型注释的基本定义和工具,这对 Python 用户将是有益的。
PEP 484 引入了一个 临时模块,以提供这些标准定义和工具,以及一些在注释不可用的情况下的约定。
例如,这是一个简单的函数,其参数和返回类型在注释中声明
def greeting(name: str) -> str:
return 'Hello ' + name
虽然这些注释在运行时可以通过通常的 __annotations__
属性获得,但运行时不会发生自动类型检查。 相反,假设会使用单独的脱机类型检查器(例如 mypy)进行按需源代码分析。
类型系统支持联合、泛型类型和一种名为 Any
的特殊类型,该类型与所有类型一致(即,可分配给所有类型和从所有类型分配)。
PEP 471 - os.scandir() 函数 – 更好更快的目录迭代器¶
PEP 471 向标准库添加了一个新的目录迭代函数 os.scandir()
。 此外,现在使用 scandir
来实现 os.walk()
,这使得它在 POSIX 系统上快 3 到 5 倍,在 Windows 系统上快 7 到 20 倍。 这主要是通过大大减少遍历目录树所需的 os.stat()
调用次数来实现的。
此外,scandir
返回一个迭代器,而不是返回文件名列表,这提高了在遍历非常大的目录时的内存效率。
以下示例展示了 os.scandir()
的一个简单用法,它用于显示给定 路径 中所有不以 '.'
开头的文件(不包括目录)。entry.is_file()
调用通常不会产生额外的系统调用。
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
另请参阅
- PEP 471 – os.scandir() 函数 – 一个更好更快的目录迭代器
本 PEP 由 Ben Hoyt 编写并实现,Victor Stinner 协助完成。
PEP 475: 重试因 EINTR 失败的系统调用¶
当一个等待 I/O 的系统调用被信号中断时,会返回一个 errno.EINTR
错误代码。之前,在这种情况下,Python 会引发 InterruptedError
。这意味着,在编写 Python 应用程序时,开发人员有两个选择:
忽略
InterruptedError
。处理
InterruptedError
,并在每次调用时尝试重新启动被中断的系统调用。
第一个选项会导致应用程序间歇性失败。第二个选项会添加大量的样板代码,使得代码几乎无法阅读。比较一下
print("Hello World")
和
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475 实现了在 EINTR
上自动重试系统调用。这消除了在大多数情况下用户代码中处理 EINTR
或 InterruptedError
的负担,并使包括标准库在内的 Python 程序更加健壮。请注意,只有当信号处理程序没有引发异常时,系统调用才会重试。
以下是现在在被信号中断时会重试的函数列表:
faulthandler
模块的函数;os
函数:fchdir()
、fchmod()
、fchown()
、fdatasync()
、fstat()
、fstatvfs()
、fsync()
、ftruncate()
、mkfifo()
、mknod()
、open()
、posix_fadvise()
、posix_fallocate()
、pread()
、pwrite()
、read()
、readv()
、sendfile()
、wait3()
、wait4()
、wait()
、waitid()
、waitpid()
、write()
、writev()
;特殊情况:
os.close()
和os.dup2()
现在会忽略EINTR
错误;系统调用不会重试(请参阅 PEP 中的原理);select
函数:devpoll.poll()
、epoll.poll()
、kqueue.control()
、poll.poll()
、select()
;socket
类的方法:accept()
、connect()
(非阻塞套接字除外)、recv()
、recvfrom()
、recvmsg()
、send()
、sendall()
、sendmsg()
、sendto()
;
另请参阅
- PEP 475 – 重试因 EINTR 失败的系统调用
本 PEP 和实现由 Charles-François Natali 和 Victor Stinner 编写,Antoine Pitrou(法国关系)协助完成。
PEP 479: 更改生成器内部 StopIteration 的处理方式¶
在 Python 3.4 及更早版本中,生成器和 StopIteration
的交互有时令人惊讶,并且可能会隐藏一些晦涩的错误。以前,在生成器函数内部意外引发的 StopIteration
会被驱动生成器的循环结构解释为迭代的结束。
PEP 479 更改了生成器的行为:当在生成器内部引发 StopIteration
异常时,它会在退出生成器帧之前被替换为 RuntimeError
。此更改的主要目标是简化在以下情况下调试:一个未受保护的 next()
调用引发 StopIteration
,并导致由生成器控制的迭代静默终止。这与 yield from
构造结合使用时尤其有害。
这是一个不向后兼容的更改,因此要启用新行为,必须使用 __future__ 导入:
>>> from __future__ import generator_stop
>>> def gen():
... next(iter([]))
... yield
...
>>> next(gen())
Traceback (most recent call last):
File "<stdin>", line 2, in gen
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
如果没有 __future__
导入,每当在生成器内部引发 StopIteration
异常时,都会引发 PendingDeprecationWarning
。
另请参阅
- PEP 479 – 更改生成器内部 StopIteration 的处理方式
本 PEP 由 Chris Angelico 和 Guido van Rossum 编写。由 Chris Angelico、Yury Selivanov 和 Nick Coghlan 实现。
PEP 485:用于测试近似相等性的函数¶
PEP 485 添加了 math.isclose()
和 cmath.isclose()
函数,用于判断两个值是否近似相等或彼此“接近”。是否认为两个值接近取决于给定的绝对和相对容差。相对容差是 isclose
参数之间允许的最大差异,相对于较大的绝对值
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
也可以使用绝对容差比较两个值,绝对容差必须是非负值
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
另请参阅
- PEP 485 – 用于测试近似相等性的函数
此 PEP 由 Christopher Barker 撰写;由 Chris Barker 和 Tal Einat 实现。
PEP 486:使 Python 启动器能够感知虚拟环境¶
PEP 486 使 Windows 启动器(请参阅 PEP 397)能够感知活动的虚拟环境。当使用默认解释器并且设置了 VIRTUAL_ENV
环境变量时,将使用虚拟环境中的解释器。
另请参阅
- PEP 486 – 使 Python 启动器能够感知虚拟环境
此 PEP 由 Paul Moore 撰写和实现。
PEP 488:消除 PYO 文件¶
PEP 488 废除了 .pyo
文件的概念。这意味着 .pyc
文件既表示未优化的字节码,也表示优化的字节码。为了防止需要不断重新生成字节码文件,.pyc
文件现在在名称中有一个可选的 opt-
标签,表示字节码已优化。这样做带来的副作用是在 -O
或 -OO
下运行时,不会再发生字节码文件名冲突。因此,从 -O
和 -OO
生成的字节码文件现在可以同时存在。importlib.util.cache_from_source()
更新了 API 以帮助进行此更改。
另请参阅
- PEP 488 – 消除 PYO 文件
此 PEP 由 Brett Cannon 撰写和实现。
PEP 489:多阶段扩展模块初始化¶
PEP 489 更新了扩展模块初始化,以利用 Python 3.4 中 PEP 451 引入的两步模块加载机制。
此更改使选择使用新机制的扩展模块的导入语义更接近于 Python 源代码和字节码模块的导入语义,包括能够使用任何有效的标识符作为模块名称,而不是仅限于 ASCII。
另请参阅
- PEP 489 – 多阶段扩展模块初始化
此 PEP 由 Petr Viktorin、Stefan Behnel 和 Nick Coghlan 撰写;由 Petr Viktorin 实现。
其他语言更改¶
对核心 Python 语言所做的一些较小的更改如下
添加了
"namereplace"
错误处理程序。"backslashreplace"
错误处理程序现在可以用于解码和翻译。(由 Serhiy Storchaka 在 bpo-19676 和 bpo-22286 中贡献。)-b
选项现在会影响bytes
与int
的比较。(由 Serhiy Storchaka 在 bpo-23681 中贡献。)新的哈萨克语
kz1048
和塔吉克语koi8_t
编解码器。(由 Serhiy Storchaka 在 bpo-22682 和 bpo-22681 中贡献。)属性文档字符串现在是可写的。这对于
collections.namedtuple()
文档字符串特别有用。(由 Berker Peksag 在 bpo-24064 中贡献。)现在支持涉及相对导入的循环导入。(由 Brett Cannon 和 Antoine Pitrou 在 bpo-17636 中贡献。)
新模块¶
typing¶
zipapp¶
新的 zipapp
模块(在 PEP 441 中指定)提供了一个 API 和命令行工具,用于创建可执行的 Python Zip 应用程序,该应用程序在 Python 2.6 中通过 bpo-1739468 引入,但当时或此后都没有得到很好的宣传。
使用新模块,打包应用程序就像将所有文件(包括 __main__.py
文件)放入 myapp
目录并运行一样简单
$ python -m zipapp myapp
$ python myapp.pyz
该模块的实现由 Paul Moore 在 bpo-23491 中贡献。
另请参阅
PEP 441 – 改进 Python ZIP 应用程序支持
改进的模块¶
argparse¶
ArgumentParser
类现在允许通过将 allow_abbrev 设置为 False
来禁用长选项的 缩写用法。(由 Jonathan Paugh、Steven Bethard、paul j3 和 Daniel Eriksson 在 bpo-14910 中贡献。)
asyncio¶
由于 asyncio
模块是 临时的,因此 Python 3.5 中引入的所有更改也都向后移植到了 Python 3.4.x。
自 Python 3.4.0 以来,asyncio
模块中的显著更改
新的调试 API:
loop.set_debug()
和loop.get_debug()
方法。(由 Victor Stinner 贡献。)Proactor 事件循环现在支持 SSL。(由 Antoine Pitrou 和 Victor Stinner 在 bpo-22560 中贡献。)
新的
loop.is_closed()
方法,用于检查事件循环是否已关闭。(由 Victor Stinner 在 bpo-21326 中贡献。)新的
loop.create_task()
方法,用于方便地创建并安排新的Task
以用于协程。create_task
方法也被所有将协程包装到任务中的 asyncio 函数使用,例如asyncio.wait()
、asyncio.gather()
等。(由 Victor Stinner 贡献。)新的
transport.get_write_buffer_limits()
方法,用于查询流量控制的 *high-* 和 *low-* 水位限制。(由 Victor Stinner 贡献。)async()
函数已弃用,建议使用ensure_future()
。(由 Yury Selivanov 贡献。)新增
loop.set_task_factory()
和loop.get_task_factory()
方法,用于自定义loop.create_task()
方法使用的任务工厂。(由 Yury Selivanov 贡献。)新增
Queue.join()
和Queue.task_done()
队列方法。(由 Victor Stinner 贡献。)删除了
JoinableQueue
类,改为使用asyncio.Queue
类。(由 Victor Stinner 贡献。)
3.5.1 中的更新
ensure_future()
函数以及所有使用它的函数(例如loop.run_until_complete()
)现在接受各种 可等待对象。(由 Yury Selivanov 贡献。)新增
run_coroutine_threadsafe()
函数,用于从其他线程向事件循环提交协程。(由 Vincent Michel 贡献。)新增
Transport.is_closing()
方法,用于检查传输是否正在关闭或已关闭。(由 Yury Selivanov 贡献。)loop.create_server()
方法现在可以接受主机列表。(由 Yann Sionneau 贡献。)
3.5.2 中的更新
新增
loop.create_future()
方法,用于创建 Future 对象。这允许替代的事件循环实现,例如 uvloop,提供更快的asyncio.Future
实现。(由 Yury Selivanov 贡献。)新增
loop.get_exception_handler()
方法,用于获取当前的异常处理程序。(由 Yury Selivanov 贡献。)新增
StreamReader.readuntil()
方法,用于从流中读取数据,直到出现分隔符字节序列。(由 Mark Korenberg 贡献。)优化了
loop.create_connection()
和loop.create_server()
方法,如果地址已解析,则避免调用系统getaddrinfo
函数。(由 A. Jesse Jiryu Davis 贡献。)loop.sock_connect(sock, address)
不再需要在调用之前解析address。(由 A. Jesse Jiryu Davis 贡献。)
bz2¶
BZ2Decompressor.decompress
方法现在接受一个可选的 max_length 参数,以限制解压缩数据的最大大小。(由 Nikolaus Rath 在 bpo-15955 中贡献。)
cgi¶
FieldStorage
类现在支持 上下文管理器 协议。(由 Berker Peksag 在 bpo-20289 中贡献。)
cmath¶
新增函数 isclose()
提供了一种测试近似相等的方法。(由 Chris Barker 和 Tal Einat 在 bpo-24270 中贡献。)
code¶
InteractiveInterpreter.showtraceback()
方法现在会打印完整的链式回溯,就像交互式解释器一样。(由 Claudiu Popa 在 bpo-17442 中贡献。)
collections¶
OrderedDict
类现在用 C 实现,这使其速度提高了 4 到 100 倍。(由 Eric Snow 在 bpo-16991 中贡献。)
OrderedDict.items()
, OrderedDict.keys()
, OrderedDict.values()
视图现在支持 reversed()
迭代。(由 Serhiy Storchaka 在 bpo-19505 中贡献。)
deque
类现在定义了 index()
, insert()
和 copy()
,并支持 +
和 *
运算符。这允许将 deques 识别为 MutableSequence
,并提高它们对列表的替代性。(由 Raymond Hettinger 在 bpo-23704 中贡献。)
由 namedtuple()
生成的文档字符串现在可以更新
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
(由 Berker Peksag 在 bpo-24064 中贡献。)
UserString
类现在实现了 __getnewargs__()
, __rmod__()
, casefold()
, format_map()
, isprintable()
和 maketrans()
方法,以匹配 str
的相应方法。(由 Joe Jevnik 在 bpo-22189 中贡献。)
collections.abc¶
Sequence.index()
方法现在接受 start 和 stop 参数,以匹配 tuple
, list
等的相应方法。(由 Devin Jeanpierre 在 bpo-23086 中贡献。)
新增 Generator
抽象基类。(由 Stefan Behnel 在 bpo-24018 中贡献。)
新增 Awaitable
, Coroutine
, AsyncIterator
和 AsyncIterable
抽象基类。(由 Yury Selivanov 在 bpo-24184 中贡献。)
对于早期的 Python 版本,新 ABC 的向后移植版本可在一个外部 PyPI 包 中获得。
compileall¶
新的 compileall
选项 -j N
允许同时运行 N 个工作进程以执行并行字节码编译。 compile_dir()
函数具有相应的 workers
参数。(由 Claudiu Popa 在 bpo-16104 中贡献。)
另一个新选项 -r
允许控制子目录的最大递归级别。(由 Claudiu Popa 在 bpo-19628 中贡献。)
现在可以多次指定 -q
命令行选项,在这种情况下,所有输出(包括错误)都将被抑制。compile_dir()
、 compile_file()
和 compile_path()
中的相应 quiet
参数现在可以接受一个整数值,该值指示输出抑制的级别。(由 Thomas Kluyver 在 bpo-21338 中贡献。)
concurrent.futures¶
当使用 ProcessPoolExecutor()
时,Executor.map()
方法现在接受一个 chunksize 参数以允许批量处理任务,从而提高性能。(由 Dan O’Reilly 在 bpo-11271 中贡献。)
ThreadPoolExecutor
构造函数中的工作进程数量现在是可选的。 默认值为 CPU 数量的 5 倍。(由 Claudiu Popa 在 bpo-21527 中贡献。)
configparser¶
现在,configparser
提供了一种通过在 ConfigParser
构造函数中指定转换器字典,或通过在 ConfigParser
子类中将它们定义为方法来定制值的转换。在解析器实例中定义的转换器由其节代理继承。
示例
>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
(由 Łukasz Langa 在 bpo-18159 中贡献。)
contextlib¶
新的 redirect_stderr()
上下文管理器(类似于 redirect_stdout()
)使实用程序脚本更容易处理将其输出写入 sys.stderr
且不提供任何重定向选项的僵化 API
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
... logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
(由 Berker Peksag 在 bpo-22389 中贡献。)
csv¶
writerow()
方法现在支持任意可迭代对象,而不仅仅是序列。(由 Serhiy Storchaka 在 bpo-23171 中贡献。)
curses¶
新的 update_lines_cols()
函数更新 LINES
和 COLS
模块变量。这对于检测手动屏幕调整大小很有用。(由 Arnon Yaari 在 bpo-4254 中贡献。)
dbm¶
当标志的值为 "n"
时,dumb.open
总是创建一个新的数据库。(由 Claudiu Popa 在 bpo-18039 中贡献。)
difflib¶
现在可以通过使用新的仅关键字参数 charset 来自定义 HtmlDiff.make_file()
生成的 HTML 文档的字符集。HTML 文档的默认字符集从 "ISO-8859-1"
更改为 "utf-8"
。(由 Berker Peksag 在 bpo-2052 中贡献。)
现在 diff_bytes()
函数可以比较字节字符串列表。 这修复了 Python 2 中的一个回归。(由 Terry J. Reedy 和 Greg Ward 在 bpo-17445 中贡献。)
distutils¶
build
和 build_ext
命令现在都接受 -j
选项来启用扩展模块的并行构建。(由 Antoine Pitrou 在 bpo-5309 中贡献。)
distutils
模块现在支持 xz
压缩,并且可以通过将 xztar
作为参数传递给 bdist --format
来启用。(由 Serhiy Storchaka 在 bpo-16314 中贡献。)
doctest¶
如果 module 不包含文档字符串,则 DocTestSuite()
函数返回一个空的 unittest.TestSuite
,而不是引发 ValueError
。(由 Glenn Jones 在 bpo-15916 中贡献。)
email¶
一个新的策略选项 Policy.mangle_from_
控制邮件正文中以 "From "
开头的行是否在生成器中被添加 ">"
字符作为前缀。对于 compat32
,默认值为 True
,对于所有其他策略,默认值为 False
。(由 Milan Oberkirch 在 bpo-20098 中贡献。)
一个新的 Message.get_content_disposition()
方法提供了一种简单的方式来访问 Content-Disposition 标头的规范值。(由 Abhilash Raj 在 bpo-21083 中贡献。)
一个新的策略选项 EmailPolicy.utf8
可以设置为 True
,以便使用 UTF-8 字符集对电子邮件标头进行编码,而不是使用编码字。这使得 Messages
可以根据 RFC 6532 进行格式化,并与支持 RFC 6531 SMTPUTF8
扩展的 SMTP 服务器一起使用。(由 R. David Murray 在 bpo-24211 中贡献。)
mime.text.MIMEText
构造函数现在接受一个 charset.Charset
实例。(由 Claude Paroz 和 Berker Peksag 在 bpo-16324 中贡献。)
enum¶
如果只提供 names,则 Enum
可调用对象有一个新的参数 start,用于指定枚举值的初始数字
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
(由 Ethan Furman 在 bpo-21706 中贡献。)
faulthandler¶
enable()
、register()
、dump_traceback()
和 dump_traceback_later()
函数现在除了接受类文件对象外,还接受文件描述符。(由 Wei Wu 在 bpo-23566 中贡献。)
functools¶
lru_cache()
的大部分机制现在在 C 中实现,这使其速度显着加快。(由 Matt Joiner、Alexey Kachayev 和 Serhiy Storchaka 在 bpo-14373 中贡献。)
glob¶
iglob()
和 glob()
函数现在支持使用 "**"
模式在子目录中进行递归搜索。(由 Serhiy Storchaka 在 bpo-13968 中贡献。)
gzip¶
GzipFile
构造函数的 mode 参数现在接受 "x"
以请求独占创建。(由 Tim Heaney 在 bpo-19222 中贡献。)
heapq¶
现在可以通过在新的可选 key 关键字参数中传递一个 键函数 来定制 merge()
中的元素比较,并且可以使用新的可选 reverse 关键字参数来反转元素比较
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
(由 Raymond Hettinger 在 bpo-13742 中贡献。)
http¶
一个新的 HTTPStatus
枚举,它定义了一组 HTTP 状态代码、原因短语和英文编写的长描述。(由 Demian Brecht 在 bpo-21793 中贡献。)
http.client¶
当远程服务器连接意外关闭时,HTTPConnection.getresponse()
现在会引发 RemoteDisconnected
异常。此外,如果引发 ConnectionError
(RemoteDisconnected
是其子类),客户端套接字现在会自动关闭,并在下一次请求时重新连接
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
try:
conn.request('GET', '/')
resp = conn.getresponse()
except http.client.RemoteDisconnected:
pass
(由 Martin Panter 在 bpo-3566 中贡献。)
idlelib 和 IDLE¶
由于 idlelib 实现了 IDLE shell 和编辑器,并且不打算被其他程序导入,因此它会在每次发布时得到改进。有关自 3.4.0 以来的累积更改列表以及未来 3.5.x 版本中所做的更改,请参阅 Lib/idlelib/NEWS.txt
。此文件也可以从 IDLE 对话框中获得。
imaplib¶
IMAP4
类现在支持 上下文管理器 协议。当在 with
语句中使用时,IMAP4 LOGOUT
命令将在块的末尾自动调用。(由 Tarek Ziadé 和 Serhiy Storchaka 在 bpo-4972 中贡献。)
imaplib
模块现在通过 IMAP4.enable()
方法支持 RFC 5161 (ENABLE 扩展) 和 RFC 6855 (UTF-8 支持)。一个新的 IMAP4.utf8_enabled
属性跟踪是否启用了 RFC 6855 支持。(由 Milan Oberkirch、R. David Murray 和 Maciej Szulik 在 bpo-21800 中贡献。)
imaplib
模块现在会自动使用 UTF-8 编码非 ASCII 字符串用户名和密码,正如 RFC 推荐的那样。(由 Milan Oberkirch 在 bpo-21800 中贡献。)
imghdr¶
what()
函数现在可以识别 OpenEXR 格式(由 Martin Vignali 和 Claudiu Popa 在 bpo-20295 中贡献)和 WebP 格式(由 Fabrice Aneche 和 Claudiu Popa 在 bpo-20197 中贡献。)
importlib¶
util.LazyLoader
类允许在启动时间很重要的应用程序中延迟加载模块。(由 Brett Cannon 在 bpo-17621 中贡献。)
abc.InspectLoader.source_to_code()
方法现在是一个静态方法。这使得通过运行 exec(code, module.__dict__)
来初始化一个使用字符串编译而来的代码的模块对象变得更加容易。(由 Brett Cannon 在 bpo-21156 中贡献。)
现在推荐使用新的 util.module_from_spec()
函数来创建新的模块。与直接创建 types.ModuleType
实例不同,这个新的函数将根据传入的 spec 对象设置各种受导入控制的属性。(由 Brett Cannon 在 bpo-20383 中贡献。)
inspect¶
Signature
和 Parameter
类现在都是可 pickle 和可哈希的。(由 Yury Selivanov 在 bpo-20726 和 bpo-20334 中贡献。)
新的 BoundArguments.apply_defaults()
方法提供了一种为缺失的参数设置默认值的方法
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
(由 Yury Selivanov 在 bpo-24190 中贡献。)
新的类方法 Signature.from_callable()
使 Signature
的子类化变得更加容易。(由 Yury Selivanov 和 Eric Snow 在 bpo-17373 中贡献。)
signature()
函数现在接受一个可选的关键字参数 *follow_wrapped*,当设置为 False
时,禁用自动跟踪 __wrapped__
链接。(由 Yury Selivanov 在 bpo-20691 中贡献。)
添加了一组新的函数来检查协程函数和协程对象:iscoroutine()
、iscoroutinefunction()
、isawaitable()
、getcoroutinelocals()
和 getcoroutinestate()
。(由 Yury Selivanov 在 bpo-24017 和 bpo-24400 中贡献。)
stack()
、trace()
、getouterframes()
和 getinnerframes()
函数现在返回命名元组的列表。(由 Daniel Shahaf 在 bpo-16808 中贡献。)
io¶
新的 BufferedIOBase.readinto1()
方法,最多使用一次对底层原始流的 RawIOBase.read()
或 RawIOBase.readinto()
方法的调用。(由 Nikolaus Rath 在 bpo-20578 中贡献。)
ipaddress¶
IPv4Network
和 IPv6Network
类现在都接受 (address, netmask)
元组参数,以便于从现有地址构建网络对象
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
(由 Peter Moody 和 Antoine Pitrou 在 bpo-16531 中贡献。)
IPv4Network
和 IPv6Network
类新的 reverse_pointer
属性返回反向 DNS PTR 记录的名称
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
(由 Leon Weber 在 bpo-20480 中贡献。)
json¶
json.tool
命令行界面现在保留输入中 JSON 对象中键的顺序。新的 --sort-keys
选项可用于按字母顺序对键进行排序。(由 Berker Peksag 在 bpo-21650 中贡献。)
JSON 解码器现在引发 JSONDecodeError
而不是 ValueError
,以提供关于错误的更好上下文信息。(由 Serhiy Storchaka 在 bpo-19361 中贡献。)
linecache¶
新的 lazycache()
函数可用于捕获关于非基于文件的模块的信息,以便允许稍后通过 getline()
获取其行。这避免了在实际需要一行之前执行 I/O,而无需无限期地携带模块全局变量。(由 Robert Collins 在 bpo-17911 中贡献。)
locale¶
新的 delocalize()
函数可用于将字符串转换为规范化的数字字符串,同时考虑 LC_NUMERIC
设置
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
(由 Cédric Krier 在 bpo-13918 中贡献。)
logging¶
所有日志记录方法(Logger
log()
、exception()
、critical()
、debug()
等)现在接受异常实例作为 *exc_info* 参数,除了布尔值和异常元组之外
>>> import logging
>>> try:
... 1/0
... except ZeroDivisionError as ex:
... logging.error('exception', exc_info=ex)
ERROR:root:exception
(由 Yury Selivanov 在 bpo-20537 中贡献。)
handlers.HTTPHandler
类现在接受一个可选的 ssl.SSLContext
实例来配置 HTTP 连接中使用的 SSL 设置。(由 Alex Gaynor 在 bpo-22788 中贡献。)
现在,handlers.QueueListener
类接受一个名为 respect_handler_level 的关键字参数。如果设置为 True
,则会将消息传递给考虑处理程序级别的处理程序。(由 Vinay Sajip 贡献。)
lzma¶
现在,LZMADecompressor.decompress()
方法接受一个可选的 max_length 参数,以限制解压缩数据的最大大小。(由 Martin Panter 在 bpo-15955 中贡献。)
math¶
在 math
模块中添加了两个新常量:inf
和 nan
。(由 Mark Dickinson 在 bpo-23185 中贡献。)
新函数 isclose()
提供了一种测试近似相等性的方法。(由 Chris Barker 和 Tal Einat 在 bpo-24270 中贡献。)
添加了一个新的 gcd()
函数。现在 fractions.gcd()
函数已被弃用。(由 Mark Dickinson 和 Serhiy Storchaka 在 bpo-22486 中贡献。)
multiprocessing¶
sharedctypes.synchronized()
对象现在支持 上下文管理器 协议。(由 Charles-François Natali 在 bpo-21565 中贡献。)
operator¶
现在,attrgetter()
、itemgetter()
和 methodcaller()
对象支持 pickle 操作。(由 Josh Rosenberg 和 Serhiy Storchaka 在 bpo-22955 中贡献。)
新的 matmul()
和 imatmul()
函数用于执行矩阵乘法。(由 Benjamin Peterson 在 bpo-21176 中贡献。)
os¶
添加了新的 scandir()
函数,该函数返回 DirEntry
对象的迭代器。如果可能,scandir()
会在扫描目录时提取文件属性,从而无需执行后续系统调用来确定文件类型或属性,这可能会显著提高性能。(由 Ben Hoyt 在 Victor Stinner 的帮助下,在 bpo-22524 中贡献。)
在 Windows 上,现在可以使用新的 stat_result.st_file_attributes
属性。它对应于 GetFileInformationByHandle()
返回的 BY_HANDLE_FILE_INFORMATION
结构的 dwFileAttributes
成员。(由 Ben Hoyt 在 bpo-21719 中贡献。)
现在,urandom()
函数在 Linux 3.17 或更高版本上使用 getrandom()
系统调用,在 OpenBSD 5.6 或更高版本上使用 getentropy()
,从而无需使用 /dev/urandom
并避免因潜在的文件描述符耗尽而导致的失败。(由 Victor Stinner 在 bpo-22181 中贡献。)
新的 get_blocking()
和 set_blocking()
函数允许获取和设置文件描述符的阻塞模式 (O_NONBLOCK
)。 (由 Victor Stinner 在 bpo-22054 中贡献。)
现在,Windows 上支持 truncate()
和 ftruncate()
函数。(由 Steve Dower 在 bpo-23668 中贡献。)
有一个新的 os.path.commonpath()
函数,返回每个传递的路径名的最长公共子路径。与 os.path.commonprefix()
函数不同,它始终返回有效的路径。
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
(由 Rafik Draoui 和 Serhiy Storchaka 在 bpo-10395 中贡献。)
pathlib¶
新的 Path.samefile()
方法可用于检查路径是否指向与另一个路径相同的文件,该路径可以是另一个 Path
对象或字符串。
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
(由 Vajrasky Kok 和 Antoine Pitrou 在 bpo-19775 中贡献。)
现在,Path.mkdir()
方法接受一个新的可选参数 exist_ok,以匹配 mkdir -p
和 os.makedirs()
的功能。(由 Berker Peksag 在 bpo-21539 中贡献。)
有一个新的 Path.expanduser()
方法来扩展 ~
和 ~user
前缀。(由 Serhiy Storchaka 和 Claudiu Popa 在 bpo-19776 中贡献。)
可以使用新的 Path.home()
类方法来获取表示用户主目录的 Path
实例。(由 Victor Salgado 和 Mayank Tripathi 在 bpo-19777 中贡献。)
新的 Path.write_text()
、Path.read_text()
、Path.write_bytes()
、Path.read_bytes()
方法简化了文件的读/写操作。
以下代码片段将创建或重写现有文件 ~/spam42
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
(由 Christopher Welborn 在 bpo-20218 中贡献。)
pickle¶
现在,可以使用早于协议版本 4 的 pickle 协议 来 pickle 嵌套对象,例如未绑定方法或嵌套类。协议版本 4 已经支持这些情况。(由 Serhiy Storchaka 在 bpo-23611 中贡献。)
poplib¶
新的 POP3.utf8()
命令支持 RFC 6856(国际化电子邮件),如果 POP 服务器支持它。(由 Milan OberKirch 在 bpo-21804 中贡献。)
re¶
现在允许在后向断言中使用对固定长度组的引用和条件引用。
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
(由 Serhiy Storchaka 在 bpo-9179 中贡献。)
正则表达式中捕获组的数量不再限制为 100。(由 Serhiy Storchaka 在 bpo-22437 中贡献。)
sub()
和 subn()
函数现在将未匹配的组替换为空字符串,而不是引发异常。(由 Serhiy Storchaka 在 bpo-1519638 中贡献。)
re.error
异常具有新的属性,msg
, pattern
, pos
, lineno
和 colno
,这些属性提供了关于错误的更好的上下文信息。
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(由 Serhiy Storchaka 在 bpo-22578 中贡献。)
readline¶
新的 append_history_file()
函数可用于将历史记录中指定数量的尾随元素附加到给定的文件中。(由 Bruno Cauet 在 bpo-22940 中贡献。)
selectors¶
新的 DevpollSelector
支持在 Solaris 上高效的 /dev/poll
轮询。(由 Giampaolo Rodola’ 在 bpo-18931 中贡献。)
shutil¶
move()
函数现在接受一个 *copy_function* 参数,例如,允许使用 copy()
函数而不是默认的 copy2()
,如果需要在移动时忽略文件元数据。(由 Claudiu Popa 在 bpo-19840 中贡献。)
make_archive()
函数现在支持 *xztar* 格式。(由 Serhiy Storchaka 在 bpo-5411 中贡献。)
signal¶
在 Windows 上,set_wakeup_fd()
函数现在也支持套接字句柄。(由 Victor Stinner 在 bpo-22018 中贡献。)
signal
模块中的各种 SIG*
常量已转换为 Enums
。 这允许在调试期间打印有意义的名称,而不是整数“魔术数字”。(由 Giampaolo Rodola’ 在 bpo-21076 中贡献。)
smtpd¶
SMTPServer
和 SMTPChannel
类现在都接受 *decode_data* 关键字参数,以确定 SMTP 事务的 DATA
部分是否使用 "utf-8"
编解码器解码,或者是否作为字节字符串提供给 SMTPServer.process_message()
方法。 为了向后兼容,默认为 True
,但在 Python 3.6 中将更改为 False
。 如果 *decode_data* 设置为 False
,则 process_message
方法必须准备好接受关键字参数。(由 Maciej Szulik 在 bpo-19662 中贡献。)
如果 *decode_data* 已设置为 True
,SMTPServer
类现在会通告 8BITMIME
扩展 (RFC 6152)。 如果客户端在 MAIL
命令上指定了 BODY=8BITMIME
,它会通过 *mail_options* 关键字传递给 SMTPServer.process_message()
。(由 Milan Oberkirch 和 R. David Murray 在 bpo-21795 中贡献。)
SMTPServer
类现在也支持 SMTPUTF8
扩展 (RFC 6531: 国际化电子邮件)。 如果客户端在 MAIL
命令上指定了 SMTPUTF8 BODY=8BITMIME
,它们会通过 *mail_options* 关键字传递给 SMTPServer.process_message()
。 process_message
方法负责正确处理 SMTPUTF8
数据。(由 Milan Oberkirch 在 bpo-21725 中贡献。)
现在可以在 SMTPServer
构造函数中直接或通过名称解析提供 IPv6 地址,并使其成功连接。(由 Milan Oberkirch 在 bpo-14758 中贡献。)
smtplib¶
新的 SMTP.auth()
方法提供了一种方便的方法来实现自定义身份验证机制。(由 Milan Oberkirch 在 bpo-15014 中贡献。)
SMTP.set_debuglevel()
方法现在接受一个额外的调试级别 (2),它会在调试消息中启用时间戳。(由 Gavin Chappell 和 Maciej Szulik 在 bpo-16914 中贡献。)
SMTP.sendmail()
和 SMTP.send_message()
方法现在都支持 RFC 6531 (SMTPUTF8)。(由 Milan Oberkirch 和 R. David Murray 在 bpo-22027 中贡献。)
sndhdr¶
what()
和 whathdr()
函数现在返回一个 namedtuple()
。(由 Claudiu Popa 在 bpo-18615 中贡献。)
socket¶
具有超时功能的函数现在使用单调时钟,而不是系统时钟。(由 Victor Stinner 在 bpo-22043 中贡献。)
新的 socket.sendfile()
方法允许通过使用 UNIX 上高性能的 os.sendfile()
函数通过套接字发送文件,从而使上传速度比使用普通的 socket.send()
快 2 到 3 倍。(由 Giampaolo Rodola’ 在 bpo-17552 中贡献。)
socket.sendall()
方法不再在每次接收或发送字节时重置套接字超时。 套接字超时现在是发送所有数据的最大总持续时间。(由 Victor Stinner 在 bpo-23853 中贡献。)
socket.listen()
方法的 backlog 参数现在是可选的。 默认情况下,它设置为 SOMAXCONN
或 128
,以较小者为准。(由 Charles-François Natali 在 bpo-21455 中贡献。)
ssl¶
内存 BIO 支持¶
(由 Geert Jansen 在 bpo-21965 中贡献。)
添加了新的 SSLObject
类,以便在 SSLSocket
的网络 I/O 功能不是必需的或不是最佳的情况下,提供 SSL 协议支持。 SSLObject
表示一个 SSL 协议实例,但不实现任何网络 I/O 方法,而是提供一个内存缓冲区接口。 新的 MemoryBIO
类可用于在 Python 和 SSL 协议实例之间传递数据。
内存 BIO SSL 支持主要用于实现异步 I/O 的框架,在这种框架中,SSLSocket
的就绪模型(“select/poll”)效率较低。
可以使用新的 SSLContext.wrap_bio()
方法来创建一个新的 SSLObject
实例。
应用层协议协商支持¶
(由 Benjamin Peterson 在 bpo-20188 中贡献。)
如果存在 OpenSSL 支持,则 ssl
模块现在实现了 应用层协议协商 TLS 扩展,如 RFC 7301 中所述。
新的 SSLContext.set_alpn_protocols()
可用于指定套接字在 TLS 握手期间应通告的协议。
新的 SSLSocket.selected_alpn_protocol()
返回在 TLS 握手期间选择的协议。 HAS_ALPN
标志指示是否存在 ALPN 支持。
其他更改¶
有一个新的 SSLSocket.version()
方法来查询正在使用的实际协议版本。(由 Antoine Pitrou 在 bpo-20421 中贡献。)
SSLSocket
类现在实现一个 SSLSocket.sendfile()
方法。(由 Giampaolo Rodola' 在 bpo-17552 中贡献。)
如果操作会阻塞, SSLSocket.send()
方法现在会在非阻塞套接字上引发 ssl.SSLWantReadError
或 ssl.SSLWantWriteError
异常。 以前,它会返回 0
。(由 Nikolaus Rath 在 bpo-20951 中贡献。)
根据 RFC 5280, cert_time_to_seconds()
函数现在将输入时间解释为 UTC 而不是本地时间。此外,返回值始终为 int
。(由 Akira Li 在 bpo-19940 中贡献。)
新的 SSLObject.shared_ciphers()
和 SSLSocket.shared_ciphers()
方法返回客户端在握手期间发送的密码列表。(由 Benjamin Peterson 在 bpo-23186 中贡献。)
SSLSocket.do_handshake()
, SSLSocket.read()
, SSLSocket.shutdown()
, 和 SSLSocket.write()
SSLSocket
类的方法不再在每次接收或发送字节时重置套接字超时。 套接字超时现在是该方法的最大总持续时间。(由 Victor Stinner 在 bpo-23853 中贡献。)
match_hostname()
函数现在支持 IP 地址的匹配。(由 Antoine Pitrou 在 bpo-23239 中贡献。)
sqlite3¶
Row
类现在完全支持序列协议,特别是 reversed()
迭代和切片索引。(由 Claudiu Popa 在 bpo-10203 中贡献;由 Lucas Sinclair、Jessica McKellar 和 Serhiy Storchaka 在 bpo-13583 中贡献。)
subprocess¶
添加了新的 run()
函数。 它运行指定的命令并返回一个 CompletedProcess
对象,该对象描述已完成的进程。 新的 API 更一致,并且是在不需要与早期 Python 版本保持兼容的 Python 代码中调用子进程的推荐方法。(由 Thomas Kluyver 在 bpo-23342 中贡献。)
示例
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
sys¶
一个新的 set_coroutine_wrapper()
函数允许设置一个全局钩子,该钩子将在通过 async def
函数创建 协程对象 时调用。 相应的 get_coroutine_wrapper()
可用于获取当前设置的包装器。 这两个函数都是 临时的,并且仅用于调试目的。(由 Yury Selivanov 在 bpo-24017 中贡献。)
可以使用新的 is_finalizing()
函数来检查 Python 解释器是否正在关闭。(由 Antoine Pitrou 在 bpo-22696 中贡献。)
sysconfig¶
Windows 上用户脚本目录的名称现在包含 Python 版本的前两个组成部分。(由 Paul Moore 在 bpo-23437 中贡献。)
tarfile¶
现在,open()
函数的 mode 参数接受 "x"
来请求独占创建。(由 Berker Peksag 在 bpo-21717 中贡献。)
TarFile.extractall()
和 TarFile.extract()
方法现在接受一个关键字参数 numeric_owner。如果设置为 True
,则提取的文件和目录将由 tar 文件中的数字 uid
和 gid
拥有。如果设置为 False
(默认值,并且是 3.5 之前版本中的行为),它们将由 tar 文件中命名的用户和组拥有。(由 Michael Vogt 和 Eric Smith 在 bpo-23193 中贡献。)
TarFile.list()
现在接受一个可选的 members 关键字参数,该参数可以设置为 TarFile.getmembers()
返回的列表的子集。(由 Serhiy Storchaka 在 bpo-21549 中贡献。)
threading¶
Lock.acquire()
和 RLock.acquire()
方法现在都使用单调时钟进行超时管理。(由 Victor Stinner 在 bpo-22043 中贡献。)
time¶
monotonic()
函数现在始终可用。(由 Victor Stinner 在 bpo-22043 中贡献。)
timeit¶
可以使用新的命令行选项 -u
或 --unit=U
来指定计时器输出的时间单位。支持的选项是 usec
、msec
或 sec
。(由 Julian Gindi 在 bpo-18983 中贡献。)
timeit()
函数有一个新的 globals 参数,用于指定代码将在其中运行的命名空间。(由 Ben Roberts 在 bpo-2527 中贡献。)
tkinter¶
用于在 Windows 上设置 Tcl/Tk 环境的 tkinter._fix
模块已被 _tkinter
模块中的私有函数替换,该函数不会对环境变量进行永久更改。(由 Zachary Ware 在 bpo-20035 中贡献。)
traceback¶
新的 walk_stack()
和 walk_tb()
函数,方便地遍历帧和 traceback 对象。(由 Robert Collins 在 bpo-17911 中贡献。)
新的轻量级类:TracebackException
、StackSummary
和 FrameSummary
。(由 Robert Collins 在 bpo-17911 中贡献。)
print_tb()
和 print_stack()
函数现在都支持 limit 参数的负值。(由 Dmitry Kazakov 在 bpo-22619 中贡献。)
types¶
一个新的 coroutine()
函数,用于将 生成器 和 类生成器
对象转换为 可等待对象。(由 Yury Selivanov 在 bpo-24017 中贡献。)
一个名为 CoroutineType
的新类型,用于由 async def
函数创建的 协程 对象。(由 Yury Selivanov 在 bpo-24400 中贡献。)
unicodedata¶
unicodedata
模块现在使用来自 Unicode 8.0.0 的数据。
unittest¶
TestLoader.loadTestsFromModule()
方法现在接受一个仅限关键字的参数 pattern,该参数作为第三个参数传递给 load_tests
。现在会检查找到的包中是否存在 load_tests
,无论其路径是否与 pattern 匹配,因为包名称不可能与默认模式匹配。(由 Robert Collins 和 Barry A. Warsaw 在 bpo-16662 中贡献。)
Unittest 发现错误现在暴露在 TestLoader.errors
属性中,该属性是 TestLoader
实例的属性。(由 Robert Collins 在 bpo-19746 中贡献。)
一个新的命令行选项 --locals
用于在回溯中显示局部变量。(由 Robert Collins 在 bpo-22936 中贡献。)
unittest.mock¶
Mock
类具有以下改进
类构造函数有一个新的 unsafe 参数,该参数使模拟对象在属性名称以
"assert"
开头时引发AttributeError
。(由 Kushal Das 在 bpo-21238 中贡献。)一个新的
Mock.assert_not_called()
方法,用于检查是否调用了模拟对象。(由 Kushal Das 在 bpo-21262 中贡献。)
现在,MagicMock
类支持 __truediv__()
、__divmod__()
和 __matmul__()
运算符。(由 Johannes Baiter 在 bpo-20968 中贡献,以及 Håkan Lövdahl 在 bpo-23581 和 bpo-23568 中贡献。)
现在,当修补内置名称时,不再需要显式地传递 create=True
给 patch()
函数。(由 Kushal Das 在 bpo-17660 中贡献。)
urllib¶
新的 request.HTTPPasswordMgrWithPriorAuth
类允许管理 HTTP 基本身份验证凭据,从而消除不必要的 401
响应处理,或者在第一次请求时无条件发送凭据,以便与返回 404
响应而不是 401
的服务器通信(如果未发送 Authorization
标头)。(由 Matej Cepl 在 bpo-19494 中贡献,以及 Akshit Khurana 在 bpo-7159 中贡献。)
parse.urlencode()
函数新增了一个 quote_via 参数,用于在需要时控制查询部分的编码。(由 Samwyse 和 Arnon Yaari 在 bpo-13866 中贡献。)
request.urlopen()
函数接受一个 ssl.SSLContext
对象作为 context 参数,该对象将用于 HTTPS 连接。(由 Alex Gaynor 在 bpo-22366 中贡献。)
parse.urljoin()
已更新为使用 RFC 3986 语义来解析相对 URL,而不是 RFC 1808 和 RFC 2396。(由 Demian Brecht 和 Senthil Kumaran 在 bpo-22118 中贡献。)
wsgiref¶
headers.Headers
类构造函数的 headers 参数现在是可选的。(由 Pablo Torres Navarrete 和 SilentGhost 在 bpo-5800 中贡献。)
xmlrpc¶
client.ServerProxy
类现在支持上下文管理器协议。(由 Claudiu Popa 在 bpo-20627 中贡献。)
client.ServerProxy
构造函数现在接受一个可选的 ssl.SSLContext
实例。(由 Alex Gaynor 在 bpo-22960 中贡献。)
xml.sax¶
SAX 解析器现在支持 xmlreader.InputSource
对象的字符流。(由 Serhiy Storchaka 在 bpo-2175 中贡献。)
parseString()
现在接受一个 str
实例。(由 Serhiy Storchaka 在 bpo-10590 中贡献。)
zipfile¶
现在可以将 ZIP 输出写入不可查找的流。(由 Serhiy Storchaka 在 bpo-23252 中贡献。)
ZipFile.open()
方法的 mode 参数现在接受 "x"
以请求独占创建。(由 Serhiy Storchaka 在 bpo-21717 中贡献。)
其他模块级更改¶
mmap
、ossaudiodev
、socket
、ssl
和 codecs
模块中的许多函数现在接受可写的类字节对象。(由 Serhiy Storchaka 在 bpo-23001 中贡献。)
优化¶
在 POSIX 系统上,os.walk()
函数的速度提高了 3 到 5 倍,在 Windows 上提高了 7 到 20 倍。这是通过新的 os.scandir()
函数完成的,该函数公开了来自底层 readdir
或 FindFirstFile
/FindNextFile
系统调用的文件信息。(由 Ben Hoyt 在 Victor Stinner 的帮助下于 bpo-23605 中贡献。)
bytes(int)
(填充零字节) 的构造速度更快,并且对于大型对象使用的内存更少。使用 calloc()
而不是 malloc()
为这些对象分配内存。(由 Victor Stinner 在 bpo-21233 中贡献。)
对 ipaddress
IPv4Network
和 IPv6Network
的某些操作进行了大幅加速,例如 subnets()
、supernet()
、summarize_address_range()
、collapse_addresses()
。速度提升范围为 3 到 15 倍。(由 Antoine Pitrou、Michel Albert 和 Markus 在 bpo-21486、bpo-21487、bpo-20826、bpo-23266 中贡献。)
优化了 ipaddress
对象的序列化,以产生明显更小的输出。(由 Serhiy Storchaka 在 bpo-23133 中贡献。)
现在 io.BytesIO
上的许多操作的速度提高了 50% 到 100%。(由 Serhiy Storchaka 在 bpo-15381 中贡献,以及 David Wilson 在 bpo-22003 中贡献。)
marshal.dumps()
函数现在更快了:在典型数据上,使用版本 3 和 4 时速度提高 65–85%,使用版本 0 到 2 时速度提高 20–25%,在最佳情况下速度提高高达 5 倍。(由 Serhiy Storchaka 在 bpo-20416 和 bpo-23344 中贡献。)
UTF-32 编码器现在速度快了 3 到 7 倍。(由 Serhiy Storchaka 在 bpo-15027 中贡献。)
现在,正则表达式的解析速度提高了高达 10%。(由 Serhiy Storchaka 在 bpo-19380 中贡献。)
优化了 json.dumps()
函数,使其在 ensure_ascii=False
下的运行速度与 ensure_ascii=True
下的运行速度一样快。(由 Naoki Inada 在 bpo-23206 中贡献。)
在常见情况下,当第二个参数的元类为type
时,PyObject_IsInstance()
和 PyObject_IsSubclass()
函数的速度得到了提升。(由 Georg Brandl 在 bpo-22540 中贡献。)
方法缓存略有改进,在某些基准测试中性能提升高达 5%。 (由 Antoine Pitrou 在 bpo-22847 中贡献.)
random
模块中的对象在 64 位构建版本上使用的内存减少了 50%。 (由 Serhiy Storchaka 在 bpo-23488 中贡献.)
property()
获取器调用速度提高了高达 25%。(由 Joe Jevnik 在 bpo-23910 中贡献.)
fractions.Fraction
的实例化速度现在提高了高达 30%。(由 Stefan Behnel 在 bpo-22464 中贡献.)
字符串方法 find()
、rfind()
、split()
、partition()
和 in
字符串运算符在搜索单字符子字符串时现在明显更快。(由 Serhiy Storchaka 在 bpo-23573 中贡献.)
构建和 C API 变更¶
添加了新的 calloc
函数
(由 Victor Stinner 在 bpo-21233 中贡献。)
新的编码/解码辅助函数
Py_DecodeLocale()
(替换_Py_char2wchar()
),Py_EncodeLocale()
(替换_Py_wchar2char()
)。
(由 Victor Stinner 在 bpo-18395 中贡献.)
一个新的 PyCodec_NameReplaceErrors()
函数,用于将 Unicode 编码错误替换为 \N{...}
转义符。(由 Serhiy Storchaka 在 bpo-19676 中贡献.)
一个新的 PyErr_FormatV()
函数,类似于 PyErr_Format()
,但接受 va_list
参数。(由 Antoine Pitrou 在 bpo-18711 中贡献.)
一个新的 PyExc_RecursionError
异常。(由 Georg Brandl 在 bpo-19235 中贡献.)
新的 PyModule_FromDefAndSpec()
、PyModule_FromDefAndSpec2()
和 PyModule_ExecDef()
函数由 PEP 489 引入 – 多阶段扩展模块初始化。(由 Petr Viktorin 在 bpo-24268 中贡献.)
新的 PyNumber_MatrixMultiply()
和 PyNumber_InPlaceMatrixMultiply()
函数用于执行矩阵乘法。(由 Benjamin Peterson 在 bpo-21176 中贡献。 另见 PEP 465 以了解详情。)
PyTypeObject.tp_finalize
插槽现在是稳定 ABI 的一部分。
Windows 版本现在需要 Microsoft Visual C++ 14.0,它可以作为 Visual Studio 2015 的一部分提供。
扩展模块现在在某些平台上在其文件名中包含平台信息标签(该标签是可选的,CPython 将导入没有它的扩展,但是如果存在该标签并且不匹配,则不会加载该扩展)
在 Linux 上,扩展模块的文件名以
.cpython-<major><minor>m-<architecture>-<os>.pyd
结尾<major>
是 Python 版本的主版本号; 对于 Python 3.5,它是3
。<minor>
是 Python 版本的次版本号;对于 Python 3.5,它是5
。<architecture>
是扩展模块构建所针对的硬件架构。 它最常见的是 32 位 Intel 平台的i386
或 64 位 Intel(和 AMD)平台的x86_64
。<os>
始终为linux-gnu
,除非为在 64 位平台上与 32 位 ABI 对话而构建的扩展,在这种情况下,它为linux-gnu32
(并且<architecture>
将为x86_64
)。
在 Windows 上,扩展模块的文件名以
<debug>.cp<major><minor>-<platform>.pyd
结尾<major>
是 Python 版本的主版本号; 对于 Python 3.5,它是3
。<minor>
是 Python 版本的次版本号;对于 Python 3.5,它是5
。<platform>
是扩展模块构建所针对的平台, Win32 的win32
, Win64 的win_amd64
,Windows Itanium 64 的win_ia64
, 以及 Windows on ARM 的win_arm
。如果在调试模式下构建,
<debug>
将为_d
,否则将为空白。
在 OS X 平台上,扩展模块的文件名现在以
-darwin.so
结尾。在所有其他平台上,扩展模块的文件名与 Python 3.4 中的相同。
已弃用¶
新关键字¶
不建议将 async
和 await
用作变量、类、函数或模块名称。 由 PEP 492 在 Python 3.5 中引入,它们将在 Python 3.7 中成为适当的关键字。
已弃用的 Python 行为¶
在生成器内部引发 StopIteration
异常现在将生成一个无声的 PendingDeprecationWarning
,它将在 Python 3.6 中成为非静默的弃用警告,并在 Python 3.7 中触发 RuntimeError
。 有关详细信息,请参阅 PEP 479:更改生成器内部的 StopIteration 处理。
不支持的操作系统¶
Windows XP 不再受 Microsoft 支持,因此根据 PEP 11,CPython 3.5 不再正式支持此操作系统。
已弃用的 Python 模块、函数和方法¶
formatter
模块现在已完全弃用,并且仍计划在 Python 3.6 中删除。
asyncio.async()
函数已弃用,转而使用 ensure_future()
。
smtpd
模块过去总是使用 utf-8
编解码器解码电子邮件消息的 DATA 部分。 现在可以使用 SMTPServer
的新 *decode_data* 关键字来控制它。 默认值为 True
,但是此默认值已被弃用。 使用适当的值指定 *decode_data* 关键字以避免弃用警告。
直接为 key
、value
和 coded_value
属性赋值 http.cookies.Morsel
对象已被弃用。请改用 set()
方法。此外,set()
的未文档化参数 LegalChars 也已被弃用,现在会被忽略。
将格式化字符串作为关键字参数 format_string 传递给 format()
方法(string.Formatter
类)已被弃用。(由 Serhiy Storchaka 在 bpo-23671 中贡献。)
platform.dist()
和 platform.linux_distribution()
函数现在已被弃用。Linux 发行版使用太多不同的方式来描述自己,因此该功能留给软件包处理。(由 Vajrasky Kok 和 Berker Peksag 在 bpo-1322 中贡献。)
inspect.Signature
的先前未文档化的 from_function
和 from_builtin
方法已被弃用。请改用新的 Signature.from_callable()
方法。(由 Yury Selivanov 在 bpo-24248 中贡献。)
inspect.getargspec()
函数已被弃用,并计划在 Python 3.6 中移除。(有关详细信息,请参阅 bpo-20438。)
inspect
getfullargspec()
、getcallargs()
和 formatargspec()
函数已被弃用,推荐使用 inspect.signature()
API。(由 Yury Selivanov 在 bpo-20438 中贡献。)
getargvalues()
和 formatargvalues()
函数在 Python 3.5.0 版本发布时被无意地标记为已弃用。
现在不建议将 re.LOCALE
标志与 str 模式或 re.ASCII
一起使用。(由 Serhiy Storchaka 在 bpo-22407 中贡献。)
在正则表达式模式和替换模式中使用由 '\'
和一个 ASCII 字母组成的不识别的特殊序列现在会引发弃用警告,并在 Python 3.6 中被禁止。(由 Serhiy Storchaka 在 bpo-23622 中贡献。)
unittest.TestLoader.loadTestsFromModule()
方法的未文档化和非官方的 use_load_tests 默认参数现在已被弃用且被忽略。(由 Robert Collins 和 Barry A. Warsaw 在 bpo-16662 中贡献。)
已移除¶
API 和功能移除¶
以下过时的和先前已弃用的 API 和功能已被移除
移植到 Python 3.5¶
本节列出了先前描述的更改和其他可能需要更改代码的错误修复。
Python 行为的改变¶
由于疏忽,早期的 Python 版本错误地接受了以下语法
f(1 for x in [1], *args) f(1 for x in [1], **kwargs)
Python 3.5 现在会正确引发
SyntaxError
,因为生成器表达式如果不是函数的唯一参数,则必须放在括号中。
Python API 中的更改¶
PEP 475: 现在,当系统调用被信号中断时,如果 Python 信号处理程序没有引发异常,则会重试系统调用,而不是引发
InterruptedError
。在 Python 3.5 之前,如果
datetime.time
对象表示 UTC 时间午夜,则该对象被认为是 false。这种行为被认为是晦涩难懂且容易出错的,已在 Python 3.5 中删除。有关完整详细信息,请参阅 bpo-13936。如果操作会阻塞,
ssl.SSLSocket.send()
方法现在会在非阻塞套接字上引发ssl.SSLWantReadError
或ssl.SSLWantWriteError
。之前,它会返回0
。(由 Nikolaus Rath 在 bpo-20951 中贡献。)生成器的
__name__
属性现在从函数名称设置,而不是从代码名称设置。使用gen.gi_code.co_name
检索代码名称。生成器还有一个新的__qualname__
属性(限定名称),现在用于表示生成器 (repr(gen)
)。(由 Victor Stinner 在 bpo-21205 中贡献。)已删除
HTMLParser
的已弃用的“strict”模式和参数、HTMLParser.error()
和HTMLParserError
异常。(由 Ezio Melotti 在 bpo-15114 中贡献。)HTMLParser
的 convert_charrefs 参数现在默认为True
。(由 Berker Peksag 在 bpo-21047 中贡献。)虽然它不是 API 的正式组成部分,但为了移植目的(即:修复测试),值得注意的是,以前形式为“'sometype' does not support the buffer protocol”的错误消息现在形式为 “a bytes-like object is required, not ‘sometype’”。(由 Ezio Melotti 在 bpo-16518 中贡献。)
如果当前目录被设置为一个不再存在的目录,那么将不再引发
FileNotFoundError
异常,而是find_spec()
将返回None
,并且不会在sys.path_importer_cache
中缓存None
,这与通常的情况不同 (bpo-22834)。来自
http.client
和http.server
的 HTTP 状态码和消息被重构为一个公共的HTTPStatus
枚举。 为了向后兼容,http.client
和http.server
中的值仍然可用。(由 Demian Brecht 在 bpo-21793 中贡献。)当导入加载器定义了
importlib.machinery.Loader.exec_module()
时,现在也需要定义create_module()
(现在会引发一个DeprecationWarning
,在 Python 3.6 中将成为错误)。 如果加载器继承自importlib.abc.Loader
,则无需执行任何操作,否则只需定义create_module()
以返回None
。(由 Brett Cannon 在 bpo-23014 中贡献。)re.split()
函数始终忽略空模式匹配,因此"x*"
模式的工作方式与"x+"
相同,而"\b"
模式从未起作用。 现在,如果模式可以匹配空字符串,则re.split()
会引发警告。 为了兼容性,请使用永远不匹配空字符串的模式(例如,使用"x+"
而不是"x*"
)。 只能匹配空字符串的模式(例如"\b"
)现在会引发错误。(由 Serhiy Storchaka 在 bpo-22818 中贡献。)http.cookies.Morsel
的类字典接口已变得自洽:morsel 比较现在会考虑key
和value
,copy()
现在会生成一个Morsel
实例,而不是一个dict
,并且如果更新字典中的任何键无效,则update()
现在将引发异常。此外,set()
的未文档化的 LegalChars 参数已被弃用,现在将被忽略。(由 Demian Brecht 在 bpo-2211 中贡献。)PEP 488 从 Python 中删除了
.pyo
文件,并在.pyc
文件名中引入了可选的opt-
标签。importlib.util.cache_from_source()
获得了一个 optimization 参数,以帮助控制opt-
标签。因此,该函数的 debug_override 参数现在已被弃用。.pyo
文件也不再作为 Python 解释器的文件参数支持,因此在单独分发时(即,无源代碼分发)没有任何用途。 由于 Python 3.5 中字节码的魔术数字已更改,因此来自早期版本 Python 的所有旧.pyo
文件都是无效的,无论此 PEP 如何。socket
模块现在在 Linux 3.6 及更高版本上导出CAN_RAW_FD_FRAMES
常量。根据 RFC 5280,
ssl.cert_time_to_seconds()
函数现在将输入时间解释为 UTC 时间,而不是本地时间。 此外,返回值始终为int
。(由 Akira Li 在 bpo-19940 中贡献。)pygettext.py
工具现在在 POT-Creation-Date 标头中使用标准的 +NNNN 格式表示时区。smtplib
模块现在使用sys.stderr
而不是以前的模块级stderr
变量进行调试输出。 如果你的(测试)程序依赖于修补模块级变量以捕获调试输出,则你需要更新它以捕获 sys.stderr。当发现空字符串且索引完全超出范围时,
str.startswith()
和str.endswith()
方法不再返回True
。(由 Serhiy Storchaka 在 bpo-24284 中贡献。)inspect.getdoc()
函数现在返回从基类继承的文档字符串。 如果继承的文档是合适的,则不再需要重复文档字符串。 若要抑制继承的字符串,必须指定一个空字符串(或者可以填写文档)。 此更改会影响pydoc
模块和help()
函数的输出。(由 Serhiy Storchaka 在 bpo-15582 中贡献。)嵌套的
functools.partial()
调用现在被扁平化。 如果你依赖于先前的行为,现在可以向functools.partial()
对象添加一个属性,或者可以创建functools.partial()
的子类。(由 Alexander Belopolsky 在 bpo-7830 中贡献。)
C API 中的更改¶
已删除(非公共的)
PyMemoryViewObject
结构的未文档化的format
成员。 所有依赖于memoryobject.h
中相关部分的扩展都必须重新构建。PyMemAllocator
结构体已重命名为PyMemAllocatorEx
,并添加了一个新的calloc
字段。移除了未文档化的宏
PyObject_REPR()
,该宏会导致引用泄露。在类似PyUnicode_FromFormat()
的函数中使用格式字符%R
来格式化对象的repr()
。(Serhiy Storchaka 在 bpo-22453 中贡献。)由于缺少
__module__
属性会破坏 pickle 和内省,现在对于没有__module__
属性的内置类型会引发弃用警告。未来这将是一个AttributeError
。(Serhiy Storchaka 在 bpo-20204 中贡献。)作为 PEP 492 实现的一部分,
PyTypeObject
的tp_reserved
插槽被替换为tp_as_async
插槽。有关新类型、结构和函数,请参阅 协程对象。
Python 3.5.4 中的显著变化¶
新的 make regen-all
构建目标¶
为了简化交叉编译,并确保 CPython 可以在不需要现有 Python 版本的情况下可靠地编译,基于 autotools 的构建系统不再尝试基于文件修改时间隐式地重新编译生成的文件。
相反,添加了一个新的 make regen-all
命令,以便在需要时强制重新生成这些文件(例如,在基于预先生成的版本已经构建了初始版本的 Python 之后)。
还定义了更具选择性的重新生成目标 - 详情请参阅 Makefile.pre.in。
(Victor Stinner 在 bpo-23404 中贡献。)
在 3.5.4 版本中添加。
移除 make touch
构建目标¶
之前用于通过更新修改时间来请求隐式重新生成生成文件的 make touch
构建目标已被移除。
它已被新的 make regen-all
目标替换。
(Victor Stinner 在 bpo-23404 中贡献。)
在 3.5.4 版本中更改。