Python3.5中的新功能

编辑:Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

本文将为你介绍Python从3.4到3.5新加入的特性。Python3.5于2015年9月13日正式发布。你可以点击 更新日志 了解详细情况。

参见

PEP 478 - Python3.5发布时间表

概要 – 新版本亮点

新语法特性:

  • PEP 492,具有async和await语法的协同程序。
  • PEP 465, 新矩阵乘法运算符:a @ b
  • PEP 448, 新增分拆的概况统一。

新的库模块︰

新的内置功能︰

  • bytes % args, bytearray % args: PEP 461 – 向bytes和bytearray添加格式。
  • 新的bytes.hex()bytearray.hex()memoryview.hex()方法。(供稿人:Arnon Yaari,issue 9951。)
  • memoryview现在支持元组索引(包括多维)。(由Antoine Pitrou在issue 23632中提供。)
  • 生成器有一个新的yield from属性,它返回被yield 表达式迭代的对象。(由Benno Leslie和Yury Selivanov在版本24450提供)。
  • 新增RecursionError异常。当达到最大递归深度限制时,会抛出此异常。(由Georg Brandl在issue 19235中提供。)

CPython改进实现:

  • LC_TYPE语言代码是POSIX语言代码(C语言代码),sys.stdinsys.stdout surrogateescape错误处理程序,而不是strict错误处理程序。(由Victor Stinner在issue 19977中提供。)
  • .pyo文件已不再使用,并已被包含.pyc名称中明确显示的优化级别的更灵活的方案替换。(参见PEP 488 overview。)
  • 内置和扩展模块现在在多阶段过程中初始化,这与Python模块的加载方式类似。(参见PEP 489 overview。)

对标准程序库有以下几方面的显著改善:

安全改进:

  • SSLv3现在在标准库中已禁用。仍然可以通过手动实例化ssl.SSLContext启用。(有关更多详细信息,请参阅issue 22638;此更改已反向运行到CPython 3.4和2.7.)
  • HTTP cookie解析现在更加严格,以防止潜在的注入攻击。(由Antoine Pitrou在issue 22796中提供。)

Windows用户的福音:

  • 用于Windows的新安装程序已替换旧的MSI。有关详细信息,请参阅在Windows上使用Python
  • 现在在 Windows 下使用 Microsoft Visual C++ 14.0 构建,扩展模块此时应同步跟进。

请阅读面向用户的更改的完整列表,包括许多其他较小的改进,CPython优化,弃用和潜在的移植问题。

新特征

PEP 492 - 具有async和await语法的协同程序。

PEP 492 通过添加 awaitable objects, coroutine functions, asynchronous iteration, 和 asynchronous context managers大大的提高了PYTHON的异步编程.

协程函数使用新的async def语法声明:

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

在协程函数内,新的await表达式可用于暂停协程执行,直到结果可用。任何对象可以等待,只要通过定义__await__()方法实现awaitable协议即可。

PEP 492还为 t>语句添加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 forasync with 只能在 async def 定义的协程函数的内部使用.

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

注意

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

有关详细信息,请参见Asynchronous Iterators文档部分。

也可以看看

PEP 492 - 具有async和await语法的协程
PEP由Yury Selivanov编写和实施。

PEP 465 - 用于矩阵乘法的专用中缀操作符

PEP 465为矩阵乘法添加了@ infix操作符号。目前,没有内置的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编写;由本杰明·彼得森执行。

PEP 448 - Additional Unpacking Generalizations

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

类似地,元组,列表,集合和字典显示允许多个解压缩(参见Expression listsDictionary 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}

也可以看看

PEP 448 - 附加拆分广义
PEP由Joshua Landau编写;由Neil Girdhar,Thomas Wouters和Joshua Landau执行。

PEP 461 - percent formatting support for bytes and bytearray

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' / t5> '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
PEP由Ethan Furman编写;由Neil Schemenauer和Ethan Furman执行。

PEP 484 - Type Hints

函数注释语法自版本3.0( PEP 3107)起就是一个Python特性,但是注释的语义未定义。

经验表明,大多数函数注解使用都是为函数参数和返回值提供类型提示。很明显,如果标准库包括类型注释的基本定义和工具,这对Python用户将是有益的。

PEP 484引入了provisional module来提供这些标准定义和工具,以及注解不可用的情况的一些约定。

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

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

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

类型系统支持联合,通用类型和名为Any的特殊类型,它与(即可分配到和来自)所有类型。

也可以看看

  • typing模块文档

  • PEP 484 - 类型提示

    PEP由Guido van Rossum,Jukka Lehtosalo和ŁukaszLanga编写;由Guido van Rossum执行。

  • PEP 483 - 类型提示的理论

    PEP由Guido van Rossum写

PEP 471 - os.scandir() function – a better and faster directory iterator

PEP 471向标准库添加了一个新的目录迭代函数os.scandir()此外,os.walk()现在使用scandir实现,这使得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: Retry system calls failing with EINTR

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

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

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

print("Hello World")

和:

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

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

以下是由信号中断时重试的函数列表:

也可以看看

PEP 475 - 使用EINTR重试系统调用失败
PEP和执行由Charles-FrançoisNatali和Victor Stinner在Antoine Pitrou(法语连接)的帮助下编写。

PEP 479: Change StopIteration handling inside generators

生成器和StopIteration在Python 3.4和更早版本中的交互有时是令人惊讶的,并且可以隐藏模糊的错误。以前,生成器函数内意外引发的StopIteration被解释为驱动生成器的循环结构的迭代结束。

PEP 479更改生成器的行为:当在生成器内引发StopIteration异常时,它将替换为RuntimeError,然后退出生成器框架。此更改的主要目标是在未受保护的next()调用引发StopIteration并导致由生成器控制的迭代以静默方式终止的情况下,轻松调试。这与产生 构造结合是特别有害的。

