python 3.5的新功能

编辑

埃尔维斯·普兰斯基·维库斯<elvis@magic.io>,尤里·塞利万诺夫<yury@magic.io>

本文解释了与3.4相比,python 3.5中的新特性。python 3.5于2015年9月13日发布。参见 changelog 以获取完整的更改列表。

参见

PEP 478 -python 3.5发布计划

总结——发布亮点

新语法功能:

  • PEP 492 ,使用异步和等待语法协出。

  • PEP 465 ,一个新的矩阵乘法运算符: a @ b .

  • PEP 448 ,其他解包归纳。

新库模块:

新的内置功能:

  • bytes % args, bytearray % args: PEP 461 --加法 % 格式化为字节和字节数组。

  • 新的 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 当达到最大递归深度时,现在引发异常。(乔治布兰德尔在 bpo-19235

CPython实施改进:

  • LC_TYPE 区域设置是posix区域设置 (C 区域设置), sys.stdinsys.stdout 现在使用 surrogateescape 错误处理程序,而不是 strict 错误处理程序。(由Victor Stinner在 bpo-19977

  • .pyo 文件不再使用,已被一个更灵活的方案替换,该方案在 .pyc 姓名。(见 PEP 488 overview

  • 内置模块和扩展模块现在是在多阶段过程中初始化的,这类似于如何加载Python模块。(见 PEP 489 overview

标准库的重大改进:

安全改进:

  • SSLv3现在在整个标准库中都被禁用。它仍然可以通过实例化 ssl.SSLContext 手动。(参见 bpo-22638 有关更多详细信息,此更改已返回到CPython 3.4和2.7。)

  • 为了防止潜在的注入攻击,HTTP cookie解析现在更严格了。(由Antoine Pitrou在 bpo-22796

Windows改进:

  • 新的Windows安装程序替换了旧的MSI。见 在Windows上使用python 更多信息。

  • Windows构建现在使用微软Visual C++ 14,扩展模块应该使用相同的。

请继续阅读有关面向用户的更改的全面列表,包括许多其他较小的改进、cpython优化、拒绝以及潜在的移植问题。

新特点

PEP 492-带有异步和等待语法的协程

PEP 492 通过添加 awaitable objectscoroutine functionsasynchronous iterationasynchronous context managers .

协程函数是使用 async def 语法:

>>> async def coro():
...     return 'spam'

在协程函数中, await 表达式可用于挂起协同程序执行,直到结果可用为止。任何对象都可以 等待 ,只要它实现 awaitable 通过定义 __await__() 方法。

PEP492也补充说 async for 在异步iterables上方便迭代的语句。

使用新语法编写的基本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 forasync with 只能在用声明的协程函数内部使用 async def .

协程函数旨在在兼容的事件循环内运行,例如 asyncio loop .

注解

在 3.5.2 版更改: 从CPython 3.5.2开始, __aiter__ 可以直接返回 asynchronous iterators . 返回一个 awaitable 对象将导致 PendingDeprecationWarning .

在中查看更多详细信息 异步迭代器 文档部分。

参见

PEP 492 --带有异步和等待语法的协程

由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 --矩阵乘法专用中缀运算符

PEP由Nathaniel J.Smith编写;由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

同样,tuple、list、set和dictionary显示允许多次解包(请参见 表达式列表词典显示 ):

>>> *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编写的PEP;由Neil Girdhar、Thomas Wouters和Joshua Landau实施。

PEP 461-字节和字节数组的百分比格式支持

PEP 461 为添加支持 % interpolation operatorbytesbytearray .

虽然插值通常被认为是一个字符串操作,但在某些情况下,插值 bytesbytearrays 这是有道理的,弥补这个缺失功能所需的工作会降低代码的整体可读性。这个问题在处理有线格式协议时特别重要,这种协议通常是二进制和ASCII兼容文本的混合。

实例:

>>> b'Hello %b!' % b'World'
b'Hello World!'

>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'

不允许使用Unicode %b ,但它被接受了 %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 尽管支持转换类型,但只应在需要与Python2兼容的代码基中使用。

参见

PEP 461 --正在将%格式添加到字节和字节数组中

PEP由Ethan Furman编写;由Neil Schemenauer和Ethan Furman实施。

PEP 484-类型提示

函数注释语法自3.0版以来一直是一个python特性 (PEP 3107 但是注释的语义没有定义。

经验表明,大多数函数注释使用的是为函数参数和返回值提供类型提示。很明显,如果标准库包含类型注释的基本定义和工具,那么它将有利于Python用户。

PEP 484 介绍 provisional module 提供这些标准定义和工具,以及一些注释不可用的情况下的约定。

例如,这里有一个简单的函数,其参数和返回类型在注释中声明:

def greeting(name: str) -> str:
    return 'Hello ' + name

而这些注释在运行时通过 __annotations__ 属性, 运行时不进行自动类型检查 . 相反,假设单独的离线类型检查器(例如 mypy )将用于按需源代码分析。

类型系统支持联合、泛型类型和名为 Any 与所有类型一致(即可分配给和分配给所有类型)。

参见

  • typing 模块文档

  • PEP 484 ——Type Hints

    由Guido van Rossum、Jukka Lehtosalo和_Ukasz Langa编写的PEP;由Guido van Rossum实施。

  • PEP 483 --类型提示理论

    Guido van Rossum写的Pep

pep 471-os.scandir()函数--更好更快的目录迭代器

PEP 471 添加新的目录迭代函数, os.scandir() ,到标准库。此外, os.walk() 现在使用实现 scandir 这使得POSIX系统的速度提高了3到5倍,Windows系统的速度提高了7到20倍。这主要是通过大大减少 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)

参见

PEP 471 --函数——更好更快的目录迭代器

PEP由本霍伊特在维克托·斯廷纳的帮助下编写和实施。

PEP 475:用eintr重试系统调用失败

errno.EINTR 每当等待I/O的系统调用被信号中断时,都会返回错误代码。以前,python会引发 InterruptedError 在这种情况下。这意味着,在编写Python应用程序时,开发人员有两个选择:

  1. 忽略 InterruptedError .

  2. 处理 InterruptedError 并尝试在每个调用站点重新启动中断的系统调用。

第一个选项使应用程序间歇性失败。第二个选项添加了大量样板文件,使代码几乎不可读。比较:

print("Hello World")

和:

while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue

PEP 475 对上的系统调用实现自动重试 EINTR . 这消除了处理的负担 EINTRInterruptedError 在大多数情况下,在用户代码中,使包括标准库在内的Python程序更加健壮。请注意,只有在信号处理程序没有引发异常时才会重试系统调用。

下面是一个函数列表,当被信号中断时,将重试这些函数:

参见

PEP 475 --用eintr重试失败的系统调用

由查尔斯·弗朗索瓦·纳塔利和维克托·斯廷纳在安托万·皮特鲁(法国连接)的帮助下撰写的《PEP与执行》。

PEP 479:更改生成器内的停止迭代处理

生成器和 StopIteration 在Python3.4和更早的版本中,有时会令人惊讶,并且可以隐藏隐藏隐藏的bug。以前, 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__ 导入,A PendingDeprecationWarning 在任何时候 StopIteration 在生成器内部引发异常。

参见

PEP 479 --更改生成器内的StopIteration处理

由ChrisAngelico和Guido van Rossum撰写的PEP。由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 --一个检验近似相等性的函数

由Christopher Barker编写的PEP;由Chris Barker和Tal Einat实施。

PEP486:让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文件

由Brett Cannon编写和实现。

PEP 489:多相扩展模块初始化

PEP 489 更新扩展模块初始化,以利用由 PEP 451 在Python 3.4中。

这一变化使得选择使用新机制的扩展模块的导入语义更接近于Python源代码和字节码模块,包括使用任何有效标识符作为模块名的能力,而不是仅限于ASCII。

参见

PEP 489 --多相扩展模块初始化

Pep由Petr Viktorin、Stefan Behnel和Nick Coghlan编写;由Petr Viktorin实施。

其他语言更改

对核心python语言所做的一些较小的更改是:

  • 增加了 "namereplace" 错误处理程序。这个 "backslashreplace" 错误处理程序现在可用于解码和翻译。(Serhiy Storchaka在 bpo-19676bpo-22286

  • 这个 -b 选项现在影响比较 bytes 具有 int . (Serhiy Storchaka在 bpo-23681

  • 新哈萨克 kz1048 塔吉克 koi8_t codecs . (Serhiy Storchaka在 bpo-22682bpo-22681

  • 属性docStrings现在是可写的。这对 collections.namedtuple() 文档字符串。(由Berker Peksag在 bpo-24064

  • 现在支持涉及相对导入的循环导入。(布雷特·坎农和安托万·皮特鲁在 bpo-17636

新模块

typing

新的 typing provisional 模块为函数类型注释提供标准定义和工具。见 Type Hints 更多信息。

zipapp

新的 zipapp 模块(在 PEP 441 )提供用于创建可执行的python-zip应用程序的API和命令行工具,该工具在 bpo-1739468 但无论是在当时还是从那以后都没有得到很好的宣传。

使用这个新模块,捆绑应用程序就像放置所有文件一样简单,包括 __main__.py 文件,进入目录 myapp 和运行:

$ python -m zipapp myapp
$ python myapp.pyz

模块实现由Paul Moore在 bpo-23491 .

参见

PEP 441 --改进了对python-zip应用程序的支持

改进的模块

argparse

这个 ArgumentParser 类现在允许禁用 abbreviated usage 通过设置的长选项 allow_abbrevFalse . (年由乔纳森·保罗、史蒂文·贝萨德、保罗·J3和丹尼尔·埃里克森撰稿) bpo-14910

asyncio

自从 asyncio 模块是 provisional ,python 3.5中引入的所有更改也都已返回到python 3.4.x。

中的显著变化 asyncio 自python 3.4.0以来的模块:

3.5.1中的更新:

3.5.2中的更新:

BZ2

这个 BZ2Decompressor.decompress 方法现在接受一个可选的 max_length 用于限制已解压缩数据的最大大小的参数。(Nikolaus Rath于 bpo-15955

CGI

这个 FieldStorage 类现在支持 context manager 协议。(由Berker Peksag在 bpo-20289

cmath

一个新函数 isclose() 提供一种测试近似相等性的方法。(由Chris Barker和Tal Einat在 bpo-24270

代码

这个 InteractiveInterpreter.showtraceback() 方法现在打印全链的回溯,就像交互式解释器一样。(克劳迪乌波巴在 bpo-17442

收藏

这个 OrderedDict 类现在在C中实现,这使得它的速度快了4到100倍。(埃里克·斯诺在 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 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() 方法现在接受 开始stop 要匹配的相应方法的参数 tuplelist 等(由Devin Jeanpierre在 bpo-23086

一个新的 Generator 抽象基类。(由Stefan Behnel在 bpo-24018

新的 AwaitableCoroutineAsyncIteratorAsyncIterable 抽象基类。(由Yury Selivanov在 bpo-24184

对于早期的python版本,可以在外部 PyPI package .

编译所有

一个新的 compileall 选项, -j {N} ,允许运行 N 同时工作以执行并行字节码编译。这个 compile_dir() 函数具有相应的 workers 参数。(克劳迪乌波巴在 bpo-16104

另一个新的选择, -r ,允许控制子目录的最大递归级别。(克劳迪乌波巴在 bpo-19628

这个 -q 现在可以多次指定命令行选项,在这种情况下,包括错误在内的所有输出都将被抑制。相应的 quiet 参数在 compile_dir()compile_file()compile_path() 现在可以接受指示输出抑制级别的整数值。(托马斯·克鲁弗在 bpo-21338

concurrent.futures

这个 Executor.map() 方法现在接受 chunksize 允许成批处理任务以提高性能的参数 ProcessPoolExecutor() 使用。(Dan O'Reilly在 bpo-11271

中的工人数量 ThreadPoolExecutor 构造函数现在是可选的。默认值是CPU数量的5倍。(克劳迪乌波巴在 bpo-21527

配置分析器

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() context manager (类似于 redirect_stdout() )使实用程序脚本更容易处理将输出写入的不灵活API sys.stderr 不要提供任何重定向选项:

>>> 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() 方法现在支持任意iterables,而不仅仅是序列。(Serhiy Storchaka在 bpo-23171

curses

新的 update_lines_cols() 函数更新 LINESCOLS 环境变量。这对于检测手动调整屏幕大小很有用。(由Arnon Yaari在 bpo-4254

dbm

dumb.open 当标志具有值时始终创建新数据库 "n" . (克劳迪乌波巴在 bpo-18039

difflib

由生成的HTML文档的字符集 HtmlDiff.make_file() 现在可以使用新的 charset 仅关键字参数。HTML文档的默认字符集从 "ISO-8859-1""utf-8" . (由Berker Peksag在 bpo-2052

这个 diff_bytes() 函数现在可以比较字节字符串列表。这修复了从python 2回归的问题。(由特里·J·雷迪和格雷格·沃德在 bpo-17445

distutils

两个 buildbuild_ext 命令现在接受 -j 选项以启用扩展模块的并行构建。(由Antoine Pitrou在 bpo-5309

这个 distutils 模块现在支持 xz 压缩,并且可以通过传递启用 xztar 作为一个参数 bdist --format . (Serhiy Storchaka在 bpo-16314

doctest

这个 DocTestSuite() 函数返回空 unittest.TestSuite 如果 模块 不包含docstring,而不是引发 ValueError . (由格伦·琼斯在 bpo-15916

email

新的政策选择 Policy.mangle_from_ 控制是否以开头的行 "From " 在电子邮件中,正文的前缀是 ">" 由生成器生成的字符。默认值为 True 对于 compat32False 所有其他政策。(米兰奥伯基赫在 bpo-20098

一个新的 Message.get_content_disposition() 方法可以方便地访问 Content-Disposition 标题。(由Abhilash Raj在 bpo-21083

新的政策选择 EmailPolicy.utf8 可以设置为 True 使用UTF-8字符集而不是编码字对电子邮件头进行编码。这允许 Messages 格式依据 RFC 6532 并与支持 RFC 6531 SMTPUTF8 延伸。(R.David Murray在 bpo-24211

这个 mime.text.MIMEText 构造函数现在接受 charset.Charset 实例。(Claude Paroz和Berker Peksag在 bpo-16324

枚举

这个 Enum Callable有一个新参数 开始 指定枚举值的初始数目 姓名 提供:

>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>

(伊桑·弗曼在 bpo-21706

faulthandler

这个 enable()register()dump_traceback()dump_traceback_later() 函数现在除了接受类似文件的对象外,还接受文件描述符。(魏武年供稿) bpo-23566

功能工具

大部分的 lru_cache() 机器现在在C语言中实现,使其速度显著加快。(由Matt Joiner、Alexey Kachayev和Serhiy Storchaka在 bpo-14373

格洛布

这个 iglob()glob() 函数现在支持子目录中的递归搜索,使用 "**" 模式。(Serhiy Storchaka在 bpo-13968

GZIP

这个 mode 论证 GzipFile 构造函数现在接受 "x" 请求独占创建。(蒂姆·希尼在 bpo-19222

HEAPQ

元素比较 merge() 现在可以通过传递 key function 在新选项中 key 关键字参数和新的可选参数 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状态代码、原因短语和用英语编写的长描述的枚举。(德米安·布莱希特在 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

(马丁·潘特在 bpo-3566

idlelib和idle

由于idlelib实现了idle shell和编辑器,并且不打算由其他程序导入,所以它在每个版本中都得到了改进。见 Lib/idlelib/NEWS.txt 对于自3.4.0以来的累积更改列表,以及在未来3.5.x版本中所做的更改。此文件也可从空闲 Help ‣ About IDLE 对话框。

IMAPLIB

这个 IMAP4 类现在支持 context manager 协议。当用于 with 语句,imap4 LOGOUT 命令将在块末尾自动调用。(由Tarek Ziad_和Serhiy Storchaka于 bpo-4972

这个 imaplib 模块现在支持 RFC 5161 (启用扩展)和 RFC 6855 (支持UTF-8)通过 IMAP4.enable() 方法。一个新的 IMAP4.utf8_enabled 属性跟踪是否 RFC 6855 支持已启用。(米兰•奥伯基赫、R.大卫•穆雷和麦基•斯图利克于年撰稿) bpo-21800

这个 imaplib 模块现在按照RFC的建议,使用UTF-8自动编码非ASCII字符串用户名和密码。(米兰奥伯基赫在 bpo-21800

IMGHDR

这个 what() 函数现在识别 OpenEXR 格式(由Martin Vignali和Claudiu Popa在 bpo-20295WebP 格式(由Fabrice Aneche和Claudiu Popa在 bpo-20197

importlib

这个 util.LazyLoader 类允许在启动时间很重要的应用程序中延迟加载模块。(布雷特·坎农在 bpo-17621

这个 abc.InspectLoader.source_to_code() 方法现在是静态方法。这使得通过运行从字符串编译的代码来初始化模块对象更加容易。 exec(code, module.__dict__) .(布雷特·坎农在 bpo-21156

新的 util.module_from_spec() 函数现在是创建新模块的首选方法。与创建 types.ModuleType 直接实例,这个新函数将根据传入的spec对象设置各种导入控制的属性。(布雷特·坎农在 bpo-20383

检查

两个 SignatureParameter 类现在可以选择和散列。(由Yury Selivanov在 bpo-20726bpo-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

要检查的一组新功能 coroutine functionscoroutine objects 已被添加: iscoroutine()iscoroutinefunction()isawaitable()getcoroutinelocals()getcoroutinestate() . (由Yury Selivanov在 bpo-24017bpo-24400

这个 stack()trace()getouterframes()getinnerframes() 函数现在返回命名元组的列表。(丹尼尔·沙哈夫在 bpo-16808

io

一个新的 BufferedIOBase.readinto1() 方法,最多使用一个对基础原始流的调用 RawIOBase.read()RawIOBase.readinto() 方法。(Nikolaus Rath于 bpo-20578

IP地址

两个 IPv4NetworkIPv6Network 课程现在接受 (address, netmask) tuple参数,以便从现有地址轻松构造网络对象:

>>> 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

一个新的 reverse_pointer 的属性 IPv4NetworkIPv6Network 类返回反向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

缓存线

一个新的 lazycache() 函数可用于捕获有关非基于文件的模块的信息,以便以后通过 getline() . 这样可以避免在实际需要线路之前进行I/O,而不必无限期地携带模块全局数据。(罗伯特·柯林斯在 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

登录

所有日志记录方法 (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 用于限制已解压缩数据的最大大小的参数。(马丁·潘特在 bpo-15955

数学

两个新常量已添加到 math 模块: infnan . (马克·狄金森在 bpo-23185

一个新函数 isclose() 提供一种测试近似相等性的方法。(由Chris Barker和Tal Einat在 bpo-24270

一个新的 gcd() 已添加函数。这个 fractions.gcd() 函数现在已弃用。(由Mark Dickinson和Serhiy Storchaka在 bpo-22486

多重处理

sharedctypes.synchronized() 对象现在支持 context manager 协议。(由Charles Fran_ois Natali于 bpo-21565

操作人员

attrgetter()itemgetter()methodcaller() 对象现在支持酸洗。(由Josh Rosenberg和Serhiy Storchaka在 bpo-22955

新的 matmul()imatmul() 执行矩阵乘法的函数。(本杰明·彼得森于 bpo-21176

操作系统

新的 scandir() 函数返回的迭代器 DirEntry 已添加个对象。如果可能的话, scandir() 在扫描目录时提取文件属性,从而消除了执行后续系统调用以确定文件类型或属性的需要,这可以显著提高性能。(本·霍伊特在维克托·斯廷纳的帮助下 bpo-22524

在Windows上,一个新的 stat_result.st_file_attributes 属性现在可用。它对应于 dwFileAttributes 会员 BY_HANDLE_FILE_INFORMATION 结构返回者 GetFileInformationByHandle() .(由Ben Hoyt在 bpo-21719

这个 urandom() 函数现在使用 getrandom() Linux 3.17或更新版本上的系统调用,以及 getentropy() 在OpenBSD 5.6及更高版本上,不再需要使用 /dev/urandom 以及避免由于潜在的文件描述符耗尽而导致的失败。(由Victor Stinner在 bpo-22181

新的 get_blocking()set_blocking() 函数允许获取和设置文件描述符的阻止模式 (O_NONBLOCK (由Victor Stinner在 bpo-22054

这个 truncate()ftruncate() 现在Windows支持函数。(史蒂夫·道尔在 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

(由金刚角和安托万·皮特鲁于 bpo-19775

这个 Path.mkdir() 方法现在接受一个新的可选 exist_ok 要匹配的参数 mkdir -pos.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

(克里斯托弗·韦尔伯恩于 bpo-20218

泡菜

嵌套对象(如未绑定的方法或嵌套类)现在可以使用pickle pickle protocols 早于协议版本4。协议版本4已经支持这些情况。(Serhiy Storchaka在 bpo-23611

poplib

一个新的 POP3.utf8() 命令使能 RFC 6856 (国际化电子邮件)支持,如果pop服务器支持。(米兰奥伯基赫在 bpo-21804

re

现在lookbehind断言中允许对具有固定长度的组的引用和条件引用::

>>> 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 异常具有新属性, msgpatternposlinenocolno ,提供有关错误的更好的上下文信息:

>>> 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

选择器

新的 DevpollSelector 支持高效 /dev/poll 在Solaris上轮询。(由Giampaolo Rodola在 bpo-18931

shutil

这个 move() 函数现在接受 copy_function 参数,例如,允许 copy() 要使用的函数,而不是默认值 copy2() 如果在移动时需要忽略文件元数据。(克劳迪乌波巴在 bpo-19840

这个 make_archive() 函数现在支持 xztar 格式。(Serhiy Storchaka在 bpo-5411

信号

在Windows上 set_wakeup_fd() 函数现在还支持套接字句柄。(由Victor Stinner在 bpo-22018

各种各样 SIG* 中的常量 signal 模块已转换为 Enums . 这允许在调试期间打印有意义的名称,而不是整数“幻数”。(由Giampaolo Rodola在 bpo-21076

短信网关

两个 SMTPServerSMTPChannel 课程现在接受 decode_data 关键字参数来确定 DATA SMTP事务的一部分使用 "utf-8" codec或被提供给 SMTPServer.process_message() 方法作为字节字符串。默认值为 True 由于向后兼容的原因,但将更改为 False 在python 3.6中。如果 decode_data 设置为 False , the process_message 方法必须准备接受关键字参数。(由Maciej Szulik在 bpo-19662

这个 SMTPServer`类现在发布了 ``8BITMIME` 延伸 (RFC 6152 如果 decode_data 已经被设定 True . 如果客户指定 BODY=8BITMIMEMAIL 命令,它被传递给 SMTPServer.process_message() 通过 mail_options 关键字。(米兰·奥伯基赫和R.大卫·默里在 bpo-21795

这个 SMTPServer 类现在还支持 SMTPUTF8 延伸 (RFC 6531 :国际化电子邮件)。如果客户指定 SMTPUTF8 BODY=8BITMIMEMAIL 命令,它们被传递给 SMTPServer.process_message() 通过 mail_options 关键字。这是 process_message 正确处理 SMTPUTF8 数据。(米兰奥伯基赫在 bpo-21725

现在可以直接或通过名称解析在 SMTPServer 并使其成功连接。(米兰奥伯基赫在 bpo-14758

SMTPLIB

一个新的 SMTP.auth() 方法为实现自定义身份验证机制提供了一种方便的方法。(米兰奥伯基赫在 bpo-15014

这个 SMTP.set_debuglevel() 方法现在接受一个额外的调试级别(2),它在调试消息中启用时间戳。(由Gavin Chappell和Maciej Szulik于 bpo-16914

两个 SMTP.sendmail()SMTP.send_message() 方法现在支持 RFC 6531 (SMTPFF8)。(米兰·奥伯基赫和R.大卫·默里在 bpo-22027

SNDHDR

这个 what()whathdr() 函数现在返回 namedtuple() . (克劳迪乌波巴在 bpo-18615

Socket

带有超时的函数现在使用单调的时钟,而不是系统时钟。(由Victor Stinner在 bpo-22043

一个新的 socket.sendfile() 方法允许使用高性能通过套接字发送文件 os.sendfile() 在Unix上运行,导致上载速度比使用plain时快2到3倍 socket.send() . (由Giampaolo Rodola在 bpo-17552

这个 socket.sendall() 方法不再在每次接收或发送字节时重置套接字超时。套接字超时现在是发送所有数据的最大总持续时间。(由Victor Stinner在 bpo-23853

这个 积压 论证 socket.listen() 方法现在是可选的。默认设置为 SOMAXCONN128 ,以较小者为准。(由Charles Fran_ois Natali于 bpo-21455

SSL

记忆生物支持

(由Geert Jansen在 bpo-21965

新的 SSLObject 已添加类,以便为以下情况提供SSL协议支持: SSLSocket 不必要或不理想。 SSLObject 表示一个SSL协议实例,但不实现任何网络I/O方法,而是提供一个内存缓冲区接口。新的 MemoryBIO 类可用于在Python和SSL协议实例之间传递数据。

内存bio-ssl支持主要用于实现异步I/O的框架,其中 SSLSocket 的就绪模型(“select/poll”)效率低下。

一个新的 SSLContext.wrap_bio() 方法可用于创建新的 SSLObject 实例。

应用层协议协商支持

(本杰明·彼得森于 bpo-20188

如果存在openssl支持,则 ssl 模块现在实现 Application-Layer Protocol Negotiation 如中所述的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.SSLWantReadErrorssl.SSLWantWriteError 如果操作将阻塞,则在非阻塞套接字上出现异常。以前,它会返回 0 . (Nikolaus Rath于 bpo-20951

这个 cert_time_to_seconds() 函数现在将输入时间解释为UTC,而不是本地时间,根据 RFC 5280 . 此外,返回值始终是 int . (李秋拉在 bpo-19940

新的 SSLObject.shared_ciphers()SSLSocket.shared_ciphers() 方法返回客户端在握手过程中发送的密码列表。(本杰明·彼得森于 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() 迭代和切片索引。(克劳迪乌波巴在 bpo-10203 由卢卡斯·辛克莱、杰西卡·麦凯拉和塞尔希·斯托查卡在 bpo-13583

子过程

新的 run() 已添加函数。它运行指定的命令并返回 CompletedProcess 对象,描述完成的进程。新的API更加一致,是在不需要与早期的Python版本保持兼容性的Python代码中调用子流程的推荐方法。(托马斯·克鲁弗在 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')

系统

一个新的 set_coroutine_wrapper() 函数允许设置将在 coroutine object 由创建 async def 功能。相应的 get_coroutine_wrapper() 可用于获取当前设置的包装。两种功能都是 provisional ,仅用于调试目的。(由Yury Selivanov在 bpo-24017

一个新的 is_finalizing() 函数可用于检查python解释器是否 shutting down . (由Antoine Pitrou在 bpo-22696

系统配置

Windows上用户脚本目录的名称现在包含了Python版本的前两个组件。(保罗·摩尔在 bpo-23437

tarfile

这个 mode 论证 open() 函数现在接受 "x" 请求独占创建。(由Berker Peksag在 bpo-21717

这个 TarFile.extractall()TarFile.extract() 方法现在采用关键字参数 numeric_owner . 如果设置为 True ,提取的文件和目录将由数字 uidgid 从tarfile。如果设置为 False (默认值,以及3.5之前版本中的行为),它们将由tarfile中的命名用户和组拥有。(由Michael Vogt和Eric Smith在 bpo-23193

这个 TarFile.list() 现在接受一个可选的 成员 关键字参数,可设置为返回的列表的子集 TarFile.getmembers() . (Serhiy Storchaka在 bpo-21549

线程加工

两个 Lock.acquire()RLock.acquire() 方法现在使用一个单调的时钟进行超时管理。(由Victor Stinner在 bpo-22043

时间

这个 monotonic() 功能现在始终可用。(由Victor Stinner在 bpo-22043

timeit

新的命令行选项 -u--unit={U} 可用于指定计时器输出的时间单位。支持的选项包括 usecmsecsec . (朱利安·金迪在 bpo-18983

这个 timeit() 函数有一个新的 globals 用于指定运行代码的命名空间的参数。(由Ben Roberts在 bpo-2527

tkinter

这个 tkinter._fix 用于在Windows上设置tcl/tk环境的模块已由 _tkinter 不会对环境变量进行永久性更改的模块。(由Zachary Ware在 bpo-20035

追溯

新的 walk_stack()walk_tb() 函数可以方便地遍历框架和追溯对象。(罗伯特·柯林斯在 bpo-17911

新的轻量级类: TracebackExceptionStackSummaryFrameSummary . (罗伯特·柯林斯在 bpo-17911

两个 print_tb()print_stack() 函数现在支持 limit 参数。(由Dmitry Kazakov于 bpo-22619

类型

一个新的 coroutine() 要转换的函数 generatorgenerator-like 对象进入 awaitables . (由Yury Selivanov在 bpo-24017

名为 CoroutineType ,用于 coroutine 对象创建者 async def 功能。(由Yury Selivanov在 bpo-24400

unicodedata

这个 unicodedata 模块现在使用来自 Unicode 8.0.0 .

单元测试

这个 TestLoader.loadTestsFromModule() 方法现在只接受关键字参数 模式 传递给 load_tests 作为第三个参数。现在检查找到的包 load_tests 不管他们的路径是否匹配 模式 ,因为包名称不可能与默认模式匹配。(罗伯特·柯林斯和巴里·A·华沙在 bpo-16662

UnitTest发现错误现在暴露在 TestLoader.errors 的属性 TestLoader 实例。(罗伯特·柯林斯在 bpo-19746

新的命令行选项 --locals 在回溯中显示局部变量。(罗伯特·柯林斯在 bpo-22936

unittest.mock

这个 Mock 类有以下改进:

这个 MagicMock 类现在支持 __truediv__()__divmod__()__matmul__() 运算符。(约翰内斯·拜尔在 bpo-20968 和h_kan l_vdahl in bpo-23581bpo-23568

不再需要显式传递 create=Truepatch() 函数在修补内置名称时。(由Kushal Das在 bpo-17660

urllib

一个新的 request.HTTPPasswordMgrWithPriorAuth 类允许管理HTTP基本身份验证凭据,以消除不必要的 401 响应处理,或者在第一个请求时无条件地发送凭据,以便与返回 404 响应而不是 401 如果 Authorization 未发送标题。(由Matej Cepl在 bpo-19494 还有阿卡什·库拉纳 bpo-7159

一个新的 quote_via 的参数 parse.urlencode() 函数提供了一种方法,可以根据需要控制查询部分的编码。(由Samwyse和Arnon Yaari在 bpo-13866

这个 request.urlopen() 函数接受 ssl.SSLContext 对象作为 context 参数,将用于HTTPS连接。(由Alex Gaynor在 bpo-22366

这个 parse.urljoin() 已更新为使用 RFC 3986 解析相对URL的语义,而不是 RFC 1808RFC 2396 . (由Demian Brecht和Senthil Kumaran在 bpo-22118

wsgiref

这个 headers 论证 headers.Headers 类构造函数现在是可选的。(由Pablo Torres Navarrete和SilentGhost在 bpo-5800

xmlrpc

这个 client.ServerProxy 类现在支持 context manager 协议。(克劳迪乌波巴在 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

压缩文件

现在可以将ZIP输出写入不可访问的流。(Serhiy Storchaka在 bpo-23252

这个 mode 的参数 ZipFile.open() 方法现在接受 "x" 请求独占创建。(Serhiy Storchaka在 bpo-21717

其他模块级别更改

中的许多功能 mmapossaudiodevsocketsslcodecs 模块现在接受可写 bytes-like objects . (Serhiy Storchaka在 bpo-23001

优化

这个 os.walk() 在POSIX系统上,函数的速度提高了3到5倍,在Windows上提高了7到20倍。这是用新的 os.scandir() 函数,它公开来自底层的文件信息 readdir or FindFirstFile/FindNextFile 系统调用。(本·霍伊特在维克托·斯廷纳的帮助下 bpo-23605

建设 bytes(int) (由零字节填充)速度更快,对大型对象使用的内存更少。 calloc() 使用而不是 malloc() 为这些对象分配内存。(由Victor Stinner在 bpo-21233

一些操作 ipaddress IPv4NetworkIPv6Network 已经大大加快了速度,例如 subnets()supernet()summarize_address_range()collapse_addresses() .速度可以从3到15倍不等。(安托万·皮特鲁、米歇尔·阿尔伯特和马库斯在 bpo-21486bpo-21487bpo-20826bpo-23266

酸洗 ipaddress 对象被优化以产生明显较小的输出。(Serhiy Storchaka在 bpo-23133

许多操作 io.BytesIO 现在快了50%到100%。(Serhiy Storchaka在 bpo-15381 大卫·威尔逊在 bpo-22003

这个 marshal.dumps() 功能现在更快了:65-85%的版本是3和4,20-25%的版本是典型数据的0到2,在最好的情况下最多是5倍。(Serhiy Storchaka在 bpo-20416bpo-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

这个 PyObject_IsInstance()PyObject_IsSubclass() 在第二个参数 type 作为它的元类。(年由乔治·布兰德供稿) bpo-22540

方法缓存稍有改进,在一些基准测试中性能提高了5%。(由Antoine Pitrou在 bpo-22847

对象来自 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

构建和C API更改

新的 calloc 新增功能:

(由Victor Stinner在 bpo-21233

新的编码/解码助手函数:

(由Victor Stinner在 bpo-18395

一个新的 PyCodec_NameReplaceErrors() 函数将Unicode编码错误替换为 \N{{...}} 逃逸。(Serhiy Storchaka在 bpo-19676

一个新的 PyErr_FormatV() 功能类似于 PyErr_Format() 但接受 va_list 参数。(由Antoine Pitrou在 bpo-18711

一个新的 PyExc_RecursionError 例外。(乔治布兰德尔在 bpo-19235

新的 PyModule_FromDefAndSpec()PyModule_FromDefAndSpec2()PyModule_ExecDef() 功能介绍人 PEP 489 --多相扩展模块初始化。(由Petr Viktorin在 bpo-24268

新的 PyNumber_MatrixMultiply()PyNumber_InPlaceMatrixMultiply() 执行矩阵乘法的函数。(本杰明·彼得森于 bpo-21176 .另请参见 PEP 465 详情。

这个 PyTypeObject.tp_finalize 时隙现在是稳定ABI的一部分。

Windows构建现在需要微软Visual C++ 14,这是可用的一部分。 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> 扩展模块是为运行而构建的硬件体系结构。这也是最常见的 i386 对于32位Intel平台或 x86_64 对于64位Intel(和AMD)平台。

    • <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, win_amd64 对于Wi64, win_ia64 对于Windows Itanium 64,以及 win_arm 手臂上的Windows。

    • 如果内置调试模式, <debug>_d ,否则为空。

  • 在OS X平台上,扩展模块文件名现在以 -darwin.so .

  • 在所有其他平台上,扩展模块文件名与Python3.4相同。

已弃用

新关键词

asyncawait 不建议用作变量、类、函数或模块名称。介绍通过 PEP 492 在python 3.5中,它们将成为python 3.7中合适的关键字。

已弃用的python行为

提高 StopIteration 生成器内部的异常现在将生成静默 PendingDeprecationWarning 将成为Python3.6中的非静默拒绝警告,并将触发 RuntimeError 在Python 3.7中。见 PEP 479: Change StopIteration handling inside generators 有关详细信息。

不支持的操作系统

Microsoft不再支持Windows XP,因此 PEP 11 ,cpython 3.5不再在此操作系统上得到正式支持。

不推荐使用的python模块、函数和方法

这个 formatter 模块现在已经完全弃用了,在python 3.6中仍将被删除。

这个 asyncio.async() 函数已弃用,取而代之的是 ensure_future() .

这个 smtpd 模块过去总是使用 utf-8 编解码器。现在可以由新的 decode_data 关键字到 SMTPServer . 默认值为 True ,但不推荐使用此默认值。指定 decode_data 具有适当值的关键字,以避免出现拒绝警告。

直接将值分配给 keyvaluecoded_value 属于 http.cookies.Morsel 对象已弃用。使用 set() 方法。此外,未登记的 LegalChars 参数 set() 已弃用,现在被忽略。

将格式字符串作为关键字参数传递 format_stringformat() 方法 string.Formatter 类已被弃用。(Serhiy Storchaka在 bpo-23671

这个 platform.dist()platform.linux_distribution() 现在不推荐使用函数。Linux发行版使用了太多不同的方式来描述它们自己,所以功能留给了一个包。(由Vajrasky Kok和Berker Peksag于 bpo-1322

以前未登记的 from_functionfrom_builtin 方法 inspect.Signature 已弃用。使用新的 Signature.from_callable() 方法。(由Yury Selivanov在 bpo-24248

这个 inspect.getargspec() 函数已弃用,并计划在python 3.6中删除。(见 bpo-20438 详情。

这个 inspect getfullargspec()getcallargs()formatargspec() 函数被弃用,取而代之的是 inspect.signature() 应用程序编程接口。(由Yury Selivanov在 bpo-20438

getargvalues()formatargvalues() 在发布python 3.5.0时,无意中将函数标记为已弃用。

使用 re.LOCALE 带有str模式的标志或 re.ASCII 现已弃用。(Serhiy Storchaka在 bpo-22407

使用不可识别的特殊序列,包括 '\' 正则表达式模式和替换模式中的一个ASCII字母现在会引发一个拒绝警告,在Python3.6中是禁止的。(Serhiy Storchaka在 bpo-23622

无证和非官方的 use_load_tests 的默认参数 unittest.TestLoader.loadTestsFromModule() 方法现在已被弃用并忽略。(罗伯特·柯林斯和巴里·A·华沙在 bpo-16662

弃用

API和功能删除

已删除以下过时和以前不推荐使用的API和功能:

  • 这个 __version__ 属性已从电子邮件包中删除。电子邮件代码很长时间没有与stdlib分开发送,并且 __version__ 字符串在最近几个版本中没有更新。

  • 内部 Netrc 类中 ftplib 模块在3.4中已被弃用,现在已被删除。(由Matt Chaput在 bpo-6623

  • 概念 .pyo 文件已被删除。

  • 临时中的JoinableQueue类 asyncio 模块在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 如果不是函数的唯一参数,则as generator表达式必须放在括号中。

python api中的更改

  • PEP 475 :系统调用现在在被信号中断时重试,而不是引发 InterruptedError 如果python信号处理程序没有引发异常。

  • 在python 3.5之前,a datetime.time 如果对象以UTC表示午夜,则该对象被认为是错误的。这种行为被认为是不明显且容易出错的,已经在Python3.5中被删除。见 bpo-13936 详细信息。

  • 这个 ssl.SSLSocket.send() 方法现在引发 ssl.SSLWantReadErrorssl.SSLWantWriteError 在非阻塞套接字上,如果操作将阻塞。以前,它会返回 0 . (Nikolaus Rath于 bpo-20951

  • 这个 __name__ 生成器的属性现在是从函数名设置的,而不是从代码名设置的。使用 gen.gi_code.co_name 检索代码名。生成器也有新的 __qualname__ 属性,限定名,现在用于表示生成器 (repr(gen) )(由Victor Stinner在 bpo-21205

  • 已弃用的“严格”模式和参数 HTMLParserHTMLParser.error()HTMLParserError 已删除异常。(由Ezio Melotti在 bpo-15114convert_charrefs 的参数 HTMLParser 现在是 True 默认情况下。(由Berker Peksag在 bpo-21047

  • 尽管它不是API的正式组成部分,但出于移植目的(即:修复测试),值得注意的是,以前的“someType”形式不支持缓冲协议的错误消息现在是“A”形式 bytes-like object 是必需的,而不是“someType”。(由Ezio Melotti在 bpo-16518

  • 如果当前目录设置为不再存在的目录,则 FileNotFoundError 将不再被引发,取而代之的是 find_spec() 将返回 None 没有 高速缓存 None 在里面 sys.path_importer_cache 与典型情况不同 (bpo-22834

  • HTTP状态代码和来自的消息 http.clienthttp.server 被重构成 HTTPStatus 枚举。中的值 http.clienthttp.server 保持向后兼容性。(德米安·布莱希特在 bpo-21793

  • 当导入加载程序定义 importlib.machinery.Loader.exec_module() 现在还需要定义 create_module() (提出一个 DeprecationWarning 现在,在python 3.6中是一个错误)。如果加载程序继承自 importlib.abc.Loader 那就没什么事可做了,只需定义 create_module() 归来 None . (布雷特·坎农在 bpo-23014

  • 这个 re.split() 函数始终忽略空模式匹配,因此 "x*" 工作模式与 "x+""\b" 模式从未起作用。现在 re.split() 如果模式可以匹配空字符串,则引发警告。为了兼容性,请使用从不匹配空字符串的模式(例如 "x+" 而不是 "x*" )只能匹配空字符串的模式(例如 "\b" )现在提出一个错误。(Serhiy Storchaka在 bpo-22818

  • 这个 http.cookies.Morsel 类似dict的界面已经变得自始至终:莫尔斯比较现在采用 keyvalue 考虑到, copy() 现在结果是 Morsel 实例而不是 dictupdate() 如果更新字典中的任何键无效,将立即引发异常。此外,未登记的 LegalChars 参数 set() 已弃用,现在被忽略。(德米安·布莱希特在 bpo-2211

  • PEP 488 已经移除 .pyo 来自python的文件并引入了可选的 opt- 标签 .pyc 文件名。这个 importlib.util.cache_from_source() 获得了 optimization 用于帮助控制 opt- 标签。因此, debug_override 函数的参数现在已弃用。 .pyo 文件也不再作为python解释器的文件参数来支持,因此当单独分发时(即无源代码分发),它们就没有任何作用。由于在python 3.5中字节码的幻数发生了变化,所有这些都是旧的 .pyo 无论此PEP如何,来自以前版本的python的文件都是无效的。

  • 这个 socket 模块现在导出 CAN_RAW_FD_FRAMES Linux 3.6及更高版本上的常量。

  • 这个 ssl.cert_time_to_seconds() 函数现在将输入时间解释为UTC,而不是本地时间,根据 RFC 5280 . 此外,返回值始终是 int . (李秋拉在 bpo-19940

  • 这个 pygettext.py 工具现在使用标准+nnnn格式在pot创建日期标题中设置时区。

  • 这个 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() . (亚历山大·伯罗波尔斯基于年 bpo-7830

C API中的更改

  • 无证件者 format 成员(非公开) PyMemoryViewObject 结构已被删除。所有扩展依赖于中的相关部分 memoryobject.h 必须重建。

  • 这个 PyMemAllocator 结构已重命名为 PyMemAllocatorEx 和一个新的 calloc 字段已添加。

  • 删除了未记录的宏 PyObject_REPR 泄露了参考资料。使用格式字符 %R 在里面 PyUnicode_FromFormat() -像函数一样格式化 repr() 对象的(Serhiy Storchaka在 bpo-22453

  • 因为缺少 __module__ 属性中断了pickle和自省,现在对没有 __module__ 属性。这将是未来的一个属性错误。(Serhiy Storchaka在 bpo-20204

  • 作为 PEP 492 实施 tp_reservedPyTypeObject 被替换为 tp_as_async 狭槽。参照 协程对象 对于新的类型、结构和功能。

python 3.5.4的显著变化

新的 make regen-all 建立目标

为了简化交叉编译,并确保在不需要现有的python版本可用的情况下可靠地编译cpython,基于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 版更改.