On this page
Python 3.5 新增Function
Editors
- Elvis Pranskevichus < elvis@magic.io >,Yury Selivanov < yury@magic.io >
本文介绍了 Python 3.5 与 3.4 相比的新Function。 Python 3.5 于 2015 年 9 月 13 日发布。有关更改的完整列表,请参见changelog。
See also
PEP 478-Python 3.5 发布时间表
摘要-发布要点
新语法Function:
新的库模块:
新的内置Function:
bytes % args
,bytearray % args
:PEP 461 –为字节和字节数组添加%
格式。新的bytes.hex(),bytearray.hex()和memoryview.hex()方法。 (由 Arnon Yaari 在bpo-9951中贡献。)
memoryview现在支持 Tuples 索引(包括多维)。 (由bpo-23632中的 Antoine Pitrou 提供。)
生成器具有一个新的
gi_yieldfrom
属性,该属性返回被yield from
表达式迭代的对象。 (由 Benno Leslie 和 Yury Selivanov 在bpo-24450中贡献。)现在,当达到最大递归深度时,将引发一个新的RecursionError异常。 (由乔治·布兰 del 在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模块获得支持 Memory BIO,从而将 SSL 协议处理与网络 IO 分离。
新的os.scandir()函数提供了更好,更快的方法的目录遍历。
functools.lru_cache()主要是在 C 中重新实现,产生了更好的性能。
新的subprocess.run()函数提供了简化的子流程运行方式。
Security improvements:
现在,整个标准库中都禁用了 SSLv3.仍然可以pass手动实例化ssl.SSLContext来启用它。 (有关更多详细信息,请参见bpo-22638;此更改已反向移植到 CPython 3.4 和 2.7. )
HTTP cookie 解析现在更加严格,以防止潜在的注入攻击。 (由bpo-22796中的 Antoine Pitrou 提供。)
Windows improvements:
Windows 的新安装程序替代了旧的 MSI。有关更多信息,请参见在 Windows 上使用 Python。
Windows 版本现在使用 Microsoft Visual C 14.0,并且扩展模块应该使用相同的版本。
请 continue 阅读以获取面向用户的更改的完整列表,包括许多其他较小的改进,CPython 优化,不推荐使用以及潜在的移植问题。
New Features
PEP 492-具有异步和 await 语法的协程
PEP 492pass添加awaitable objects,coroutine functions,asynchronous iteration和异步上下文 Management 器大大改善了对 Python 异步编程的支持。
协程函数使用新的async def语法语句:
>>> async def coro():
... return 'spam'
在协程函数内部,新的await表达式可用于暂停协程执行,直到结果可用。只要它pass定义await()方法实现awaitable协议,就可以* awaited *任何对象。
PEP 492 还添加了async for语句,以便在异步可迭代对象上进行方便的迭代。
使用新语法编写的基本 HTTPClient 端示例:
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()
与异步迭代类似,异步上下文 Management 器有一种新语法。以下脚本:
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()
will output:
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 loop。
Note
在 3.5.2 版中进行了更改:从 CPython 3.5.2 开始,__aiter__
可以直接返回asynchronous iterators。返回awaitable对象将导致PendingDeprecationWarning。
在Asynchronous Iterators文档部分中查看更多详细信息。
See also
PEP 492 –具有异步和 await 语法的协程
PEP 由 Yury Selivanov 编写和实施。
PEP 465-用于矩阵乘法的专用中缀运算符
PEP 465添加@
中缀运算符以进行矩阵乘法。当前,没有内置的 Python 类型实现新的运算符,但是,可以pass为常规,反射和就地矩阵乘法定义matmul(),rmatmul()和imatmul()来实现它。这些方法的语义类似于定义其他中缀算术运算符的方法。
在 math,科学,工程学的许多领域中,矩阵乘法是一种常见的操作,加上@
可以编写更简洁的代码:
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
instead of:
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.])
See also
PEP 465 –用于矩阵乘法的专用中缀运算符
由 Nathaniel J. Smith 撰写的 PEP;由本杰明·彼得森(Benjamin Peterson)实施。
PEP 448-其他拆包概述
PEP 448扩展了*
可迭代拆包运算符和**
字典拆包运算符的允许用法。现在可以在function calls中使用任意数量的拆包:
>>> 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
同样,Tuples,列表,集合和字典显示允许多次拆包(请参阅Expression lists和Dictionary displays):
>>> *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}
See also
PEP 448 –其他拆包概述
PEP 由 Joshua Landau 撰写;由 Neil Girdhar,Thomas Wouters 和 Joshua Landau 实施。
PEP 461-对字节和字节数组的百分比格式支持
PEP 461向bytes和bytearray添加了对%
interpolation operator的支持。
尽管通常将插值视为字符串操作,但在某些情况下,在bytes
或bytearrays
上进行插值是有意义的,并且弥补此缺失Function所需的工作会降低代码的整体可读性。当处理有线格式协议(通常是二进制和 ASCII 兼容文本的混合物)时,此问题特别重要。
Examples:
>>> 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
接受 Unicode(相当于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 兼容的代码库中使用。
See also
PEP 461 –向字节和字节数组添加%格式
由 Ethan Furman 撰写的 PEP;由 Neil Schemenauer 和 Ethan Furman 实施。
PEP 484-类型提示
自 3.0 版( PEP 3107)起,函数 Comments 语法已成为 Python 的Function,但是 Comments 的语义尚未定义。
经验表明,大多数函数 Comments 用法都是为函数参数和返回值提供类型提示。显而易见的是,如果标准库包含基本定义和用于类型 Comments 的工具,则对 Python 用户将是有益的。
PEP 484引入了provisional module来提供这些标准定义和工具,以及一些关于 Comments 不可用的情况的约定。
例如,这是一个简单的函数,其参数和返回类型在 Comments 中语句:
def greeting(name: str) -> str:
return 'Hello ' + name
虽然这些 Comments 可以在运行时pass常规__annotations__
属性使用,但在运行时不会自动进行类型检查。而是假定将使用单独的脱机类型检查器(例如mypy)进行按需源代码分析。
类型系统支持联合,泛型类型和名为Any的特殊类型,该类型与所有类型一致(即可以分配给所有类型,也可以从所有类型分配)。
See also
PEP 471-os.scandir()函数–更好,更快的目录迭代器
PEP 471向标准库中添加了新的目录迭代Functionos.scandir()。另外,现在使用scandir
实现os.walk(),这使其在 POSIX 系统上快 3 到 5 倍,在 Windows 系统上快 7 到 20 倍。这在很大程度上是pass大大减少遍历目录树所需的对os.stat()的调用次数来实现的。
此外,scandir
返回一个迭代器,而不是返回文件名列表,这可以在很大的目录上迭代时提高内存效率。
以下示例显示了os.scandir()的简单用法,以显示给定* path *中不是以'.'
开头的所有文件(目录除外)。 entry.is_file()调用通常不会进行其他系统调用:
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
See also
PEP 471 – os.scandir()函数–更好,更快的目录迭代器
PEP 由 Ben Hoyt 在 Victor Stinner 的帮助下编写和实施。
PEP 475:重试系统调用,但 EINTR 失败
每当正在 awaitI/O 的系统调用被 signal break时,就会返回errno.EINTR错误代码。以前,在这种情况下,Python 会引发InterruptedError。这意味着,在编写 Python 应用程序时,开发人员有两种选择:
忽略
InterruptedError
。处理
InterruptedError
并try在每个呼叫站点重新启动break的系统调用。
第一个选项使应用程序间歇性地失败。第二种选择增加了大量的样板,使代码几乎不可读。比较:
print("Hello World")
and:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475实现对EINTR
的系统调用的自动重试。在大多数情况下,这消除了在用户代码中处理EINTR
或InterruptedError的负担,并使 Python 程序(包括标准库)更加健壮。请注意,仅当 signal 处理程序未引发异常时才重试系统调用。
下面列出了当 signal break时可以重试的Function:
faulthandler模块的Function;
osFunction:fchdir(),fchmod(),fchown(),fdatasync(),fstat(),fstatvfs(),fsync(),ftruncate(),mkfifo(),mknod(),open(),posix_fadvise(),posix_fallocate(),pread(),pwrite(),read(),readv(),sendfile(),_21,_21,21, ,writev();
特殊情况:os.close()和os.dup2()现在忽略EINTR错误;不会重试系统调用(有关原理,请参阅 PEP);
selectFunction:devpoll.poll(),epoll.poll(),kqueue.control(),poll.poll(),select();
socket类的方法:accept(),connect()(非阻塞套接字除外),recv(),recvfrom(),recvmsg(),send(),sendall(),sendmsg(),sendto();
See also
PEP 475 –重试系统调用,但 EINTR 失败
PEP 和实施由 Charles-FrançoisNatali 和 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。
See also
PEP 479 –更改生成器内部的 StopIteration 处理
PEP 由 Chris Angelico 和 Guido van Rossum 撰写。由 Chris Angelico,Yury Selivanov 和 Nick Coghlan 实施。
PEP 485:用于测试近似相等的Function
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
See also
PEP 485 –测试近似相等的函数
克里斯托弗·巴克(Christopher Barker)撰写的 PEP;由 Chris Barker 和 Tal Einat 实施。
PEP 486:使 Python 启动器了解虚拟环境
PEP 486使 Windows 启动器(请参阅 PEP 397)意识到活动的虚拟环境。当使用默认解释器并设置VIRTUAL_ENV
环境变量时,将使用虚拟环境中的解释器。
See also
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 来帮助进行此更改。
See also
PEP 488 –消除了 PYO 文件
PEP 由 Brett Cannon 编写和实施。
PEP 489:多阶段扩展模块初始化
PEP 489更新扩展模块的初始化,以利用 PEP 451在 Python 3.4 中引入的两步模块加载机制。
这项更改使选择使用新机制的扩展模块的导入语义与 Python 源模块和字节码模块的语义更加接近,包括使用任何有效标识符作为模块名称的能力,而不仅限于 ASCII。
See also
PEP 489 –多阶段扩展模块初始化
Petr Viktorin,Stefan Behnel 和 Nick Coghlan 撰写的 PEP;由 Petr Viktorin 实施。
其他语言更改
对核心 Python 语言进行的一些较小更改是:
添加了
"namereplace"
错误处理程序。"backslashreplace"
错误处理程序现在可以进行解码和翻译。 (由 Serhiy Storchaka 在bpo-19676和bpo-22286中贡献。)新哈萨克
kz1048
和塔吉克koi8_t
codecs。 (由 Serhiy Storchaka 在bpo-22682和bpo-22681中贡献。)属性文档字符串现在可写。这对于collections.namedtuple()个文档字符串特别有用。 (由 Berker Peksag 在bpo-24064中贡献。)
现在支持涉及相对 import 的循环 import。 (由 Brett Cannon 和 Antoine Pitrou 在bpo-17636中贡献。)
New Modules
typing
新的typing provisional模块提供了用于函数类型 Comments 的标准定义和工具。有关更多信息,请参见Type Hints。
zipapp
新的zipapp模块(在 PEP 441中指定)提供了一个 API 和命令行工具,用于创建可执行的 Python Zip 应用程序,它们在bpo-1739468中的 Python 2.6 中引入,但在当时或之后并未得到很好的宣传。
使用新模块,Binding 应用程序就像将所有文件(包括__main__.py
文件)放入目录myapp
并运行以下命令一样简单:
$ python -m zipapp myapp
$ python myapp.pyz
该模块的实现由 Paul Moore 在bpo-23491中贡献。
See also
PEP 441 –增强 Python ZIP 应用程序支持
Improved Modules
argparse
ArgumentParser类现在可以pass将allow_abbrev设置为False
来禁用abbreviated usage的长选项。 (由bpo-14910由 Jonathan Paugh,Steven Bethard,Paul j3 和 Daniel Eriksson 贡献。)
asyncio
由于asyncio模块是provisional,因此 Python 3.5 中引入的所有更改也已反向移植到 Python3.4.x。
自 Python 3.4.0 起,asyncio模块中的显着变化:
新的调试 API:loop.set_debug()和loop.get_debug()方法。 (由 Victor Stinner 贡献.)
proactor 事件循环现在支持 SSL。 (由bpo-22560中的 Antoine Pitrou 和 Victor Stinner 贡献。)
一种新的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())现在都接受各种awaitable objects。 (由 Yury Selivanov 贡献.)
新的run_coroutine_threadsafe()函数可将协程提交到其他线程的事件循环。 (由 Vincent Michel 贡献.)
新的Transport.is_closing()方法,用于检查运输是否关闭或关闭。 (由 Yury Selivanov 贡献.)
loop.create_server()方法现在可以接受主机列表。 (由 Yann Sionneau 提供.)
3.5.2 中的更新:
用于创建 Future 对象的新的loop.create_future()方法。这允许其他事件循环实现(例如uvloop)提供更快的asyncio.Future实现。 (由 Yury Selivanov 贡献.)
新的loop.get_exception_handler()方法可获取当前的异常处理程序。 (由 Yury Selivanov 贡献.)
一种新的StreamReader.readuntil()方法,用于从流中读取数据,直到出现分隔符字节序列。 (由马克·科伦伯格贡献.)
对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
类现在支持context manager协议。 (由 Berker Peksag 在bpo-20289中贡献。)
cmath
新Functionisclose()提供了一种测试近似相等性的方法。 (由 Chris Barker 和 Tal Einat 在bpo-24270中贡献。)
code
现在,InteractiveInterpreter.showtraceback()方法将打印完整的链式 traceback,就像交互式解释器一样。 (由 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(),并支持+
和*
运算符。这样就可以将 deque 识别为MutableSequence,并提高了它们对列表的替代性。 (由bpo-23704中的 Raymond Hettinger 贡献。)
现在可以更新namedtuple()生成的文档字符串:
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coodinate'
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等的相应方法。(由bpo-23086的 Devin Jeanpierre 提供)。
一个新的Generator抽象 Base Class。 (由 Stefan Behnel 在bpo-24018中贡献。)
新的Awaitable,Coroutine,AsyncIterator和AsyncIterable抽象 Base Class。 (由 Yury Selivanov 在bpo-24184中贡献。)
对于较早的 Python 版本,可在外部PyPI package中获得新 ABC 的反向移植。
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
Executor.map()方法现在接受一个* chunksize *参数,以允许使用ProcessPoolExecutor()时批处理任务以提高性能。 (由 Dan O'Reilly 在bpo-11271中贡献。)
ThreadPoolExecutor构造函数中的工作程序数量现在是可选的。默认值为 CPU 数量的 5 倍。 (由 Claudiu Popa 在bpo-21527中贡献。)
configparser
configparser现在提供了一种方法,可以pass在ConfigParser构造函数中指定转换器的字典,或pass将它们定义为ConfigParser
子类中的方法来自定义值的转换。解析器实例中定义的转换器由其部分代理继承。
Example:
>>> 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']
(由ŁukaszLanga 在bpo-18159中贡献。)
contextlib
新的redirect_stderr() context manager(类似于redirect_stdout())使 Util 脚本更容易处理将其输出写入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
现在,可以pass使用仅关键字的新* 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
选项,以启用扩展模块的并行构建。 (由bpo-5309中的 Antoine Pitrou 提供。)
distutils模块现在支持xz
压缩,并且可以pass将xztar
作为参数传递给bdist --format
来启用。 (由 Serhiy Storchaka 在bpo-16314中贡献。)
doctest
如果* module *不包含文档字符串,则DocTestSuite()函数返回一个空的unittest.TestSuite,而不是引发ValueError。 (由 Glenn Jones 在bpo-15916中贡献。)
新的策略选项Policy.mangle_from_控制生成器是否在电子邮件正文中以"From "
开头的行以">"
字符作为前缀。 compat32的默认值为True
,其他所有策略的默认值为False
。 (由米兰·奥伯基希在bpo-20098中贡献。)
pass新的Message.get_content_disposition()方法,可以轻松访问* Content-Disposition *Headers 的规范值。 (由 Abhilash Raj 在bpo-21083中贡献。)
可以将新的策略选项EmailPolicy.utf8设置为True
,以使用 UTF-8 字符集而不是使用编码的单词对电子邮件标题进行编码。这样就可以根据 RFC 6532格式化Messages
并与支持 RFC 6531 SMTPUTF8
extensions 的 SMTP 服务器一起使用。 (由 R. David Murray 在bpo-24211中贡献。)
mime.text.MIMEText构造函数现在接受charset.Charset实例。 (由 Claude Paroz 和 Berker Peksag 在bpo-16324中贡献。)
enum
如果仅提供* name ,则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()函数除了接受类似文件的对象之外,还接受文件 Descriptors。 (由 Wu 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
现在可以pass在新的可选* key 关键字参数中传递key function来自定义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
是其子类),则 Client 端套接字现在会自动关闭,并在下一个请求时重新连接:
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 和编辑器,并且不打算由其他程序导入,因此每个发行版都对其进行了改进。请参阅Lib/idlelib/NEWS.txt
,以获取自 3.4.0 开始的累积更改列表,以及在将来的 3.5.x 版本中所做的更改。也可以从“ IDLE 帮助”‣“关于 IDLE”对话框中获得此文件。
imaplib
IMAP4类现在支持context manager协议。在with语句中使用时,将在块的末尾自动调用 IMAP4 LOGOUT
命令。 (由bpo-4972的 TarekZiadé和 Serhiy Storchaka 贡献。)
imaplib模块现在passIMAP4.enable()方法支持 RFC 5161(启用扩展)和 RFC 6855(支持 UTF-8)。新的IMAP4.utf8_enabled属性跟踪是否启用 RFC 6855支持。 (由米兰·奥伯基希,R.大卫·默里和 Maciej Szulik 在bpo-21800中贡献。)
imaplib模块现在按照 RFC 的建议,使用 UTF-8 自动编码非 ASCII 字符串的用户名和密码。 (由 Milan Oberkirch 在bpo-21800中贡献。)
imghdr
what()函数现在可以识别OpenEXR格式(由bpo-20295的 Martin Vignali 和 Claudiu Popa 贡献)和WebP格式(由bpo-20197的 Fabrice Aneche 和 Claudiu Popa 贡献)。
importlib
util.LazyLoader类允许在启动时间很重要的应用程序中延迟加载模块。 (由 Brett Cannon 在bpo-17621中贡献。)
abc.InspectLoader.source_to_code()方法现在是静态方法。这使得pass运行exec(code, module.__dict__)
从字符串编译的代码初始化模块对象变得更加容易。 (由 Brett Cannon 在bpo-21156中贡献。)
现在,新的util.module_from_spec()函数是创建新模块的首选方式。与直接创建types.ModuleType实例相反,此新函数将基于传入的 spec 对象设置各种导入控制的属性。 (由 Brett Cannon 在bpo-20383中贡献。)
inspect
Signature和Parameter类现在都可腌制和可哈希化。 (由 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的子类化更容易。 (由bpo-17373中的 Yury Selivanov 和 Eric Snow 贡献。)
signature()函数现在接受* follow_wrapped *可选关键字参数,将其设置为False
时,将禁用自动跟踪__wrapped__
链接。 (由 Yury Selivanov 在bpo-20691中贡献。)
已添加一组检查coroutine functions和coroutine objects的新Function:iscoroutine(),iscoroutinefunction(),isawaitable(),getcoroutinelocals()和getcoroutinestate()。 (由 Yury Selivanov 在bpo-24017和bpo-24400中贡献。)
stack(),trace(),getouterframes()和getinnerframes()函数现在返回命名 Tuples 的列表。 (由 Daniel Shahaf 在bpo-16808中贡献。)
io
一种新的BufferedIOBase.readinto1()方法,最多使用一个对基础原始流的RawIOBase.read()或RawIOBase.readinto()方法的调用。 (由 Nikolaus Rath 在bpo-20578中贡献。)
ipaddress
IPv4Network和IPv6Network类现在都接受(address, netmask)
Tuples 参数,以便从现有地址轻松构造网络对象:
>>> 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命令行界面现在保留了 Importing 中传递的 JSON 对象中键的 Sequences。新的--sort-keys
选项可用于按字母 Sequences 对键进行排序。 (由 Berker Peksag 在bpo-21650中贡献。)
JSON 解码器现在引发JSONDecodeError而不是ValueError,以提供有关错误的更好的上下文信息。 (由 Serhiy Storchaka 在bpo-19361中贡献。)
linecache
可以使用新的lazycache()函数捕获有关基于非文件的模块的信息,以允许以后passgetline()获取其行。这样可以避免在实际需要一条线之前进行 I/O 操作,而不必无限期地携带模块全局变量。 (由 Robert Collins 在bpo-17911中贡献。)
locale
考虑到LC_NUMERIC
设置,可以使用新的delocalize()函数将字符串转换为规范化的数字字符串:
>>> 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édricKrier 在bpo-13918中贡献。)
logging
现在,除了布尔值和异常 Tuples 之外,所有日志记录方法(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实例,以配置 HTTPConnecting 使用的 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。 (由马克·迪金森在bpo-23185中贡献。)
新Functionisclose()提供了一种测试近似相等性的方法。 (由 Chris Barker 和 Tal Einat 在bpo-24270中贡献。)
添加了新的gcd()Function。现在不建议使用fractions.gcd()函数。 (由 Mark Dickinson 和 Serhiy Storchaka 在bpo-22486中贡献。)
multiprocessing
sharedctypes.synchronized()对象现在支持context manager协议。 (由bpo-21565的 Charles-FrançoisNatali 贡献。)
operator
attrgetter(),itemgetter()和methodcaller()对象现在支持 Pickling。 (由bpo-22955的 Josh Rosenberg 和 Serhiy Storchaka 提供。)
新的matmul()和imatmul()函数执行矩阵乘法。 (由本杰明·彼得森在bpo-21176中贡献。)
os
已添加新的scandir()函数,该函数返回DirEntry个对象的迭代器。 scandir()尽可能在扫描目录的同时提取文件属性,从而无需执行随后的系统调用来确定文件类型或属性,这可以显着提高性能。 (由 Ben Hoyt 在bpo-22524中的 Victor Stinner 的帮助下提供。)
在 Windows 上,现在可以使用新的stat_result.st_file_attributes属性。它对应于GetFileInformationByHandle()
返回的BY_HANDLE_FILE_INFORMATION
结构的dwFileAttributes
成员。 (由 Ben Hoyt 在bpo-21719中贡献。)
现在,urandom()函数在 Linux 3.17 或更高版本上使用getrandom()
syscall,在 OpenBSD 5.6 和更高版本上使用getentropy()
,从而消除了使用/dev/urandom
的需要,并避免了由于潜在的文件 Descriptors 耗尽而导致的失败。 (由 Victor Stinner 在bpo-22181中贡献。)
新的get_blocking()和set_blocking()函数允许获取和设置文件 Descriptors 的阻止模式(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()Function。 (由 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 protocols来对诸如未绑定方法或嵌套类之类的嵌套对象进行 Pickling。协议版本 4 已经支持这些情况。 (由 Serhiy Storchaka 在bpo-23611中贡献。)
poplib
如果 POP 服务器支持,则新的POP3.utf8()命令启用 RFC 6856(国际化电子邮件)支持。 (由 Milan OberKirch 在bpo-21804中贡献。)
re
在后置 assert 中现在允许对具有固定长度的组的引用和条件引用:
>>> 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()函数将历史 Logging 指定数量的尾随元素附加到给定文件。 (由 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
extensions( RFC 6152)。如果 Client 端在MAIL
命令上指定BODY=8BITMIME
,则它将pass mail_options *关键字传递给SMTPServer.process_message()。 (由 Milan Oberkirch 和 R. David Murray 在bpo-21795中贡献。)
SMTPServer类现在还支持SMTPUTF8
extensions( RFC 6531:国际化电子邮件)。如果 Client 端在MAIL
命令上指定了SMTPUTF8 BODY=8BITMIME
,则它们将pass* mail_options *关键字传递给SMTPServer.process_message()。 process_message
方法的责任是正确处理SMTPUTF8
数据。 (由 Milan Oberkirch 在bpo-21725中贡献。)
现在可以直接或pass名称解析提供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
具有超时Function现在使用单调时钟,而不是系统时钟。 (由 Victor Stinner 在bpo-22043中贡献。)
一种新的socket.sendfile()方法允许使用 UNIX 上的高性能os.sendfile()函数pass套接字发送文件,从而使上传速度比使用普通socket.send()快 2 到 3 倍。 (由 Giampaolo Rodola 在bpo-17552中贡献。)
每次接收或发送字节时,socket.sendall()方法不再重置套接字超时。现在,套接字超时是发送所有数据的最大总持续时间。 (由 Victor Stinner 在bpo-23853中贡献。)
socket.listen()方法的* backlog *参数现在是可选的。默认情况下,它设置为SOMAXCONN或128
(以较小者为准)。 (由bpo-21455的 Charles-FrançoisNatali 贡献。)
ssl
内存 BIO 支持
(由 Geert Jansen 在bpo-21965中贡献。)
添加了新的SSLObject类,以为SSLSocket的网络 I/O Function不是必需的或不是最佳的情况提供 SSL 协议支持。 SSLObject
表示 SSL 协议实例,但不实现任何网络 I/O 方法,而是提供了内存缓冲区接口。新的MemoryBIO类可用于在 Python 和 SSL 协议实例之间传递数据。
内存 BIO SSL 支持主要用于实现异步 I/O 的框架,对于该框架,SSLSocket的就绪模型(“选择/轮询”)效率不高。
可以使用新的SSLContext.wrap_bio()方法创建新的SSLObject
实例。
应用层协议协商支持
(由本杰明·彼得森在bpo-20188中贡献。)
在存在 OpenSSL 支持的地方,ssl模块现在实现 RFC 7301中描述的* Application-Layer Protocol Negotiation * TLS 扩展。
新的SSLContext.set_alpn_protocols()可用于指定套接字在 TLS 握手期间应通告的协议。
新的SSLSocket.selected_alpn_protocol()返回在 TLS 握手期间选择的协议。 HAS_ALPN标志指示是否存在 ALPN 支持。
Other Changes
有一个新的SSLSocket.version()方法可查询使用中的实际协议版本。 (由bpo-20421中的 Antoine Pitrou 提供。)
现在,SSLSocket类实现了SSLSocket.sendfile()
方法。 (由 Giampaolo Rodola 在bpo-17552中贡献。)
现在,如果操作将阻塞,SSLSocket.send()
方法将在非阻塞套接字上引发ssl.SSLWantReadError或ssl.SSLWantWriteError异常。以前,它将返回0
。 (由 Nikolaus Rath 在bpo-20951中贡献。)
现在,根据 RFC 5280,cert_time_to_seconds()函数将 Importing 时间解释为 UTC 而不是本地时间。此外,返回值始终为int。 (由 Akira Li 在bpo-19940中贡献。)
新的SSLObject.shared_ciphers()
和SSLSocket.shared_ciphers()方法返回 Client 端在握手期间发送的密码列表。 (由本杰明·彼得森在bpo-23186中贡献。)
SSLSocket类的SSLSocket.do_handshake(),SSLSocket.read(),SSLSocket.shutdown()
和SSLSocket.write()方法不再在每次接收或发送字节时重置套接字超时。套接字超时现在是该方法的最大总持续时间。 (由 Victor Stinner 在bpo-23853中贡献。)
match_hostname()Function现在支持 IP 地址的匹配。 (由bpo-23239中的 Antoine Pitrou 提供。)
sqlite3
现在,Row类完全支持序列协议,尤其是reversed()迭代和切片索引。 (由bpo-10203的 Claudiu Popa 贡献;由bpo-13583的 Lucas Sinclair,Jessica McKellar 和 Serhiy Storchaka 贡献。)
subprocess
新的run()Function已添加。它运行指定的命令并返回CompletedProcess对象,该对象描述完成的过程。新的 API 更加一致,是在不需要维护与早期 Python 版本兼容性的 Python 代码中调用子流程的推荐方法。 (由 Thomas Kluyver 在bpo-23342中贡献。)
Examples:
>>> 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函数创建coroutine object时,该钩子就会被调用。相应的get_coroutine_wrapper()
可用于获取当前设置的包装器。这两个函数均为provisional,仅用于调试目的。 (由 Yury Selivanov 在bpo-24017中贡献。)
新的is_finalizing()函数可用于检查 Python 解释器是否为shutting down。 (由bpo-22696中的 Antoine Pitrou 提供。)
sysconfig
Windows 上的用户脚本目录的名称现在包括 Python 版本的前两个组件。 (由 Paul Moore 在bpo-23437中贡献。)
tarfile
open()函数的* mode *参数现在接受"x"
来请求独占创建。 (由 Berker Peksag 在bpo-21717中贡献。)
TarFile.extractall()和TarFile.extract()方法现在带有关键字参数* numeric_owner *。如果设置为True
,则提取的文件和目录将由 tarfile 中的数字uid
和gid
拥有。如果设置为False
(默认设置,以及 3.5 之前的版本中的行为),则它们将由 tarfile 中的指定用户和组拥有。 (由 Michael Vogt 和 Eric Smith 在bpo-23193中贡献。)
TarFile.list()现在接受可选的* members *关键字参数,可以将其设置为TarFile.getmembers()返回的列表的子集。 (由 Serhiy Storchaka 在bpo-21549中贡献。)
threading
Lock.acquire()和RLock.acquire()方法现在都使用单调时钟进行超时 Management。 (由 Victor Stinner 在bpo-22043中贡献。)
time
monotonic()Function现在始终可用。 (由 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()Function可方便地遍历框架和 traceback 对象。 (由 Robert Collins 在bpo-17911中贡献。)
新的轻量级类:TracebackException,StackSummary和FrameSummary。 (由 Robert Collins 在bpo-17911中贡献。)
print_tb()和print_stack()函数现在都为* limit *参数支持负值。 (由 Dmitry Kazakov 在bpo-22619中贡献。)
types
新的coroutine()函数将generator和generator-like对象转换为awaitables。 (由 Yury Selivanov 在bpo-24017中贡献。)
名为CoroutineType的新类型,用于async def函数创建的coroutine对象。 (由 Yury Selivanov 在bpo-24400中贡献。)
unicodedata
unicodedata模块现在使用来自Unicode 8.0.0的数据。
unittest
TestLoader.loadTestsFromModule()方法现在接受仅关键字参数* pattern ,该参数将作为第三个参数传递给load_tests
。现在,无论所找到的软件包的路径是否与 pattern *匹配,都将对load_tests
进行检查,因为软件包名称不可能与默认模式匹配。 (由 Robert Collins 和 Barry A. Warsaw 在bpo-16662中贡献。)
现在,在TestLoader实例的TestLoader.errors属性中公开了单元测试发现错误。 (由 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()运算符。 (由bpo-20968中的 Johannes Baiter 和bpo-23581和bpo-23568中的 HåkanLövdahl 贡献。)
修补内置名称时,不再需要将create=True
显式传递给patch()函数。 (由 Kushal Das 在bpo-17660中贡献。)
urllib
新的request.HTTPPasswordMgrWithPriorAuth类允许 ManagementHTTP 基本身份验证凭据,以便消除不必要的401
响应处理,或无条件发送第一个请求的凭据,以便与返回404
响应而不是401
的服务器通信(如果Authorization
Headers 为未发送.(由bpo-19494中的 Matej Cepl 和bpo-7159中的 Akshit Khurana 贡献。)
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类现在支持context manager协议。 (由 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模块中的许多Function现在都接受可写bytes-like objects。 (由 Serhiy Storchaka 在bpo-23001中贡献。)
Optimizations
在 POSIX 系统上,os.walk()Function的速度提高了 3 到 5 倍,在 Windows 上,速度提高了 7 到 20 倍。这是使用新的os.scandir()函数完成的,该函数公开来自基础readdir
或FindFirstFile
/FindNextFile
系统调用的文件信息。 (由 Ben Hoyt 在bpo-23605中的 Victor Stinner 的帮助下提供。)
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对象的 Pickling 以产生较小的输出。 (由 Serhiy Storchaka 在bpo-23133中贡献。)
现在,io.BytesIO上的许多操作速度提高了 50%到 100%。 (由bpo-15381中的 Serhiy Storchaka 和bpo-22003中的 David Wilson 贡献。)
marshal.dumps()Function现在更快了:典型数据的版本 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=True
一样快地与ensure_ascii=False
一起运行。 (由稻田直树在bpo-23206中贡献。)
在第二个参数以type作为其元类的常见情况下,PyObject_IsInstance()和PyObject_IsSubclass()函数已经加快了速度。 (由bpo-22540贡献的 Georg Brandl。)
方法缓存有所改善,在某些基准测试中性能提高了 5%。 (由bpo-22847中的 Antoine Pitrou 提供。)
现在,来自random模块的对象在 64 位版本上使用的内存减少了 50%。 (由 Serhiy Storchaka 在bpo-23488中贡献。)
property() getter 通话速度提高了 25%。 (由 Joe Jevnik 在bpo-23910中贡献。)
现在,fractions.Fraction的实例化速度提高了 30%。 (由 Stefan Behnel 在bpo-22464中贡献。)
字符串方法find(),rfind(),split(),partition()和in字符串运算符现在大大加快了搜索 1 个字符的子字符串的速度。 (由 Serhiy Storchaka 在bpo-23573中贡献。)
Build 和 C API 的更改
添加了新的calloc
函数:
(由 Victor Stinner 在bpo-21233中贡献。)
新的编码/解码助手Function:
Py_DecodeLocale()(已替换
_Py_char2wchar()
),Py_EncodeLocale()(已替换
_Py_wchar2char()
)。
(由 Victor Stinner 在bpo-18395中贡献。)
一个新的PyCodec_NameReplaceErrors()函数,用\N{...}
转义符替换 unicode 编码错误。 (由 Serhiy Storchaka 在bpo-19676中贡献。)
与PyErr_Format()类似的新PyErr_FormatV()函数,但是接受va_list
参数。 (由bpo-18711中的 Antoine Pitrou 提供。)
新的PyExc_RecursionError
exception。 (由 Georg Brandl 在bpo-19235中贡献。)
PEP 489引入的新PyModule_FromDefAndSpec(),PyModule_FromDefAndSpec2()和PyModule_ExecDef()Function–多阶段扩展模块初始化。 (由 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 进行通信而构建的 extensions 外,在这种情况下,extensions 是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 相同。
Deprecated
New Keywords
不建议将async
和await
用作变量,类,函数或模块的名称。由 PEP 492在 Python 3.5 中引入,它们将成为 Python 3.7 中的适当关键字。
不推荐使用的 Python 行为
现在,在生成器中引发StopIteration异常将生成一个无声的PendingDeprecationWarning,它将在 Python 3.6 中成为非无声的弃用警告,并在 Python 3.7 中触发一个RuntimeError。有关详细信息,请参见PEP 479:更改生成器内部的 StopIteration 处理。
不支持的 os
Microsoft 不再支持 Windows XP,因此,根据 PEP 11,此 os 不再正式支持 CPython 3.5.
不推荐使用的 Python 模块,函数和方法
formatter模块现已完全弃用,并且仍计划在 Python 3.6 中删除。
不推荐使用asyncio.async()
函数,而推荐使用ensure_future()。
过去,smtpd模块始终使用utf-8
编解码器解码电子邮件的 DATA 部分。现在可以passSMTPServer的新* decode_data 关键字来控制它。默认值为True
,但不建议使用此默认值。使用适当的值指定 decode_data *关键字,以避免弃用警告。
不建议将值直接分配给http.cookies.Morsel个对象的key,value和coded_value。请改用set()方法。另外,不推荐使用未记录的set()的* LegalChars *参数,现在将其忽略。
不建议将格式字符串作为关键字参数* format_string *传递到string.Formatter类的format()方法。 (由 Serhiy Storchaka 在bpo-23671中贡献。)
现在不建议使用platform.dist()
和platform.linux_distribution()
函数。 Linux 发行版使用太多不同的方式来描述自己,因此该Function留给了软件包。 (由 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中贡献。)
随着 Python 3.5.0 的发布,getargvalues()和formatargvalues()函数被无意中标记为不推荐使用。
现在不建议将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中贡献。)
Removed
API 和Function删除
已删除以下过时且先前不推荐使用的 API 和Function:
__version__
属性已从电子邮件包中删除。电子邮件代码很长一段时间以来都没有与 stdlib 分开提供,并且__version__
字符串在最近的几个发行版中未更新。ftplib模块中的内部
Netrc
类在 3.4 中已弃用,现已删除。 (由 Matt Chaput 在bpo-6623中贡献。).pyo
文件的概念已删除。临时asyncio模块中的 JoinableQueue 类在 3.4.4 中已弃用,现在已删除。 (由 A. Jesse Jiryu Davis 在bpo-23464中贡献。)
移植到 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:如果 Pythonsignal 处理程序未引发异常,则系统现在在被 signal break时重试系统调用,而不是引发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,
HTMLParser.error()
和HTMLParserError
异常参数已被删除。 (由bpo-15114中的 Ezio Melotti 提供。)HTMLParser的* convert_charrefs *参数现在默认为True
。 (由 Berker Peksag 在bpo-21047中贡献。)尽管它不是 API 的正式组成部分,但出于移植目的(即:修复测试),值得注意的是以前以“'sometype'形式不支持缓冲区协议”形式的错误消息现在以“ a”形式出现bytes-like object是必填项,而不是“ 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 dict 的界面保持一致:现在,杂项比较考虑了key和value,copy()现在生成Morsel实例而不是dict,并且update()现在将引发异常(如果更新中的任何键)字典无效。此外,不推荐使用set()的未记录* LegalChars *参数,现在将其忽略。 (由bpo-2211中的 Demian Brecht 贡献。)
PEP 488从 Python 中删除了
.pyo
个文件,并在.pyc
文件名中引入了可选的opt-
标记。 importlib.util.cache_from_source()获得了* optimization 参数,以帮助控制opt-
标签。因此,现在不建议使用函数的 debug_override *参数。 .pyo 文件也不再支持作为 Python 解释器的文件参数,因此当它们自己分发时(即无源代码分发)没有任何作用。由于字节码的幻数在 Python 3.5 中已更改,因此,无论此 PEP 为何,以前版本的 Python 中所有旧的.pyo 文件均无效。现在,socket模块在 linux 3.6 及更高版本上导出CAN_RAW_FD_FRAMES常量。
现在,根据 RFC 5280,ssl.cert_time_to_seconds()函数将 Importing 时间解释为 UTC 而不是本地时间。此外,返回值始终为int。 (由 Akira Li 在bpo-19940中贡献。)
pygettext.py
工具现在在 POT-Creation-DateHeaders 中将标准 NNNN 格式用于时区。smtplib模块现在使用sys.stderr而不是先前的模块级
stderr
变量进行调试输出。如果您的(测试)程序依赖于修补模块级变量来捕获调试输出,则需要更新它以捕获 sys.stderr。找到空字符串并且索引完全超出范围时,str.startswith()和str.endswith()方法不再返回
True
。 (由 Serhiy Storchaka 在bpo-24284中贡献。)inspect.getdoc()函数现在返回从 Base Class 继承的文档字符串。如果继承的文档适当,则不再需要重复文档字符串。要取消继承的字符串,必须指定一个空字符串(否则可以填写文档)。此更改影响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__
属性会破坏 Pickling 和自省,所以现在针对不具有__module__
属性的内置类型提出了弃用警告。将来会是 AttributeError。 (由 Serhiy Storchaka 在bpo-20204中贡献。)作为 PEP 492实现的一部分,将PyTypeObject的
tp_reserved
插槽替换为tp_as_async
插槽。有关新的类型,结构和Function,请参考Coroutine Objects。
Python 3.5.4 中的重大更改
新的 make regen-all 构建目标
为了简化交叉编译,并确保可以可靠地编译 CPython,而无需使用现有的 Python 版本,基于自动工具的构建系统不再try根据文件修改时间隐式重新编译生成的文件。
而是添加了一个新的make regen-all
命令,以在需要时强制重新生成这些文件(例如,在已经基于预生成的版本构建 Python 的初始版本之后)。
还定义了更多选择性的再生目标-有关详细信息,请参见Makefile.pre.in。
(由 Victor Stinner 在bpo-23404中贡献。)
3.5.4 版中的新Function。
删除 make touch 构建目标
先前用于pass更新文件的修改时间来请求隐式重新生成生成文件的make touch
构建目标已删除。
它已被新的make regen-all
目标替换。
(由 Victor Stinner 在bpo-23404中贡献。)
在版本 3.5.4 中更改。