这是向后不兼容的更改,因此要启用新行为,必须执行__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

如果未在生成器中引发StopIteration异常,则未引入__future__导入,将会引发PendingDeprecationWarning

也可以看看

PEP 479 - 更改生成器内的StopIteration处理
PEP由Chris Angelico和Guido van Rossum写。由Chris Angelico,Yury Selivanov和Nick Coghlan执行。

PEP 485: A function for testing approximate equality

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: Make the Python Launcher aware of virtual environments

PEP 486使Windows启动程序(请参阅 PEP 397)了解活动虚拟环境。当使用默认解释器并设置了VIRTUAL_ENV环境变量时,将使用虚拟环境中的解释器。

也可以看看

PEP 486 - 让Python Launcher知道虚拟环境
PEP由Paul Moore编写和实施。

PEP 488: Elimination of PYO files

PEP 488取消了.pyo文件的概念。这意味着.pyc文件表示未优化和优化的字节码。为了防止需要不断重新生成字节码文件,.pyc文件在字节码优化时现在有一个可选的opt-标签。当在-O-OO下运行时,会出现不再有字节码文件名冲突的副作用。因此,从-O-OO生成的字节码文件现在可以同时存在。importlib.util.cache_from_source()具有更新的API,可帮助进行此更改。

也可以看看

PEP 488 - 删除PYO文件
PEP由Brett Cannon编写和实施。

PEP 489: Multi-phase extension module initialization

PEP 489更新扩展模块初始化,以利用Python中 PEP 451引入的两步模块加载机制3.4。

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

也可以看看

PEP 489 - 多阶段扩展模块初始化
PEP由Petr Viktorin,Stefan Behnel和Nick Coghlan编写;由Petr Viktorin执行。

Other Language Changes

核心Python语言的一些较小的更改是:

  • 添加了"namereplace"错误处理程序。"backslashreplace"错误处理程序现在可以解码和翻译。(由Serhiy Storchaka在问题19676问题22286提供)。
  • -b选项现在影响bytesint的比较。(由Serhiy Storchaka在issue 23681中提供。)
  • 新哈萨克语kz1048和Tajik koi8_t codecs(由Serhiy Storchaka在issue 22682发出22681提供)。
  • 属性文档字符串现在是可写的。这对于collections.namedtuple()文档字符串特别有用。(由Berker Peksag提供在issue 24064。)
  • 现在支持涉及相对进口的循环进口。(由Brett Cannon和Antoine Pitrou在问题17636提供。)

New Modules

typing

新的typing provisional模块为函数类型注释提供了标准定义和工具。有关详细信息,请参阅Type Hints

zipapp

新的zipapp模块(在 PEP 441中指定)提供了用于创建可执行Python Zip应用程序的API和命令行工具2.6在问题1739468,但是没有很好地宣传,无论是在当时或从那时。

使用新模块,绑定应用程序就像将所有文件(包括__main__.py文件)放入目录myapp

$ python -m zipapp myapp
$ python myapp.pyz

模块实现由Paul Moore在问题23491中提供。

也可以看看

PEP 441 - 改进Python ZIP应用程序支持

Improved Modules

argparse

ArgumentParser类现在允许通过将allow_abbrev设置为False来禁用长选项的abbreviated usage(供稿人:Jonathan Paugh,Steven Bethard,paul j3和Daniel Eriksson在问题14910。)

asyncio

由于asyncio模块是provisional,所以Python 3.5中引入的所有更改也已反向运行到Python 3.4.x.

从Python 3.4.0起,asyncio模块中的显着变化:

3.5.1中的更新:

3.5.2中的更新:

bz2

BZ2Decompressor.decompress方法现在接受可选的max_length参数,以限制解压缩数据的最大大小。(由Nikolaus Rath在issue 15955中提供。)

cgi

FieldStorage类现在支持context manager协议。(由Berker Peksag提供,载于第20289期。)

cmath

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

code

InteractiveInterpreter.showtraceback()方法现在可以打印完整链接的追溯,就像交互式解释器一样。(Contributed by Claudiu Popa in issue 17442。)

collections

OrderedDict类现在在C中实现,这使得它的4到100倍更快。(由 span> 问题16991提供。)

OrderedDict.items()OrderedDict.keys()OrderedDict.values()查看现在支持reversed()(由Serhiy Storchaka在issue 19505中提供。)

The deque class now defines index(), insert(), and copy(), and supports the + and * operators. 这允许将deques识别为MutableSequence并且提高它们对列表的可替换性。(由Raymond Hettinger在issue 23704中提供。)

现在可以更新namedtuple()生成的Docstring:

Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coodinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'

(由Berker Peksag提供在issue 24064。)

UserString类现在实现__getnewargs__()__rmod__()casefold()format_map()isprintable()maketrans()方法匹配str(由Joe Jevnik提供,载于issue 22189。)

collections.abc

The Sequence.index() method now accepts start and stop arguments to match the corresponding methods of tuple, list, etc. (供稿人:Devin Jeanpierre in issue 23086。)

一个新的Generator抽象基类。(由Stefan Behnel在问题24018中提供。)

新的AwaitableCoroutineAsyncIteratorAsyncIterable抽象基类。(由Yury Selivanov在issue 24184提供。)

对于早期的Python版本,外部PyPI包中提供了新ABCs的反向端口。

compileall

新的compileall选项-j N允许同时运行N执行并行字节码编译。compile_dir()函数具有相应的workers参数。(Contributed by Claudiu Popa in issue 16104。)

另一个新选项-r允许控制子目录的最大递归级别。(Contributed by Claudiu Popa in issue 19628。)

现在可以多次指定-q命令行选项,在这种情况下,所有输出(包括错误)都将被抑制。compile_dir()compile_file()compile_path()中的相应quiet参数现在可以接受整数表示输出抑制电平的值。(Contributed by Thomas Kluyver in issue 21338。)

concurrent.futures

Executor.map()方法现在接受chunksize参数,以允许批量处理任务,以提高使用ProcessPoolExecutor()时的性能。(由Dan O'Reilly在问题11271中提供。)

ThreadPoolExecutor构造函数中的工人数现在是可选的。默认值为CPU数量的5倍。(Contributed by Claudiu Popa in issue 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']

(由ŁukaszLanga提供,issue 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提供在issue 22389。)

csv

writerow()方法现在支持任意迭代,而不仅仅是序列。(由Serhiy Storchaka提供在issue 23171。)

curses

update_lines_cols()函数更新 LINES COLS环境变量。这对于检测手动屏幕调整大小很有用。(由Arnon Yaari在issue 4254中提供。)

dbm

dumb.open在标记值为"n"时始终创建新数据库。(Contributed by Claudiu Popa in issue 18039。)

difflib

HtmlDiff.make_file()生成的HTML文档的字符集现在可以使用新的字符集关键字参数进行自定义。HTML文档的默认字符集从"ISO-8859-1"更改为"utf-8"(由Berker Peksag提供在issue 2052。)

diff_bytes()函数现在可以比较字节字符串列表。这修复了Python 2的回归。(由Terry J.Reedy和Greg Ward在issue 17445中提供。)

distutils

buildbuild_ext命令现在接受一个-j选项,以启用扩展模块的并行构建。(由Antoine Pitrou在发行5309提供。)

distutils模块现在支持xz压缩,并且可以通过将xztar作为参数传递到bdist t8 > - format(由Serhiy Storchaka提供在issue 16314。)

doctest

如果模块不包含docstrings,而不是提高ValueErrorDocTestSuite()函数将返回空的unittest.TestSuite(供稿人:Glenn Jones in issue 15916。)

email

新的政策选项Policy.mangle_from_控制在电子邮件正文中以“From 开头的行是否生成器以前缀为">"字符。对于所有其他策略,默认值为compat32FalseTrue(由Milan Oberkirch在issue 20098提供。)

新的Message.get_content_disposition()方法可以方便地访问Content-Disposition标题的规范值。(由Abhilash Raj撰写,问题21083。)

可以将新的策略选项EmailPolicy.utf8设置为True,使用UTF-8字符集而不是使用编码字对电子邮件标头进行编码。这允许Messages根据 RFC 6532格式化,并与支持 RFC 6531 SMTPUTF8扩展。(由R. David Murray提供,issue 24211。)

mime.text.MIMEText构造函数现在接受charset.Charset实例。(由Claude Paroz和Berker Peksag提供,载于issue 16324。)

enum

如果只提供名称Enum callable有一个新参数start指定枚举值的初始值:

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

(由Ethan Furman在问题21706提供。)

faulthandler

enable()register()dump_traceback()dump_traceback_later()(由Wei Wu在issue 23566提供。)

functools

大多数lru_cache()机制现在在C中实现,使其显着更快。(由Matt Joiner,Alexey Kachayev和Serhiy Storchaka在问题14373提供。)

glob

iglob()glob()现在支持使用"**"模式在子目录中进行递归搜索。(由Serhiy Storchaka在问题13968中提供。)

gzip

GzipFile构造函数的mode参数现在接受"x"以请求独占创建。(由Tim Heaney在issue 19222中提供。)

heapq

Element comparison in merge() can now be customized by passing a key function in a new optional key keyword argument, and a new optional reverse keyword argument can be used to reverse element comparison:

>>> 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在issue 13742中提供。)

http

新的HTTPStatus枚举,用于定义一组以英文书写的HTTP状态代码,原因短语和详细说明。(由Demian Brecht在问题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在issue 3566中提供。)

idlelib and IDLE

由于idlelib实现了IDLE shell和编辑器,并且不打算由其他程序导入,因此每个版本都会得到改进。请参见Lib/idlelib/NEWS.txt查看自3.4.0以来的更改的累积列表,以及在将来的3.5.x版本中所做的更改。此文件也可从IDLE 帮助‣关于IDLE对话框中获取。

imaplib

IMAP4类现在支持context manager协议。当在with语句中使用时,IMAP4 LOGOUT命令将在块结束时自动调用。(由TarekZiadé和Serhiy Storchaka在issue 4972提供。)

imaplib模块现在支持 RFC 5161(ENABLE扩展)和 RFC 6855 UTF-8支持)通过IMAP4.enable()方法。新的IMAP4.utf8_enabled属性会跟踪是否启用 RFC 6855支持。(由Milan Oberkirch,R.David Murray和Maciej Szulik提供,在问题21800。)

imaplib模块现在根据RFC建议,使用UTF-8自动编码非ASCII字符串用户名和密码。(由Milan Oberkirch提供在issue 21800。)

imghdr

what()函数现在识别OpenEXR格式(由Martin Vignali和Claudiu Popa在问题20295中提供)和WebP 格式(由Fabrice Aneche和Claudiu Popa在20197年版中提供)。

importlib

util.LazyLoader类允许在启动时间很重要的应用程序中延迟加载模块。(由Brett Cannon在issue 17621中提供。)

abc.InspectLoader.source_to_code()方法现在是一个静态方法。这样,通过运行exec(code, module .__ dict __),可以更容易地初始化包含从字符串编译的代码的模块对象。(由Brett Cannon在问题21156提供。)

新的util.module_from_spec()函数现在是创建新模块的首选方法。与直接创建types.ModuleType实例相反,此新函数将基于传入的spec对象设置各种导入控制的属性。(由Brett Cannon在issue 20383中提供。)

inspect

SignatureParameter类现在是可拾取和哈希的。(由Yury Selivanov在问题20726问题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在issue 24190提供。)

新类方法Signature.from_callable()使得Signature的子类化更容易。(由Yury Selivanov和Eric Snow在问题17373提供)。

signature()函数现在接受follow_wrapped可选关键字参数,当设置为False时,禁用__wrapped__(由Yury Selivanov在问题20691提供。)

A set of new functions to inspect coroutine functions and coroutine objects has been added: iscoroutine(), iscoroutinefunction(), isawaitable(), getcoroutinelocals(), and getcoroutinestate(). (由Yury Selivanov在发行24017发行24400提供)。

stack()trace()getouterframes()getinnerframes()(由Daniel Shahaf在issue 16808中提供。)

io

新的BufferedIOBase.readinto1()方法最多使用对底层原始流RawIOBase.read()RawIOBase.readinto()(由Nikolaus Rath在issue 20578中提供。)

ipaddress

IPv4NetworkIPv6Network类现在接受(地址, 网络掩码)参数,以便轻松地从现有地址构造网络对象:

>>> 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提供,载于问题16531。)

IPv4NetworkIPv6Network类的新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'

(Contributed by Leon Weber in issue 20480。)

json

json.tool命令行界面现在保留在输入中传递的JSON对象中键的顺序。新的--sort-keys选项可用于按字母顺序对键进行排序。(由Berker Peksag提供,载于issue 21650。)

JSON解码器现在引发JSONDecodeError而不是ValueError,以提供有关错误的更好的上下文信息。(由Serhiy Storchaka在issue 19361中提供。)

linecache

新的lazycache()函数可用于捕获有关非基于文件的模块的信息,以允许稍后通过getline()获取其行。这避免了做I / O直到实际需要一行,而不必无限地携带模块全局变量。(由Robert Collins在问题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édricKrier在issue 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在issue 20537中提供。)

handlers.HTTPHandler类现在接受可选的ssl.SSLContext实例来配置在HTTP连接中使用的SSL设置。(由 P> 发行22788提供的Alex Gaynor。)

handlers.QueueListener类现在采用respect_handler_level关键字参数,如果设置为True,则会将消息传递给处理程序,并将处理程序级别考虑在内。(供稿人:Vinay Sajip。)

lzma

LZMADecompressor.decompress()方法现在接受可选的max_length参数,以限制解压缩数据的最大大小。(由Martin Panter在发行15955提供。)

math

math模块中添加了两个新常数:infnan(由Mark Dickinson在issue 23185中提供。)

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

已添加了一个新的gcd()函数。fractions.gcd()函数现已不推荐使用。(由Mark Dickinson和Serhiy Storchaka在issue 22486中提供。)

multiprocessing

sharedctypes.synchronized()对象现在支持context manager协议。(由Charles-FrançoisNatali在问题21565提供。)

operator

attrgetter()itemgetter()methodcaller()现在支持pickling。(由Josh Rosenberg和Serhiy Storchaka在问题22955提供。)

新的matmul()imatmul()函数执行矩阵乘法。(由Benjamin Peterson在issue 21176中提供。)

os

添加了返回DirEntry对象的迭代器的新scandir()函数。如果可能,scandir()在扫描目录时提取文件属性,无需执行后续系统调用以确定文件类型或属性,这可以显着提高性能。(由Ben Hoyt在Victor Stinner的帮助下,在issue 22524中提供。)

在Windows上,新的stat_result.st_file_attributes属性现在可用。它对应于由GetFileInformationByHandle()返回的BY_HANDLE_FILE_INFORMATION结构的dwFileAttributes成员。(由Ben Hoyt在问题21719中提供。)

The urandom() function now uses the getrandom() syscall on Linux 3.17 or newer, and getentropy() on OpenBSD 5.6 and newer, removing the need to use /dev/urandom and avoiding failures due to potential file descriptor exhaustion. (由Victor Stinner在issue 22181发表。)

get_blocking()set_blocking()函数允许获取和设置文件描述器的阻塞模式(O_NONBLOCK。)(由Victor Stinner在issue 22054中提供。)

Windows上现在支持truncate()ftruncate()函数。(由Steve Dower撰写,第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在issue 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提供,载于issue 19775。)

Path.mkdir()方法现在接受一个新的可选exists_ok参数以匹配mkdir -p os.makedirs()功能。(由Berker Peksag提供在issue 21539。)

有一个新的Path.expanduser()方法来展开~~user前缀。(由Serhiy Storchaka和Claudiu Popa提供,issue 19776。)

新的Path.home()类方法可用于获取表示用户主目录的Path实例。(Contributed by Victor Salgado and Mayank Tripathi in issue 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在issue 20218中提供。)

pickle

嵌套对象(例如未绑定方法或嵌套类)现在可以使用协议版本4之前的pickle protocols进行选择。协议版本4已经支持这些情况。(由Serhiy Storchaka在issue 23611中提供。)

poplib

如果POP服务器支持,则新的POP3.utf8()命令启用 RFC 6856(国际化电子邮件)支持。(供稿人:Milan OberKirch在issue 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提供在issue 9179。)

正则表达式中的捕获组的数量不再限于100。(由Serhiy Storchaka在issue 22437中提供。)

sub()subn()现在用空字符串替换未匹配的组,而不是引发异常。(由Serhiy Storchaka提供在issue 1519638。)

The re.error exceptions have new attributes, msg, pattern, pos, lineno, and colno, that provide better context information about the error:

>>> re.compile("""
...     (?x)
...     .++
... """)
Traceback (most recent call last):
   ...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)

(由Serhiy Storchaka在issue 22578中提供。)

readline

可以使用新的append_history_file()函数将历史中指定数量的拖尾元素附加到给定文件。(由Bruno Cauet在issue 22940提供。)

selectors

新的DevpollSelector支持在Solaris上进行高效的/dev/poll轮询。(由Giampaolo Rodola在issue 18931中提供。)

shutil

The move() function now accepts a copy_function argument, allowing, for example, the copy() function to be used instead of the default copy2() if there is a need to ignore file metadata when moving.(Contributed by Claudiu Popa in issue 19840。)

make_archive()函数现在支持xztar格式。(由Serhiy Storchaka在issue 5411中提供。)

signal

在Windows上,set_wakeup_fd()函数现在也支持套接字句柄。(由Victor Stinner在issue 22018中提供。)

signal模块中的各种SIG*常量已转换为Enums这允许在调试期间打印有意义的名称,而不是整数“魔术数字”。(由Giampaolo Rodola在问题21076提供。)

smtpd

Both the SMTPServer and SMTPChannel classes now accept a decode_data keyword argument to determine if the DATA portion of the SMTP transaction is decoded using the "utf-8" codec or is instead provided to the SMTPServer.process_message() method as a byte string. 出于向后兼容性的原因,默认值为True,但会在Python 3.6中更改为False如果decode_data设置为False,则必须准备process_message方法接受关键字参数。(由Maciej Szulik在issue 19662提供。)

SMTPServer类现在通告8BITMIME扩展( RFC 6152),如果decode_data已设置为True如果客户端在MAIL命令上指定BODY=8BITMIME,则通过mail_options传递到SMTPServer.process_message()(由Milan Oberkirch和R. David Murray提供,载于问题21795。)

SMTPServer类现在还支持SMTPUTF8扩展( RFC 6531:国际化电子邮件)。如果客户端在MAIL命令上指定SMTPUTF8 BODY = 8BITMIME,则会将它们传递到SMTPServer.process_message()通过mail_options关键字。正确处理SMTPUTF8数据是process_message方法的责任。(由Milan Oberkirch提供,载于issue 21725。)

现在可以直接或通过名称解析在SMTPServer构造函数中提供IPv6地址,并使其成功连接。(供稿人:Milan Oberkirch在issue 14758。)

smtplib

新的SMTP.auth()方法提供了实现自定义认证机制的便捷方法。(由Milan Oberkirch提供,载于issue 15014。)

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

SMTP.sendmail()SMTP.send_message()方法现在支持 RFC 6531(SMTPUTF8)。(由Milan Oberkirch和R. David Murray提供,载于issue 22027。)

sndhdr

what()whathdr()函数现在返回一个namedtuple()(Contributed by Claudiu Popa in issue 18615。)

socket

具有超时的函数现在使用单调时钟,而不是系统时钟。(由Victor Stinner在issue 22043中提供。)

新的socket.sendfile()方法允许通过使用UNIX上的高性能os.sendfile()函数在套接字上发送文件,导致上传从2比使用简单socket.send()快3倍。(由Giampaolo Rodola在issue 17552提供。)

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

socket.listen()方法的backlog参数现在是可选的。默认情况下,它设置为SOMAXCONN128,取较小值。(由Charles-FrançoisNatali在问题21455提供。)

ssl

Memory BIO Support

(由Geert Jansen在issue 21965中提供。)

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

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

可以使用新的SSLContext.wrap_bio()方法创建新的SSLObject实例。

Application-Layer Protocol Negotiation Support

(由Benjamin Peterson在20188年版提供。)

在存在OpenSSL支持的情况下,ssl模块现在实现应用层协议协商 t> TLS扩展,如 RFC 7301

新的SSLContext.set_alpn_protocols()可用于指定套接字在TLS握手期间应通告哪些协议。

新的SSLSocket.selected_alpn_protocol()返回在TLS握手期间选择的协议。HAS_ALPN标志指示是否存在ALPN支持。

Other Changes

有一个新的SSLSocket.version()方法来查询实际使用的协议版本。(由Antoine Pitrou在issue 20421中提供。)

SSLSocket类现在实现了一个SSLSocket.sendfile()方法。(由Giampaolo Rodola在issue 17552提供。)

SSLSocket.send()方法现在在非阻塞套接字上引入ssl.SSLWantReadErrorssl.SSLWantWriteError异常块。以前,它将返回0(由Nikolaus Rath在问题20951中提供。)

cert_time_to_seconds()函数现在根据 RFC 5280将输入时间解释为UTC,而不是本地时间。此外,返回值始终为int(由Akira Li在issue 19940中提供。)

新的SSLObject.shared_ciphers()SSLSocket.shared_ciphers()方法返回客户端在握手期间发送的密码列表。(由Benjamin Peterson在第23186期提供。)

The SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown(), and SSLSocket.write() methods of the SSLSocket class no longer reset the socket timeout every time bytes are received or sent. 套接字超时现在是方法的最大总持续时间。(由Victor Stinner在发行23853提供。)

match_hostname()函数现在支持IP地址的匹配。(由Antoine Pitrou在issue 23239提供。)

sqlite3

Row类现在完全支持序列协议,特别是reversed()迭代和片索引。(Contributed by Claudiu Popa in issue 10203;由Lucas Sinclair,Jessica McKellar和Serhiy Storchaka在问题13583中提供。)

subprocess

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

A new set_coroutine_wrapper() function allows setting a global hook that will be called whenever a coroutine object is created by an async def function. 相应的get_coroutine_wrapper()可用于获取当前设置的包装器。这两个函数都是provisional,仅用于调试目的。(由Yury Selivanov在issue 24017中提供。)

新的is_finalizing()函数可用于检查Python解释器是否shutting down(由Antoine Pitrou提供,载于issue 22696。)

sysconfig

Windows上的用户脚本目录的名称现在包括Python版本的前两个组件。(Paul Moore在issue 23437中提供。)

tarfile

open()函数的模式参数现在接受"x"以请求独占创建。(由Berker Peksag提供在issue 21717。)

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

TarFile.list()现在接受可选的成员关键字参数,可以设置为TarFile.getmembers()(由Serhiy Storchaka提供在issue 21549。)

threading

Lock.acquire()RLock.acquire()方法现在使用单调时钟进行超时管理。(由Victor Stinner在issue 22043中提供。)

time

monotonic()函数现在始终可用。(由Victor Stinner在issue 22043中提供。)

timeit

新的命令行选项-u - unit = U可用于指定时间单位定时器输出。支持的选项为usecmsecsec(由Julian Gindi在issue 18983中提供。)

timeit()函数有一个新的全局参数,用于指定代码将在其中运行的命名空间。(由Ben Roberts在issue 2527中提供。)

tkinter

用于在Windows上设置Tcl / Tk环境的tkinter._fix模块已被_tkinter模块中的私有函数替代,该模块不会永久更改环境变量。(由Zachary Ware在issue 20035中提供。)

traceback

walk_stack()walk_tb()函数可方便地遍历框架和回溯对象。(由Robert Collins在问题17911中提供。)

新的轻量级类:TracebackExceptionStackSummaryFrameSummary(由Robert Collins在问题17911中提供。)

print_tb()print_stack()函数现在支持limit参数的负值。(Contributed by Dmitry Kazakov in issue 22619。)

types

用于将generatorgenerator-like对象转换为awaitables的新coroutine()函数。(由Yury Selivanov在issue 24017中提供。)

A new type called CoroutineType, which is used for coroutine objects created by async def functions. (由Yury Selivanov提供在issue 24400。)

unicodedata

unicodedata模块现在使用来自Unicode 8.0.0的数据。

unittest

TestLoader.loadTestsFromModule()方法现在接受作为第三个参数传递给load_tests的仅关键字参数模式发现的包现在检查load_tests,无论它们的路径是否与模式匹配,因为包名称不能匹配默认模式。(由Robert Collins和Barry A. Warsaw提供,载于issue 16662。)

单元测试发现错误现在显示在TestLoader实例的TestLoader.errors属性中。(由Robert Collins在issue 19746中提供。)

新的命令行选项--locals用于在traceback中显示局部变量。(由Robert Collins在issue 22936中提供。)

unittest.mock

Mock类具有以下改进:

MagicMock类现在支持__truediv__()__divmod__()__matmul__()运算符。(由Johannes Baiter在问题20968和HåkanLövdahl在发行23581发行23568提供。)

在修补内置名称时,不再需要将create=True明确传递给patch()函数。(由Kushal Das提供,问题17660。)

urllib

A new request.HTTPPasswordMgrWithPriorAuth class allows HTTP Basic Authentication credentials to be managed so as to eliminate unnecessary 401 response handling, or to unconditionally send credentials on the first request in order to communicate with servers that return a 404 response instead of a 401 if the Authorization header is not sent. (由Matej Cepl在issue 19494和Akshit Khurana在问题7159中提供。)

parse.urlencode()函数的新quote_via参数提供了一种控制查询部分的编码的方法。(由Samwyse和Arnon Yaari在issue 13866中提供。)

request.urlopen()函数接受ssl.SSLContext对象作为上下文参数,将用于HTTPS连接。(由 P> 问题22366提供的Alex Gaynor。)

parse.urljoin()更新为使用 RFC 3986语义解析相对网址,而不是 t6 > RFC 1808 RFC 2396(由Demian Brecht和Senthil Kumaran在issue 22118提供。)

wsgiref

headers.Headers类构造函数的参数现在是可选的。(由Pablo Torres Navarrete和SilentGhost在issue 5800中提供。)

xmlrpc

client.ServerProxy类现在支持context manager协议。(Contributed by Claudiu Popa in issue 20627。)

client.ServerProxy构造函数现在接受可选的ssl.SSLContext实例。(由 P> 第22960号提供的Alex Gaynor。)

xml.sax

SAX解析器现在支持xmlreader.InputSource对象的字符流。(由Serhiy Storchaka在issue 2175中提供。)

parseString()现在接受str实例。(由Serhiy Storchaka在issue 10590中提供。)

zipfile

ZIP输出现在可以写入不可搜索的流。(由Serhiy Storchaka在issue 23252中提供。)

ZipFile.open()方法的模式参数现在接受"x"以请求独占创建。(由Serhiy Storchaka在问题21717中提供。)

Other module-level changes

mmapossaudiodevsocketsslcodecs模块中的许多功能现在接受可写的bytes-like objects(由Serhiy Storchaka在issue 23001中提供。)

Optimizations

在POSIX系统上,os.walk()的速度提高了3到5倍,在Windows上提高了7到20倍。这是使用新的os.scandir()函数完成的,该函数暴露来自底层readdirFindFirstFile / FindNextFile(由Ben Hoyt在Victor Stinner的帮助下在问题23605中提供。)

bytes(int)(由零字节填充)的构造更快,对大对象使用更少的内存。使用calloc()代替malloc()为这些对象分配内存。(由Victor Stinner在问题21233提供。)

ipaddress IPv4NetworkIPv6Network上的某些操作已大规模升级,例如subnets()supernet()summarize_address_range()collapse_addresses()加速可以从3到15倍。(由Antoine Pitrou,Michel Albert和Markus在问题21486 t>,发出21487发出20826发出23266 t3 >。)

ipaddress对象的腌制进行了优化,以产生显着更小的输出。(由Serhiy Storchaka在issue 23133提供。)

io.BytesIO上的许多操作现在快50%至100%。(由Serhiy Storchaka在issue 15381和David Wilson在问题22003中提供。)

marshal.dumps()函数现在更快:版本3和4为65-85%,典型数据为20-25%,版本0-2,最佳情况下最多为5次。(由Serhiy Storchaka在问题20416发布23344提供)。

UTF-32编码器现在的速度是3到7倍。(由Serhiy Storchaka在issue 15027中提供。)

正则表达式现在可以快速解析10%。(由Serhiy Storchaka在issue 19380中提供。)

json.dumps()函数优化为使用ensure_ascii=False运行,与ensure_ascii=True一样快。(由Naoki Inada在问题23206提供。)

在第二个参数具有type作为其元类的常见情况下,PyObject_IsInstance()PyObject_IsSubclass()(Contributed Georg Brandl by in issue 22540。)

方法缓存略有改进,在一些基准测试中可提高5%的性能提升。(由Antoine Pitrou在issue 22847中提供。)

来自random模块的对象现在在64位构建上使用50%的内存。(由Serhiy Storchaka提供在issue 23488。)

property() getter调用速度提高了25%。(由Joe Jevnik在issue 23910中提供。)

实例化fractions.Fraction现在的速度提高了30%。(由Stefan Behnel在issue 22464中提供)。

String methods find(), rfind(), split(), partition() and the in string operator are now significantly faster for searching 1-character substrings. (由Serhiy Storchaka在issue 23573中提供。)

Build and C API Changes

添加了新calloc功能:

(由Victor Stinner在问题21233提供。)

新的编码/解码助手功能:

(由Victor Stinner在发行18395提供。)

新的PyCodec_NameReplaceErrors()函数用\N{...}转义替换unicode编码错误。(由Serhiy Storchaka在issue 19676中提供。)

PyErr_Format()类似的新PyErr_FormatV()函数,但接受va_list参数。(由Antoine Pitrou在问题18711提供。)

新的PyExc_RecursionError异常。(由Georg Brandl在issue 19235中提供。)

New PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2(), and PyModule_ExecDef() functions introduced by PEP 489 – multi-phase extension module initialization. (供稿人:Petr Viktorin,issue 24268。)

PyNumber_MatrixMultiply()PyNumber_InPlaceMatrixMultiply()用于执行矩阵乘法。(由Benjamin Peterson在问题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> is always linux-gnu, except for extensions built to talk to the 32-bit ABI on 64-bit platforms, in which case it is linux-gnu32 (and <architecture> will be x86_64).
  • 在Windows上,扩展模块文件名以<debug>.cp<major><minor>-<platform>.pyd
    • <major>是Python版本的主要编号;对于Python 3.5,这是3
    • <minor>是Python版本的次要编号;对于Python 3.5,这是5
    • <platform> is the platform the extension module was built for, either win32 for Win32, win_amd64 for Win64, win_ia64 for Windows Itanium 64, and win_arm for Windows on ARM.
    • 如果内置在调试模式下,<debug>将为_d,否则为空。
  • 在OS X平台上,扩展模块文件名现在以-darwin.so结尾。
  • 在所有其他平台上,扩展模块文件名与Python 3.4相同。

Deprecated

New Keywords

asyncawait不推荐用作变量,类,函数或模块名称。在Python 3.5中由 PEP 492引入,它们将成为Python 3.7中的正确关键字。

Deprecated Python Behavior

在生成器中提升StopIteration异常现在将生成一个无声的PendingDeprecationWarning,它将在Python 3.6中成为非静默的弃用警告,并将触发RuntimeError有关详细信息,请参阅PEP 479: Change StopIteration handling inside generators中的更改StopIteration处理。

Unsupported Operating Systems

Microsoft不再支持Windows XP,因此,根据 PEP 11,此操作系统不再正式支持CPython 3.5。

Deprecated Python modules, functions and methods

formatter模块现在已经完全弃用,并且仍然可以在Python 3.6中删除。

不建议使用asyncio.async()函数,而使用ensure_future()

smtpd模块在过去总是使用utf-8编解码器解码电子邮件的DATA部分。现在可以通过SMTPServer的新decode_data关键字控制。默认值为True,但此默认值已弃用。使用适当的值指定decode_data关键字,以避免弃用警告。

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

将格式字符串作为关键字参数format_string传递到string.Formatter类的format()方法已被弃用。(由Serhiy Storchaka在issue 23671中提供。)

The platform.dist() and platform.linux_distribution() functions are now deprecated. Linux发行版使用太多不同的方式描述自己,所以功能留给包。(由Vajrasky Kok和Berker Peksag提供,载于第1322期。)

已弃用inspect.Signature的以前未记录的from_functionfrom_builtin方法。请改用新的Signature.from_callable()方法。(由Yury Selivanov在issue 24248提供。)

inspect.getargspec()函数已弃用,计划在Python 3.6中删除。(有关详情,请参阅issue 20438)。

The inspect getfullargspec(), getargvalues(), getcallargs(), getargvalues(), formatargspec(), and formatargvalues() functions are deprecated in favor of the inspect.signature() API. (由Yury Selivanov在issue 20438提供。)

使用带有str模式或re.ASCIIre.LOCALE标志现已不推荐使用。(由Serhiy Storchaka在issue 22407中提供。)

在正则表达式模式和替换模式中使用由'\'组成的无法识别的特殊序列和ASCII字母引发弃用警告,并将在Python 3.6中禁止。(由Serhiy Storchaka在issue 23622中提供。)

现在,不再推荐并忽略unittest.TestLoader.loadTestsFromModule()方法的未记录和非正式的use_load_tests默认参数。(由Robert Collins和Barry A. Warsaw提供,载于issue 16662。)

Removed

API and Feature Removals

以下已过时且以前已弃用的API和特征已删除:

  • 已从电子邮件包中删除__version__属性。电子邮件代码长时间未从stdlib单独发运,并且在最近几个版本中未更新__version__字符串。
  • ftplib模块中的内部Netrc类在3.4中已弃用,现在已被删除。(由Matt Chaput在issue 6623中提供。)
  • .pyo文件的概念已删除。
  • 临时asyncio模块中的JoinableQueue类已在3.4.4中被弃用,现在已被删除。(由A. Jesse Jiryu Davis在issue 23464中提供。)

Porting to Python 3.5

本节列出了之前描述的更改和其他可能需要更改代码的错误。

Changes in Python behavior

  • 由于监督,早期的Python版本错误地接受以下语法:

    f(1 for x in [1], *args)
    f(1 for x in [1], **kwargs)
    

    Python 3.5现在正确引用了一个SyntaxError,因为生成器表达式必须放在括号中,如果不是函数的唯一参数。

Changes in the Python API

  • PEP 475:如果Python信号处理程序不引发异常,系统调用现在在信号中断时重试,而不是提高InterruptedError
  • 在Python 3.5之前,如果某个datetime.time对象表示UTC的午夜,则该对象被视为false。这个行为被认为是晦涩和容易出错,已在Python 3.5中删除。有关详细信息,请参见问题13936
  • ssl.SSLSocket.send()方法现在在非阻塞套接字上引入ssl.SSLWantReadErrorssl.SSLWantWriteError块。以前,它将返回0(由Nikolaus Rath在问题20951中提供。)
  • 生成器的__name__属性现在从函数名称设置,而不是从代码名称设置。使用gen.gi_code.co_name检索代码名称。生成器还具有新的__qualname__属性,限定名,现在用于生成器(repr(gen))的表示。(由Victor Stinner在问题21205提供。)
  • 已删除过时的“严格”模式和参数HTMLParserHTMLParser.error()HTMLParserError异常。(由Ezio Melotti在issue 15114中提供。)默认情况下,HTMLParserconvert_charrefs参数现在为True(由Berker Peksag提供在issue 21047。)
  • 虽然它不是API的正式组成部分,但是值得注意的是移植目的(即:修复测试)以前的形式“'sometype'的错误消息不支持缓冲区协议”现在的形式“a bytes-like object是必需的,而不是'sometype'“。(由Ezio Melotti在问题16518中提供。)
  • If the current directory is set to a directory that no longer exists then FileNotFoundError will no longer be raised and instead find_spec() will return None without caching None in sys.path_importer_cache, which is different than the typical case (issue 22834).
  • 来自http.clienthttp.server的HTTP状态代码和邮件已重构为常见的HTTPStatus枚举。http.clienthttp.server中的值仍然可用于向后兼容。(由Demian Brecht在问题21793提供。)
  • 当导入加载器定义importlib.machinery.Loader.exec_module()时,现在希望还定义create_module()(引用DeprecationWarning ,将在Python 3.6中出现错误)。如果加载器继承自importlib.abc.Loader,则无需做任何事情,否则只需定义create_module()返回None(由Brett Cannon在issue 23014中提供。)
  • re.split()函数总是忽略空模式匹配,因此"x*"模式与"x+" "\b"模式从未工作过。现在re.split()如果模式可以匹配空字符串,则引发警告。为了兼容性,请使用从不匹配空字符串的模式。"x+"而不是"x*")。只能匹配空字符串(如"\b")的模式现在引发错误。(由Serhiy Storchaka在issue 22818中提供。)
  • http.cookies.Morsel类字符接口已经自我一致:morsel比较现在将keyvalue纳入考虑,copy()现在会导致Morsel实例而不是dict,并且update()此外,set()的未记录的LegalChars参数已被弃用,现在被忽略。(由Demian Brecht在issue 2211中提供。)
  • PEP 488 has removed .pyo files from Python and introduced the optional opt- tag in .pyc file names. importlib.util.cache_from_source()已获得优化参数,以帮助控制opt-标记。因此,函数的debug_override参数现在已被弃用。.pyo文件也不再支持作为Python解释器的文件参数,因此当它们自己分发时不起作用。无源代码分布)。由于字节码的幻数在Python 3.5中已经改变,所以来自以前版本的Python的所有旧的.pyo文件都是无效的,与此PEP无关。
  • socket模块现在在linux 3.6及更高版本上导出CAN_RAW_FD_FRAMES常量。
  • ssl.cert_time_to_seconds()函数现在根据 RFC 5280将输入时间解释为UTC,而不是本地时间。此外,返回值始终为int(由Akira Li在issue 19940中提供。)
  • pygettext.py工具现在在POT-Creation-Date标题中使用标准的+ NNNN格式的时区。
  • smtplib模块现在使用sys.stderr而不是以前的模块级stderr变量来进行调试输出。如果您的(测试)程序依赖于修补模块级变量来捕获调试输出,则需要更新它以捕获sys.stderr。
  • 在找到空字符串且索引完全不在时,str.startswith()str.endswith()方法不再返回True范围。(由Serhiy Storchaka在issue 24284提供。)
  • inspect.getdoc()函数现在返回从基类继承的文档字符串。如果继承的文档是合适的,则不再需要重复文档字符串。要抑制继承的字符串,必须指定一个空字符串(或者可以填写文档)。此更改会影响pydoc模块和help()函数的输出。(由Serhiy Storchaka提供在issue 15582。)
  • 嵌套的functools.partial()调用现在已展开。如果您依赖于之前的行为,现在可以向functools.partial()对象添加属性,也可以创建functools.partial()的子类。(由Alexander Belopolsky提供,issue 7830。)

Changes in the C API

  • 已删除(非公共)PyMemoryViewObject结构的未记录的format成员。必须重新构建依赖于memoryobject.h中相关部分的所有扩展。
  • PyMemAllocator结构重命名为PyMemAllocatorEx并添加了新的calloc字段。
  • 删除了泄露引用的未记录的宏PyObject_REPRUse format character %R in PyUnicode_FromFormat()-like functions to format the repr() of the object. (由Serhiy Storchaka在issue 22453中提供。)
  • 因为缺少__module__属性会中断pickling和introspection,现在针对没有__module__属性的内置类型提出了弃用警告。这将是一个AttributeError在未来。(由Serhiy Storchaka在发行20204中提供。)
  • 作为 PEP 492实现的一部分,PyTypeObjecttp_reserved槽替换为tp_as_async有关新类型,结构和函数,请参阅Coroutine Objects