> **Источник:** https://python-all.ru/3.7/whatsnew/3.5.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Что нового в Python 3.5

**Редакторы**

Elvis Pranskevichus \<[elvis@magic.io](https://python-all.ru/3.7/whatsnew/3.5.html)\>, Yury Selivanov \<[yury@magic.io](https://python-all.ru/3.7/whatsnew/3.5.html)\>

Эта статья рассказывает о новых возможностях Python 3.5 по сравнению с версией 3.4. Python 3.5 был выпущен 13 сентября 2015 года. Полный список изменений можно найти в [журнале изменений](https://python-all.ru/3.5/whatsnew/changelog.html).

> **См. также**
>
> [**PEP 478**](https://python-all.ru/3.7/whatsnew/3.5.html) – График выпуска Python 3.5

## Итоги – основные изменения

Новые синтаксические возможности:

- [PEP 492](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-492), корутины с синтаксисом async и await.
- [PEP 465](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-465), новый оператор умножения матриц: `a @ b`.
- [PEP 448](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-448), дополнительные обобщения распаковки.

Новые модули библиотеки:

- [`typing`](https://python-all.ru/3.7/library/typing.html#module-typing): [PEP 484 – Аннотации типов](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-484).
- [`zipapp`](https://python-all.ru/3.7/library/zipapp.html#module-zipapp): [PEP 441 – Улучшение поддержки ZIP-приложений Python](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-zipapp).

Новые встроенные возможности:

- `bytes % args`, `bytearray % args`: [PEP 461](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-461) – Добавление форматирования `%` для bytes и bytearray.
- Новые методы [`bytes.hex()`](https://python-all.ru/3.7/library/stdtypes.html#bytes.hex), [`bytearray.hex()`](https://python-all.ru/3.7/library/stdtypes.html#bytearray.hex) и [`memoryview.hex()`](https://python-all.ru/3.7/library/stdtypes.html#memoryview.hex). (Автор: Arnon Yaari в [bpo-9951](https://python-all.ru/3.7/whatsnew/3.5.html).)
- [`memoryview`](https://python-all.ru/3.7/library/stdtypes.html#memoryview) теперь поддерживает индексацию кортежей (включая многомерную). (Автор: Antoine Pitrou в [bpo-23632](https://python-all.ru/3.7/whatsnew/3.5.html).)
- У генераторов появился новый атрибут `gi_yieldfrom`, который возвращает объект, итерируемый выражениями `yield from`. (Авторы: Benno Leslie и Yury Selivanov в [bpo-24450](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Теперь при достижении максимальной глубины рекурсии возбуждается новое исключение [`RecursionError`](https://python-all.ru/3.7/library/exceptions.html#RecursionError). (Автор: Georg Brandl в [bpo-19235](https://python-all.ru/3.7/whatsnew/3.5.html).)

Улучшения реализации CPython:

- Когда `LC_TYPE` локаль является локалью POSIX (`C` локаль), [`sys.stdin`](https://python-all.ru/3.7/library/sys.html#sys.stdin) и [`sys.stdout`](https://python-all.ru/3.7/library/sys.html#sys.stdout) теперь используют обработчик ошибок `surrogateescape`, вместо обработчика ошибок `strict`. (Автор: Victor Stinner в [bpo-19977](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Файлы `.pyo` больше не используются; вместо них используется более гибкая схема, которая явно включает уровень оптимизации в имя `.pyc`. (См. [обзор PEP 488](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-488).)
- Встроенные модули и модули расширений теперь инициализируются в многофазном процессе, аналогичном загрузке модулей Python. (См. [обзор PEP 489](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-489).)

Значительные улучшения в стандартной библиотеке:

- [`collections.OrderedDict`](https://python-all.ru/3.7/library/collections.html#collections.OrderedDict) is now [implemented in C](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-ordereddict), which makes it 4 to 100 times faster.
- The [`ssl`](https://python-all.ru/3.7/library/ssl.html#module-ssl) module gained [support for Memory BIO](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-sslmemorybio), which decouples SSL protocol handling from network IO.
- The new [`os.scandir()`](https://python-all.ru/3.7/library/os.html#os.scandir) function provides a [better and significantly faster way](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-471) of directory traversal.
- [`functools.lru_cache()`](https://python-all.ru/3.7/library/functools.html#functools.lru_cache) has been mostly [reimplemented in C](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-lrucache), yielding much better performance.
- The new [`subprocess.run()`](https://python-all.ru/3.7/library/subprocess.html#subprocess.run) function provides a [streamlined way to run subprocesses](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-subprocess).
- The [`traceback`](https://python-all.ru/3.7/library/traceback.html#module-traceback) module has been significantly [enhanced](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-traceback) for improved performance and developer convenience.

Улучшения в области безопасности:

- SSLv3 теперь отключён во всей стандартной библиотеке. Его можно включить, вручную создав экземпляр [`ssl.SSLContext`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLContext). (Подробнее см. [bpo-22638](https://python-all.ru/3.7/whatsnew/3.5.html); это изменение было перенесено в CPython 3.4 и 2.7.)
- Разбор HTTP-куки теперь выполняется более строго для защиты от потенциальных атак внедрения. (Предложено Антуаном Питу в [bpo-22796](https://python-all.ru/3.7/whatsnew/3.5.html).)

Улучшения для Windows:

- A new installer for Windows has replaced the old MSI. See [Using Python on Windows](https://python-all.ru/3.7/using/windows.html#using-on-windows) for more information.
- Сборки для Windows теперь используют Microsoft Visual C++ 14.0, и модули расширения должны использовать ту же версию.

Читайте далее полный список изменений, влияющих на пользователей, включая множество других небольших улучшений, оптимизаций CPython, устаревших возможностей и потенциальных проблем при переносе.

## Новые возможности

### PEP 492 – Корутины с синтаксисом async и await

[**PEP 492**](https://python-all.ru/3.7/whatsnew/3.5.html) greatly improves support for asynchronous programming in Python by adding [awaitable objects](https://python-all.ru/3.7/glossary.html#term-awaitable), [coroutine functions](https://python-all.ru/3.7/glossary.html#term-coroutine-function), [asynchronous iteration](https://python-all.ru/3.7/glossary.html#term-asynchronous-iterable), and [asynchronous context managers](https://python-all.ru/3.7/glossary.html#term-asynchronous-context-manager).

Корутинные функции объявляются с помощью нового синтаксиса [`async def`](https://python-all.ru/3.7/reference/compound_stmts.html#async-def):

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

Inside a coroutine function, the new [`await`](https://python-all.ru/3.7/reference/expressions.html#await) expression can be used to suspend coroutine execution until the result is available. Any object can be *awaited*, as long as it implements the [awaitable](https://python-all.ru/3.7/glossary.html#term-awaitable) protocol by defining the [`__await__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__await__) method.

PEP 492 также добавляет оператор [`async for`](https://python-all.ru/3.7/reference/compound_stmts.html#async-for) для удобной итерации по асинхронным итерируемым объектам.

Пример простейшего HTTP-клиента, написанного с использованием нового синтаксиса:

```python
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()
```

По аналогии с асинхронной итерацией существует новый синтаксис для асинхронных контекстных менеджеров. Следующий скрипт:

```python
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()
```

выведет:

```python
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`](https://python-all.ru/3.7/reference/compound_stmts.html#async-for), и [`async with`](https://python-all.ru/3.7/reference/compound_stmts.html#async-with) можно использовать только внутри корутинной функции, объявленной с [`async def`](https://python-all.ru/3.7/reference/compound_stmts.html#async-def).

Coroutine functions are intended to be run inside a compatible event loop, such as the [asyncio loop](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio-event-loop).

> **Примечание**
>
> Changed in version 3.5.2: Starting with CPython 3.5.2, `__aiter__` can directly return [asynchronous iterators](https://python-all.ru/3.7/glossary.html#term-asynchronous-iterator). Returning an [awaitable](https://python-all.ru/3.7/glossary.html#term-awaitable) object will result in a [`PendingDeprecationWarning`](https://python-all.ru/3.7/library/exceptions.html#PendingDeprecationWarning).
>
> See more details in the [Asynchronous Iterators](https://python-all.ru/3.7/reference/datamodel.html#async-iterators) documentation section.

> **См. также**
>
> **[**PEP 492**](https://python-all.ru/3.7/whatsnew/3.5.html) – Coroutines with async and await syntax**
>
> PEP написан и реализован Юрием Селивановым.

### PEP 465 – Выделенный инфиксный оператор для умножения матриц

[**PEP 465**](https://python-all.ru/3.7/whatsnew/3.5.html) добавляет инфиксный оператор `@` для умножения матриц. В настоящее время ни один встроенный тип Python не реализует новый оператор, однако его можно реализовать, определив [`__matmul__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__matmul__), [`__rmatmul__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__rmatmul__) и [`__imatmul__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__imatmul__) для обычного, отражённого и матричного умножения с присваиванием. Семантика этих методов аналогична методам, определяющим другие инфиксные арифметические операторы.

Умножение матриц – особенно распространённая операция во многих областях математики, науки и техники, и добавление `@` позволяет писать более чистый код:

```python
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
```

вместо:

```python
S = dot((dot(H, beta) - r).T,
        dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
```

NumPy 1.10 поддерживает новый оператор:

```python
>>> 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**](https://python-all.ru/3.7/whatsnew/3.5.html) – Специализированный инфиксный оператор для матричного умножения**
>
> PEP написан Натаниэлем Дж. Смитом; реализован Бенджамином Петерсоном.

### PEP 448 – Дополнительные обобщения распаковки

[**PEP 448**](https://python-all.ru/3.7/whatsnew/3.5.html) расширяет допустимые способы применения `*` оператора распаковки итерируемых объектов и `**` оператора распаковки словарей. Теперь можно использовать произвольное количество распаковок в [вызовах функций](https://python-all.ru/3.7/reference/expressions.html#calls):

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

Аналогично, литералы кортежей, списков, множеств и словарей допускают множественную распаковку (см. [Списки выражений](https://python-all.ru/3.7/reference/expressions.html#exprlists) и [Литералы словарей](https://python-all.ru/3.7/reference/expressions.html#dict)):

```python
>>> *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**](https://python-all.ru/3.7/whatsnew/3.5.html) – Дополнительные обобщения распаковки**
>
> PEP написан Джошуа Ландау; реализован Нилом Гирдхаром, Томасом Воутерсом и Джошуа Ландау.

### PEP 461 – поддержка процентного форматирования для bytes и bytearray

[**PEP 461**](https://python-all.ru/3.7/whatsnew/3.5.html) добавляет поддержку `%` [оператора интерполяции](https://python-all.ru/3.7/library/stdtypes.html#bytes-formatting) для [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.7/library/stdtypes.html#bytearray).

Хотя интерполяция обычно считается строковой операцией, существуют случаи, когда интерполяция для `bytes` или `bytearrays` имеет смысл, и работа, необходимая для восполнения отсутствующей функциональности, снижает общую читаемость кода. Эта проблема особенно актуальна при работе с протоколами формата передачи данных, которые часто представляют собой смесь двоичных и ASCII-совместимых текстов.

Примеры:

```python
>>> 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')`):

```python
>>> 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**](https://python-all.ru/3.7/whatsnew/3.5.html) – Добавление % форматирования для bytes и bytearray**
>
> PEP написан Итаном Фурманом; реализован Нилом Шеменауэром и Итаном Фурманом.

### PEP 484 – Подсказки типов

Синтаксис аннотаций функций является возможностью Python начиная с версии 3.0 ([**PEP 3107**](https://python-all.ru/3.7/whatsnew/3.5.html)), однако семантика аннотаций оставалась неопределённой.

Опыт показал, что большинство случаев использования аннотаций функций сводилось к предоставлению подсказок типов для параметров функций и возвращаемых значений. Стало очевидно, что для пользователей Python было бы полезно, если бы стандартная библиотека включала базовые определения и инструменты для аннотаций типов.

[**PEP 484**](https://python-all.ru/3.7/whatsnew/3.5.html) вводит [временный модуль](https://python-all.ru/3.7/glossary.html#term-provisional-api) для предоставления этих стандартных определений и инструментов, а также некоторые соглашения для ситуаций, когда аннотации недоступны.

Например, вот простая функция, тип аргумента и возвращаемое значение которой объявлены в аннотациях:

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

Хотя эти аннотации доступны во время выполнения через обычный атрибут `__annotations__`, *автоматическая проверка типов во время выполнения не производится*. Вместо этого предполагается, что для анализа исходного кода по запросу будет использоваться отдельный внешний статический анализатор (например, [mypy](https://python-all.ru/3.7/whatsnew/3.5.html)).

Система типов поддерживает объединения, обобщённые типы и специальный тип с именем [`Any`](https://python-all.ru/3.7/library/typing.html#typing.Any), который совместим (т.е. может быть присвоен любому типу и любой тип может быть присвоен ему) со всеми типами.

> **См. также**
>
> - [`typing`](https://python-all.ru/3.7/library/typing.html#module-typing) документация модуля
> - **[**PEP 484**](https://python-all.ru/3.7/whatsnew/3.5.html) – Подсказки типов**
>
>   PEP написан Гвидо ван Россумом, Юккой Лехтосало и Лукашем Лангой; реализован Гвидо ван Россумом.
> - **[**PEP 483**](https://python-all.ru/3.7/whatsnew/3.5.html) – Теория подсказок типов**
>
>   PEP написан Гвидо ван Россумом

### PEP 471 – функция os.scandir() – лучший и более быстрый итератор каталогов

[**PEP 471**](https://python-all.ru/3.7/whatsnew/3.5.html) добавляет новую функцию итерации по каталогам, [`os.scandir()`](https://python-all.ru/3.7/library/os.html#os.scandir), в стандартную библиотеку. Кроме того, [`os.walk()`](https://python-all.ru/3.7/library/os.html#os.walk) теперь реализована с помощью `scandir`, что делает её в 3-5 раз быстрее в системах POSIX и в 7-20 раз быстрее в системах Windows. Это достигается в основном за счёт значительного сокращения количества вызовов [`os.stat()`](https://python-all.ru/3.7/library/os.html#os.stat), необходимых для обхода дерева каталогов.

Кроме того, `scandir` возвращает итератор, а не список имён файлов, что повышает эффективность использования памяти при итерации по очень большим каталогам.

Следующий пример показывает простое использование [`os.scandir()`](https://python-all.ru/3.7/library/os.html#os.scandir) для отображения всех файлов (за исключением каталогов) в заданном *пути*, которые не начинаются с `'.'`. Вызов [`entry.is_file()`](https://python-all.ru/3.7/library/os.html#os.DirEntry.is_file) обычно не выполняет дополнительного системного вызова:

```python
for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)
```

> **См. также**
>
> **[**PEP 471**](https://python-all.ru/3.7/whatsnew/3.5.html) – функция os.scandir() – более качественный и быстрый итератор каталогов**
>
> PEP написан и реализован Беном Хойтом (Ben Hoyt) при содействии Виктора Стиннера (Victor Stinner).

### PEP 475: Повтор системных вызовов, завершающихся с EINTR

Код ошибки [`errno.EINTR`](https://python-all.ru/3.7/library/errno.html#errno.EINTR) возвращается всякий раз, когда системный вызов, ожидающий ввода-вывода, прерывается сигналом. Ранее в таких случаях Python возбуждал [`InterruptedError`](https://python-all.ru/3.7/library/exceptions.html#InterruptedError). Это означало, что при написании приложения на Python у разработчика было два варианта:

1. Игнорировать `InterruptedError`.
2. Обрабатывать `InterruptedError` и пытаться перезапустить прерванный системный вызов в каждом месте вызова.

Первый вариант приводит к перемежающимся сбоям приложения. Второй вариант добавляет большое количество шаблонного кода, делающего код почти нечитаемым. Сравните:

```python
print("Hello World")
```

и:

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

[**PEP 475**](https://python-all.ru/3.7/whatsnew/3.5.html) реализует автоматический повтор системных вызовов при `EINTR`. Это снимает необходимость обработки `EINTR` или [`InterruptedError`](https://python-all.ru/3.7/library/exceptions.html#InterruptedError) в пользовательском коде в большинстве ситуаций и делает программы Python, включая стандартную библиотеку, более надёжными. Обратите внимание, что системный вызов повторяется, только если обработчик сигнала не возбуждает исключение.

Ниже приведён список функций, которые теперь повторяются при прерывании сигналом:

- [`open()`](https://python-all.ru/3.7/library/functions.html#open) и [`io.open()`](https://python-all.ru/3.7/library/io.html#io.open);
- функции модуля [`faulthandler`](https://python-all.ru/3.7/library/faulthandler.html#module-faulthandler);
- функции [`os`](https://python-all.ru/3.7/library/os.html#module-os): [`fchdir()`](https://python-all.ru/3.7/library/os.html#os.fchdir), [`fchmod()`](https://python-all.ru/3.7/library/os.html#os.fchmod), [`fchown()`](https://python-all.ru/3.7/library/os.html#os.fchown), [`fdatasync()`](https://python-all.ru/3.7/library/os.html#os.fdatasync), [`fstat()`](https://python-all.ru/3.7/library/os.html#os.fstat), [`fstatvfs()`](https://python-all.ru/3.7/library/os.html#os.fstatvfs), [`fsync()`](https://python-all.ru/3.7/library/os.html#os.fsync), [`ftruncate()`](https://python-all.ru/3.7/library/os.html#os.ftruncate), [`mkfifo()`](https://python-all.ru/3.7/library/os.html#os.mkfifo), [`mknod()`](https://python-all.ru/3.7/library/os.html#os.mknod), [`open()`](https://python-all.ru/3.7/library/os.html#os.open), [`posix_fadvise()`](https://python-all.ru/3.7/library/os.html#os.posix_fadvise), [`posix_fallocate()`](https://python-all.ru/3.7/library/os.html#os.posix_fallocate), [`pread()`](https://python-all.ru/3.7/library/os.html#os.pread), [`pwrite()`](https://python-all.ru/3.7/library/os.html#os.pwrite), [`read()`](https://python-all.ru/3.7/library/os.html#os.read), [`readv()`](https://python-all.ru/3.7/library/os.html#os.readv), [`sendfile()`](https://python-all.ru/3.7/library/os.html#os.sendfile), [`wait3()`](https://python-all.ru/3.7/library/os.html#os.wait3), [`wait4()`](https://python-all.ru/3.7/library/os.html#os.wait4), [`wait()`](https://python-all.ru/3.7/library/os.html#os.wait), [`waitid()`](https://python-all.ru/3.7/library/os.html#os.waitid), [`waitpid()`](https://python-all.ru/3.7/library/os.html#os.waitpid), [`write()`](https://python-all.ru/3.7/library/os.html#os.write), [`writev()`](https://python-all.ru/3.7/library/os.html#os.writev);
- особые случаи: [`os.close()`](https://python-all.ru/3.7/library/os.html#os.close) и [`os.dup2()`](https://python-all.ru/3.7/library/os.html#os.dup2) теперь игнорируют ошибки [`EINTR`](https://python-all.ru/3.7/library/errno.html#errno.EINTR); системный вызов не повторяется (за обоснованием обратитесь к PEP);
- функции [`select`](https://python-all.ru/3.7/library/select.html#module-select): [`devpoll.poll()`](https://python-all.ru/3.7/library/select.html#select.devpoll.poll), [`epoll.poll()`](https://python-all.ru/3.7/library/select.html#select.epoll.poll), [`kqueue.control()`](https://python-all.ru/3.7/library/select.html#select.kqueue.control), [`poll.poll()`](https://python-all.ru/3.7/library/select.html#select.poll.poll), [`select()`](https://python-all.ru/3.7/library/select.html#select.select);
- методы класса [`socket`](https://python-all.ru/3.7/library/socket.html#socket.socket): [`accept()`](https://python-all.ru/3.7/library/socket.html#socket.socket.accept), [`connect()`](https://python-all.ru/3.7/library/socket.html#socket.socket.connect) (кроме неблокирующих сокетов), [`recv()`](https://python-all.ru/3.7/library/socket.html#socket.socket.recv), [`recvfrom()`](https://python-all.ru/3.7/library/socket.html#socket.socket.recvfrom), [`recvmsg()`](https://python-all.ru/3.7/library/socket.html#socket.socket.recvmsg), [`send()`](https://python-all.ru/3.7/library/socket.html#socket.socket.send), [`sendall()`](https://python-all.ru/3.7/library/socket.html#socket.socket.sendall), [`sendmsg()`](https://python-all.ru/3.7/library/socket.html#socket.socket.sendmsg), [`sendto()`](https://python-all.ru/3.7/library/socket.html#socket.socket.sendto);
- [`signal.sigtimedwait()`](https://python-all.ru/3.7/library/signal.html#signal.sigtimedwait) и [`signal.sigwaitinfo()`](https://python-all.ru/3.7/library/signal.html#signal.sigwaitinfo);
- [`time.sleep()`](https://python-all.ru/3.7/library/time.html#time.sleep).

> **См. также**
>
> **[**PEP 475**](https://python-all.ru/3.7/whatsnew/3.5.html) – Повтор системных вызовов, завершающихся с EINTR**
>
> PEP и реализация написаны Шарлем-Франсуа Натали (Charles-François Natali) и Виктором Стиннером (Victor Stinner) при содействии Антуана Питру (Antoine Pitrou) (французское звено).

### PEP 479: Изменение обработки StopIteration внутри генераторов

Взаимодействие генераторов и [`StopIteration`](https://python-all.ru/3.7/library/exceptions.html#StopIteration) в Python 3.4 и более ранних версиях иногда было неожиданным и могло скрывать трудноуловимые ошибки. Ранее `StopIteration`, случайно возбуждённое внутри генераторной функции, интерпретировалось конструкцией цикла, управляющего генератором, как окончание итерации.

[**PEP 479**](https://python-all.ru/3.7/whatsnew/3.5.html) изменяет поведение генераторов: когда внутри генератора возбуждается исключение `StopIteration`, оно заменяется на [`RuntimeError`](https://python-all.ru/3.7/library/exceptions.html#RuntimeError) перед выходом из фрейма генератора. Основная цель этого изменения – упростить отладку в ситуации, когда незащищённый вызов [`next()`](https://python-all.ru/3.7/library/functions.html#next) возбуждает `StopIteration` и приводит к молчаливому завершению итерации, управляемой генератором. Это особенно опасно в сочетании с конструкцией `yield from`.

Это обратно несовместимое изменение, поэтому для включения нового поведения необходим импорт [\_\_future\_\_](https://python-all.ru/3.7/glossary.html#term-future):

```python
>>> 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__` будет возбуждаться [`PendingDeprecationWarning`](https://python-all.ru/3.7/library/exceptions.html#PendingDeprecationWarning) всякий раз, когда внутри генератора возбуждается исключение [`StopIteration`](https://python-all.ru/3.7/library/exceptions.html#StopIteration).

> **См. также**
>
> **[**PEP 479**](https://python-all.ru/3.7/whatsnew/3.5.html) – Изменение обработки StopIteration внутри генераторов**
>
> PEP написан Крисом Анжелико (Chris Angelico) и Гвидо ван Россумом (Guido van Rossum). Реализован Крисом Анжелико, Юрием Селивановым и Ником Когланом (Nick Coghlan).

### PEP 485: Функция для проверки приблизительного равенства

[**PEP 485**](https://python-all.ru/3.7/whatsnew/3.5.html) добавляет функции [`math.isclose()`](https://python-all.ru/3.7/library/math.html#math.isclose) и [`cmath.isclose()`](https://python-all.ru/3.7/library/cmath.html#cmath.isclose), которые определяют, являются ли два значения приблизительно равными или «близкими» друг к другу. Решение о том, считаются ли два значения близкими, принимается на основе заданных абсолютного и относительного допусков. Относительный допуск – это максимально допустимая разница между аргументами `isclose`, относительно большего абсолютного значения:

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

Также можно сравнивать два значения с использованием абсолютного допуска, который должен быть неотрицательным:

```python
>>> 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**](https://python-all.ru/3.7/whatsnew/3.5.html) – Функция для проверки приблизительного равенства**
>
> PEP написан Кристофером Баркером (Christopher Barker); реализован Крисом Баркером (Chris Barker) и Талем Эйнатом (Tal Einat).

### PEP 486: Обучить средство запуска Python работе с виртуальными окружениями

[**PEP 486**](https://python-all.ru/3.7/whatsnew/3.5.html) обучает средство запуска Windows (см. [**PEP 397**](https://python-all.ru/3.7/whatsnew/3.5.html)) распознавать активное виртуальное окружение. Когда используется интерпретатор по умолчанию и установлена переменная окружения `VIRTUAL_ENV`, будет использоваться интерпретатор из виртуального окружения.

> **См. также**
>
> **[**PEP 486**](https://python-all.ru/3.7/whatsnew/3.5.html) – Обучить средство запуска Python работе с виртуальными окружениями**
>
> PEP написан и реализован Полом Муром.

### PEP 488: Устранение PYO файлов

[**PEP 488**](https://python-all.ru/3.7/whatsnew/3.5.html) отменяет понятие файлов `.pyo`. Это означает, что файлы `.pyc` теперь представляют как неоптимизированный, так и оптимизированный байткод. Чтобы избежать необходимости постоянно перегенерировать файлы байткода, файлы `.pyc` теперь имеют необязательную метку `opt-` в имени, когда байткод оптимизирован. Побочным эффектом является отсутствие конфликтов имен файлов байткода при запуске под [`-O`](https://python-all.ru/3.7/using/cmdline.html#cmdoption-o) или [`-OO`](https://python-all.ru/3.7/using/cmdline.html#cmdoption-oo). Следовательно, файлы байткода, сгенерированные из [`-O`](https://python-all.ru/3.7/using/cmdline.html#cmdoption-o) и [`-OO`](https://python-all.ru/3.7/using/cmdline.html#cmdoption-oo), теперь могут существовать одновременно. [`importlib.util.cache_from_source()`](https://python-all.ru/3.7/library/importlib.html#importlib.util.cache_from_source) имеет обновлённый API для поддержки этого изменения.

> **См. также**
>
> **[**PEP 488**](https://python-all.ru/3.7/whatsnew/3.5.html) – Устранение PYO файлов**
>
> PEP написан и реализован Бреттом Кэнноном.

### PEP 489: Многофазная инициализация модулей расширения

[**PEP 489**](https://python-all.ru/3.7/whatsnew/3.5.html) обновляет инициализацию модулей расширения, чтобы использовать двухэтапный механизм загрузки модулей, введённый [**PEP 451**](https://python-all.ru/3.7/whatsnew/3.5.html) в Python 3.4.

Это изменение делает семантику импорта модулей расширения, которые opt-in используют новый механизм, гораздо ближе к семантике модулей исходного кода и байткода Python, включая возможность использовать любой допустимый идентификатор в качестве имени модуля, а не ограничиваться ASCII.

> **См. также**
>
> **[**PEP 489**](https://python-all.ru/3.7/whatsnew/3.5.html) – Многофазная инициализация модуля расширения**
>
> PEP написан Петром Викториным, Стефаном Бенелем и Ником Когленом; реализован Петром Викториным.

## Прочие изменения языка

Некоторые небольшие изменения, внесённые в ядро языка Python:

- Добавлены обработчики ошибок `"namereplace"`. Обработчики ошибок `"backslashreplace"` теперь работают с декодированием и трансляцией. (Предоставлено Серхием Сторчакой в [bpo-19676](https://python-all.ru/3.7/whatsnew/3.5.html) и [bpo-22286](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Опция [`-b`](https://python-all.ru/3.7/using/cmdline.html#cmdoption-b) теперь влияет на сравнения [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes) с [`int`](https://python-all.ru/3.7/library/functions.html#int). (Предоставлено Серхием Сторчакой в [bpo-23681](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Новые казахские `kz1048` и таджикские `koi8_t` [кодеки](https://python-all.ru/3.7/library/codecs.html#standard-encodings). (Предоставлено Серхием Сторчакой в [bpo-22682](https://python-all.ru/3.7/whatsnew/3.5.html) и [bpo-22681](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Докстринги свойств теперь доступны для записи. Это особенно полезно для докстрингов [`collections.namedtuple()`](https://python-all.ru/3.7/library/collections.html#collections.namedtuple). (Предоставлено Беркером Пексагом в [bpo-24064](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Теперь поддерживаются циклические импорты, включающие относительные импорты. (Предоставлено Бреттом Кэнноном и Антуаном Питру в [bpo-17636](https://python-all.ru/3.7/whatsnew/3.5.html).)

## Новые модули

### typing

Новый [`typing`](https://python-all.ru/3.7/library/typing.html#module-typing) [временный](https://python-all.ru/3.7/glossary.html#term-provisional-api) модуль предоставляет стандартные определения и инструменты для аннотаций типов функций. См. [Type Hints](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-484) для получения дополнительной информации.

### zipapp

Новый модуль [`zipapp`](https://python-all.ru/3.7/library/zipapp.html#module-zipapp) (указанный в [**PEP 441**](https://python-all.ru/3.7/whatsnew/3.5.html)) предоставляет API и инструмент командной строки для создания исполняемых Python Zip-приложений, которые были введены в Python 2.6 в [bpo-1739468](https://python-all.ru/3.7/whatsnew/3.5.html), но не были широко известны ни тогда, ни после.

С новым модулем упаковка приложения сводится к помещению всех файлов, включая файл `__main__.py`, в каталог `myapp` и запуску:

```console
$ python -m zipapp myapp
$ python myapp.pyz
```

Реализация модуля предоставлена Полом Муром в [bpo-23491](https://python-all.ru/3.7/whatsnew/3.5.html).

> **См. также**
>
> [**PEP 441**](https://python-all.ru/3.7/whatsnew/3.5.html) – Улучшение поддержки Python ZIP-приложений

## Улучшенные модули

### argparse

Класс [`ArgumentParser`](https://python-all.ru/3.7/library/argparse.html#argparse.ArgumentParser) теперь позволяет отключать [сокращённое использование](https://python-all.ru/3.7/library/argparse.html#prefix-matching) длинных опций, установив [allow\_abbrev](https://python-all.ru/3.7/library/argparse.html#allow-abbrev) в `False`. (Предоставлено Джонатаном Пофом, Стивеном Бетардом, paul j3 и Даниэлем Эрикссоном в [bpo-14910](https://python-all.ru/3.7/whatsnew/3.5.html).)

### asyncio

Поскольку модуль [`asyncio`](https://python-all.ru/3.7/library/asyncio.html#module-asyncio) является [временным](https://python-all.ru/3.7/glossary.html#term-provisional-api), все изменения, введённые в Python 3.5, также были перенесены в Python 3.4.x.

Заметные изменения в модуле [`asyncio`](https://python-all.ru/3.7/library/asyncio.html#module-asyncio) начиная с Python 3.4.0:

- Новые API для отладки: методы [`loop.set_debug()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.set_debug) и [`loop.get_debug()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.get_debug). (Предоставлено Виктором Стиннером.)
- Proactor-цикл событий теперь поддерживает SSL. (Предоставлено Антуаном Питру и Виктором Стиннером в [bpo-22560](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Новый метод [`loop.is_closed()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.is_closed) для проверки, закрыт ли цикл событий. (Предоставлено Виктором Стиннером в [bpo-21326](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Новый [`loop.create_task()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.create_task) для удобного создания и планирования нового [`Task`](https://python-all.ru/3.7/library/asyncio-task.html#asyncio.Task) для корутины. Метод `create_task` также используется всеми функциями asyncio, которые оборачивают корутины в задачи, такими как [`asyncio.wait()`](https://python-all.ru/3.7/library/asyncio-task.html#asyncio.wait), [`asyncio.gather()`](https://python-all.ru/3.7/library/asyncio-task.html#asyncio.gather) и т.д. (Предоставлено Виктором Стиннером.)
- Новый [`transport.get_write_buffer_limits()`](https://python-all.ru/3.7/library/asyncio-protocol.html#asyncio.WriteTransport.get_write_buffer_limits) метод для запроса *верхнего* и *нижнего* порогов управления потоком. (Предложено Виктором Стиннером.)
- Функция `async()` устарела в пользу [`ensure_future()`](https://python-all.ru/3.7/library/asyncio-future.html#asyncio.ensure_future). (Предложено Юрием Селивановым.)
- Новые методы [`loop.set_task_factory()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.set_task_factory) и [`loop.get_task_factory()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.get_task_factory) для настройки фабрики задач, используемой методом [`loop.create_task()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.create_task). (Предложено Юрием Селивановым.)
- Новые [`Queue.join()`](https://python-all.ru/3.7/library/asyncio-queue.html#asyncio.Queue.join) и [`Queue.task_done()`](https://python-all.ru/3.7/library/asyncio-queue.html#asyncio.Queue.task_done) методы очереди. (Предложено Виктором Стиннером.)
- Класс `JoinableQueue` был удалён в пользу класса [`asyncio.Queue`](https://python-all.ru/3.7/library/asyncio-queue.html#asyncio.Queue). (Предложено Виктором Стиннером.)

Обновления в версии 3.5.1:

- Функция [`ensure_future()`](https://python-all.ru/3.7/library/asyncio-future.html#asyncio.ensure_future) и все функции, которые её используют, такие как [`loop.run_until_complete()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.run_until_complete), теперь принимают все виды [ожидаемых объектов](https://python-all.ru/3.7/glossary.html#term-awaitable). (Автор: Yury Selivanov.)
- Новая функция [`run_coroutine_threadsafe()`](https://python-all.ru/3.7/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) для отправки корутин в циклы событий из других потоков. (Автор: Vincent Michel.)
- Новый метод [`Transport.is_closing()`](https://python-all.ru/3.7/library/asyncio-protocol.html#asyncio.BaseTransport.is_closing) для проверки, закрывается ли транспорт или уже закрыт. (Автор: Yury Selivanov.)
- Метод [`loop.create_server()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.create_server) теперь может принимать список хостов. (Автор: Yann Sionneau.)

Обновления в версии 3.5.2:

- Новый метод [`loop.create_future()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.create_future) для создания объектов Future. Это позволяет альтернативным реализациям цикла событий, таким как [uvloop](https://python-all.ru/3.7/whatsnew/3.5.html), предоставлять более быструю реализацию [`asyncio.Future`](https://python-all.ru/3.7/library/asyncio-future.html#asyncio.Future). (Предложено Юрием Селивановым.)
- Новый метод [`loop.get_exception_handler()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.get_exception_handler) для получения текущего обработчика исключений. (Предложено Юрием Селивановым.)
- Новый метод [`StreamReader.readuntil()`](https://python-all.ru/3.7/library/asyncio-stream.html#asyncio.StreamReader.readuntil) для чтения данных из потока до появления последовательности байтов-разделителей. (Автор: Mark Korenberg.)
- Методы [`loop.create_connection()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.create_connection) и [`loop.create_server()`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.create_server) оптимизированы, чтобы избежать вызова системной функции `getaddrinfo`, если адрес уже разрешён. (Предложено А. Джесси Джирю Дэвисом.)
- [`loop.sock_connect(sock, address)`](https://python-all.ru/3.7/library/asyncio-eventloop.html#asyncio.loop.sock_connect) больше не требует разрешения *адреса* перед вызовом. (Предложено А. Джесси Джирю Дэвисом.)

### bz2

Метод [`BZ2Decompressor.decompress`](https://python-all.ru/3.7/library/bz2.html#bz2.BZ2Decompressor.decompress) теперь принимает необязательный аргумент *max\_length* для ограничения максимального размера распакованных данных. (Предложено Николаусом Ратом в [bpo-15955](https://python-all.ru/3.7/whatsnew/3.5.html).)

### cgi

Класс `FieldStorage` теперь поддерживает [менеджера контекста](https://python-all.ru/3.7/glossary.html#term-context-manager) протокол. (Предложено Беркером Пексагом в [bpo-20289](https://python-all.ru/3.7/whatsnew/3.5.html).)

### cmath

Новая функция [`isclose()`](https://python-all.ru/3.7/library/cmath.html#cmath.isclose) предоставляет способ проверки на приблизительное равенство. (Предложено Крисом Баркером и Талем Эйнатом в [bpo-24270](https://python-all.ru/3.7/whatsnew/3.5.html).)

### code

Метод [`InteractiveInterpreter.showtraceback()`](https://python-all.ru/3.7/library/code.html#code.InteractiveInterpreter.showtraceback) теперь выводит полную цепочку трассировки, как и интерактивный интерпретатор. (Предложено Клавдиу Попа в [bpo-17442](https://python-all.ru/3.7/whatsnew/3.5.html).)

### collections

Класс [`OrderedDict`](https://python-all.ru/3.7/library/collections.html#collections.OrderedDict) теперь реализован на C, что делает его в 4–100 раз быстрее. (Предложено Эриком Сноу в [bpo-16991](https://python-all.ru/3.7/whatsnew/3.5.html).)

`OrderedDict.items()`, `OrderedDict.keys()`, `OrderedDict.values()` представления теперь поддерживают [`reversed()`](https://python-all.ru/3.7/library/functions.html#reversed) итерацию. (Добавлено Сергеем Сторчакой в [bpo-19505](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`deque`](https://python-all.ru/3.7/library/collections.html#collections.deque) теперь определяет [`index()`](https://python-all.ru/3.7/library/collections.html#collections.deque.index), [`insert()`](https://python-all.ru/3.7/library/collections.html#collections.deque.insert) и [`copy()`](https://python-all.ru/3.7/library/collections.html#collections.deque.copy), а также поддерживает операторы `+` и `*`. Это позволяет распознавать объекты deque как [`MutableSequence`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.MutableSequence) и улучшает их взаимозаменяемость со списками. (Предложено Рэймондом Хеттингером в [bpo-23704](https://python-all.ru/3.7/whatsnew/3.5.html).)

Докстринги, созданные [`namedtuple()`](https://python-all.ru/3.7/library/collections.html#collections.namedtuple), теперь можно обновлять:

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

(Предложено Беркером Пексагом в [bpo-24064](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`UserString`](https://python-all.ru/3.7/library/collections.html#collections.UserString) теперь реализует методы [`__getnewargs__()`](https://python-all.ru/3.7/library/pickle.html#object.__getnewargs__), [`__rmod__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__rmod__), [`casefold()`](https://python-all.ru/3.7/library/stdtypes.html#str.casefold), [`format_map()`](https://python-all.ru/3.7/library/stdtypes.html#str.format_map), [`isprintable()`](https://python-all.ru/3.7/library/stdtypes.html#str.isprintable) и [`maketrans()`](https://python-all.ru/3.7/library/stdtypes.html#str.maketrans), соответствующие методам [`str`](https://python-all.ru/3.7/library/stdtypes.html#str). (Предложено Джо Джевником в [bpo-22189](https://python-all.ru/3.7/whatsnew/3.5.html).)

### collections.abc

Метод `Sequence.index()` теперь принимает аргументы *start* и *stop*, чтобы соответствовать аналогичным методам [`tuple`](https://python-all.ru/3.7/library/stdtypes.html#tuple), [`list`](https://python-all.ru/3.7/library/stdtypes.html#list) и т. д. (Автор: Devin Jeanpierre в [bpo-23086](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый абстрактный базовый класс [`Generator`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.Generator). (Автор: Stefan Behnel в [bpo-24018](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые абстрактные базовые классы [`Awaitable`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.Awaitable), [`Coroutine`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.Coroutine), [`AsyncIterator`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.AsyncIterator) и [`AsyncIterable`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.AsyncIterable). (Автор: Yury Selivanov в [bpo-24184](https://python-all.ru/3.7/whatsnew/3.5.html).)

Для более ранних версий Python обратный порт новых ABC доступен во внешнем [пакете PyPI](https://python-all.ru/3.7/whatsnew/3.5.html).

### compileall

Новая опция [`compileall`](https://python-all.ru/3.7/library/compileall.html#module-compileall), `-j N`, позволяет запускать *N* рабочих процессов одновременно для параллельной компиляции байт-кода. Функция [`compile_dir()`](https://python-all.ru/3.7/library/compileall.html#compileall.compile_dir) имеет соответствующий параметр `workers`. (Автор: Claudiu Popa в [bpo-16104](https://python-all.ru/3.7/whatsnew/3.5.html).)

Ещё одна новая опция, `-r`, позволяет управлять максимальной глубиной рекурсии для подкаталогов. (Автор: Claudiu Popa в [bpo-19628](https://python-all.ru/3.7/whatsnew/3.5.html).)

Опцию командной строки `-q` теперь можно указывать несколько раз – в этом случае весь вывод, включая ошибки, будет подавляться. Соответствующий параметр `quiet` в [`compile_dir()`](https://python-all.ru/3.7/library/compileall.html#compileall.compile_dir), [`compile_file()`](https://python-all.ru/3.7/library/compileall.html#compileall.compile_file) и [`compile_path()`](https://python-all.ru/3.7/library/compileall.html#compileall.compile_path) теперь может принимать целочисленное значение, указывающее уровень подавления вывода. (Автор: Thomas Kluyver в [bpo-21338](https://python-all.ru/3.7/whatsnew/3.5.html).)

### concurrent.futures

Метод [`Executor.map()`](https://python-all.ru/3.7/library/concurrent.futures.html#concurrent.futures.Executor.map) теперь принимает аргумент *chunksize* для группировки задач с целью повышения производительности при использовании [`ProcessPoolExecutor()`](https://python-all.ru/3.7/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor). (Автор: Dan O’Reilly в [bpo-11271](https://python-all.ru/3.7/whatsnew/3.5.html).)

Количество рабочих процессов в конструкторе [`ThreadPoolExecutor`](https://python-all.ru/3.7/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) теперь необязательно. Значение по умолчанию – 5 \* количество CPU. (Автор: Claudiu Popa в [bpo-21527](https://python-all.ru/3.7/whatsnew/3.5.html).)

### configparser

[`configparser`](https://python-all.ru/3.7/library/configparser.html#module-configparser) теперь предоставляет способ настройки преобразования значений: можно указать словарь конвертеров в конструкторе [`ConfigParser`](https://python-all.ru/3.7/library/configparser.html#configparser.ConfigParser) или определить их как методы в подклассах `ConfigParser`. Конвертеры, определённые в экземпляре парсера, наследуются его прокси-объектами разделов.

Пример:

```python
>>> 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](https://python-all.ru/3.7/whatsnew/3.5.html).)

### contextlib

Новый [`redirect_stderr()`](https://python-all.ru/3.7/library/contextlib.html#contextlib.redirect_stderr) [менеджер контекста](https://python-all.ru/3.7/glossary.html#term-context-manager) (аналогичный [`redirect_stdout()`](https://python-all.ru/3.7/library/contextlib.html#contextlib.redirect_stdout)) упрощает для вспомогательных скриптов работу с негибкими API, которые пишут свой вывод в [`sys.stderr`](https://python-all.ru/3.7/library/sys.html#sys.stderr) и не предоставляют возможности его перенаправить:

```python
>>> 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](https://python-all.ru/3.7/whatsnew/3.5.html).)

### csv

Метод [`writerow()`](https://python-all.ru/3.7/library/csv.html#csv.csvwriter.writerow) теперь поддерживает произвольные итерируемые объекты, а не только последовательности. (Автор: Serhiy Storchaka в [bpo-23171](https://python-all.ru/3.7/whatsnew/3.5.html).)

### curses

Новая функция [`update_lines_cols()`](https://python-all.ru/3.7/library/curses.html#curses.update_lines_cols) обновляет переменные окружения `LINES` и `COLS`. Это полезно для обнаружения ручного изменения размера экрана. (Внёс Арнон Яари в [bpo-4254](https://python-all.ru/3.7/whatsnew/3.5.html).)

### dbm

[`dumb.open`](https://python-all.ru/3.7/library/dbm.html#dbm.dumb.open) всегда создаёт новую базу данных, когда флаг имеет значение `"n"`. (Автор: Claudiu Popa в [bpo-18039](https://python-all.ru/3.7/whatsnew/3.5.html).)

### difflib

Кодировку HTML-документов, создаваемых [`HtmlDiff.make_file()`](https://python-all.ru/3.7/library/difflib.html#difflib.HtmlDiff.make_file), теперь можно настроить с помощью нового именованного аргумента *charset*. Кодировка по умолчанию изменилась с `"ISO-8859-1"` на `"utf-8"`. (Автор: Berker Peksag в [bpo-2052](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`diff_bytes()`](https://python-all.ru/3.7/library/difflib.html#difflib.diff_bytes) теперь может сравнивать списки байтовых строк. Это исправляет регрессию из Python 2. (Авторы: Terry J. Reedy и Greg Ward в [bpo-17445](https://python-all.ru/3.7/whatsnew/3.5.html).)

### distutils

Обе команды `build` и `build_ext` теперь принимают опцию `-j` для включения параллельной сборки модулей расширения. (Автор: Antoine Pitrou в [bpo-5309](https://python-all.ru/3.7/whatsnew/3.5.html).)

Модуль [`distutils`](https://python-all.ru/3.7/library/distutils.html#module-distutils) теперь поддерживает сжатие `xz`, которое можно включить, передав `xztar` в качестве аргумента в `bdist --format`. (Автор: Serhiy Storchaka в [bpo-16314](https://python-all.ru/3.7/whatsnew/3.5.html).)

### doctest

Функция [`DocTestSuite()`](https://python-all.ru/3.7/library/doctest.html#doctest.DocTestSuite) возвращает пустой [`unittest.TestSuite`](https://python-all.ru/3.7/library/unittest.html#unittest.TestSuite), если *модуль* не содержит строк документации, вместо того чтобы возбуждать [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError). (Автор: Glenn Jones в [bpo-15916](https://python-all.ru/3.7/whatsnew/3.5.html).)

### email

Новая опция политики [`Policy.mangle_from_`](https://python-all.ru/3.7/library/email.policy.html#email.policy.Policy.mangle_from_) управляет, добавляют ли генераторы префикс с символом `">"` к строкам, начинающимся с `"From "`, в телах электронных писем. По умолчанию `True` для [`compat32`](https://python-all.ru/3.7/library/email.policy.html#email.policy.compat32) и `False` для всех остальных политик. (Автор: Milan Oberkirch в [bpo-20098](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый метод [`Message.get_content_disposition()`](https://python-all.ru/3.7/library/email.compat32-message.html#email.message.Message.get_content_disposition) предоставляет простой доступ к каноническому значению для заголовка *Content-Disposition*. (Автор: Abhilash Raj в [bpo-21083](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новую опцию политики [`EmailPolicy.utf8`](https://python-all.ru/3.7/library/email.policy.html#email.policy.EmailPolicy.utf8) можно установить в `True` для кодирования заголовков электронных писем с использованием кодировки UTF-8 вместо кодированных слов. Это позволяет форматировать `Messages` в соответствии с [**RFC 6532**](https://python-all.ru/3.7/whatsnew/3.5.html) и использовать с SMTP-сервером, поддерживающим расширение [**RFC 6531**](https://python-all.ru/3.7/whatsnew/3.5.html) `SMTPUTF8`. (Автор: R. David Murray в [bpo-24211](https://python-all.ru/3.7/whatsnew/3.5.html).)

Конструктор [`mime.text.MIMEText`](https://python-all.ru/3.7/library/email.mime.html#email.mime.text.MIMEText) теперь принимает экземпляр [`charset.Charset`](https://python-all.ru/3.7/library/email.charset.html#email.charset.Charset). (Авторы: Claude Paroz и Berker Peksag в [bpo-16324](https://python-all.ru/3.7/whatsnew/3.5.html).)

### enum

Вызываемый объект [`Enum`](https://python-all.ru/3.7/library/enum.html#enum.Enum) получил новый параметр *start*, задающий начальное количество значений перечисления, если указаны только *names*:

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

(Автор: Ethan Furman в [bpo-21706](https://python-all.ru/3.7/whatsnew/3.5.html).)

### faulthandler

Функции [`enable()`](https://python-all.ru/3.7/library/faulthandler.html#faulthandler.enable), [`register()`](https://python-all.ru/3.7/library/faulthandler.html#faulthandler.register), [`dump_traceback()`](https://python-all.ru/3.7/library/faulthandler.html#faulthandler.dump_traceback) и [`dump_traceback_later()`](https://python-all.ru/3.7/library/faulthandler.html#faulthandler.dump_traceback_later) теперь принимают файловые дескрипторы в дополнение к объектам, похожим на файлы. (Автор: Wei Wu в [bpo-23566](https://python-all.ru/3.7/whatsnew/3.5.html).)

### functools

Большая часть механизма [`lru_cache()`](https://python-all.ru/3.7/library/functools.html#functools.lru_cache) теперь реализована на C, что делает его значительно быстрее. (Авторы: Matt Joiner, Alexey Kachayev и Serhiy Storchaka в [bpo-14373](https://python-all.ru/3.7/whatsnew/3.5.html).)

### glob

Функции [`iglob()`](https://python-all.ru/3.7/library/glob.html#glob.iglob) и [`glob()`](https://python-all.ru/3.7/library/glob.html#glob.glob) теперь поддерживают рекурсивный поиск в подкаталогах, используя шаблон `"**"`. (Автор: Serhiy Storchaka в [bpo-13968](https://python-all.ru/3.7/whatsnew/3.5.html).)

### gzip

Аргумент *mode* конструктора [`GzipFile`](https://python-all.ru/3.7/library/gzip.html#gzip.GzipFile) теперь принимает `"x"` для запроса эксклюзивного создания. (Автор: Tim Heaney в [bpo-19222](https://python-all.ru/3.7/whatsnew/3.5.html).)

### heapq

Сравнение элементов в [`merge()`](https://python-all.ru/3.7/library/heapq.html#heapq.merge) теперь можно настраивать, передавая [функцию ключа](https://python-all.ru/3.7/glossary.html#term-key-function) в новом необязательном именованном аргументе *key*, а новый необязательный именованный аргумент *reverse* можно использовать для обращения порядка сравнения элементов:

```python
>>> 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](https://python-all.ru/3.7/whatsnew/3.5.html).)

### http

Новое перечисление [`HTTPStatus`](https://python-all.ru/3.7/library/http.html#http.HTTPStatus), определяющее набор HTTP-кодов состояния, фраз причины и подробных описаний на английском языке. (Автор: Demian Brecht в [bpo-21793](https://python-all.ru/3.7/whatsnew/3.5.html).)

### http.client

[`HTTPConnection.getresponse()`](https://python-all.ru/3.7/library/http.client.html#http.client.HTTPConnection.getresponse) теперь вызывает исключение [`RemoteDisconnected`](https://python-all.ru/3.7/library/http.client.html#http.client.RemoteDisconnected), когда соединение с удаленным сервером неожиданно закрывается. Кроме того, если возникает [`ConnectionError`](https://python-all.ru/3.7/library/exceptions.html#ConnectionError) (подклассом которого является `RemoteDisconnected`), клиентский сокет теперь автоматически закрывается и будет переподключаться при следующем запросе:

```python
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](https://python-all.ru/3.7/whatsnew/3.5.html).)

### idlelib и IDLE

Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для импорта другими программами, он получает улучшения с каждым релизом. Смотрите `Lib/idlelib/NEWS.txt` для полного списка изменений начиная с 3.4.0, а также изменений, внесенных в будущих версиях 3.5.x. Этот файл также доступен из диалога IDLE Справка ‣ О программе IDLE.

### imaplib

Класс [`IMAP4`](https://python-all.ru/3.7/library/imaplib.html#imaplib.IMAP4) теперь поддерживает протокол [менеджера контекста](https://python-all.ru/3.7/glossary.html#term-context-manager). При использовании в операторе [`with`](https://python-all.ru/3.7/reference/compound_stmts.html#with) команда IMAP4 `LOGOUT` будет автоматически вызвана в конце блока. (Авторы: Tarek Ziadé и Serhiy Storchaka в [bpo-4972](https://python-all.ru/3.7/whatsnew/3.5.html).)

Модуль [`imaplib`](https://python-all.ru/3.7/library/imaplib.html#module-imaplib) теперь поддерживает [**RFC 5161**](https://python-all.ru/3.7/whatsnew/3.5.html) (ENABLE Extension) и [**RFC 6855**](https://python-all.ru/3.7/whatsnew/3.5.html) (UTF-8 Support) через метод [`IMAP4.enable()`](https://python-all.ru/3.7/library/imaplib.html#imaplib.IMAP4.enable). Новый атрибут [`IMAP4.utf8_enabled`](https://python-all.ru/3.7/library/imaplib.html#imaplib.IMAP4.utf8_enabled) отслеживает, включена ли поддержка [**RFC 6855**](https://python-all.ru/3.7/whatsnew/3.5.html). (Авторы: Milan Oberkirch, R. David Murray и Maciej Szulik в [bpo-21800](https://python-all.ru/3.7/whatsnew/3.5.html).)

Модуль [`imaplib`](https://python-all.ru/3.7/library/imaplib.html#module-imaplib) теперь автоматически кодирует не-ASCII строки имен пользователей и паролей с использованием UTF-8, как рекомендуется в RFC. (Автор: Milan Oberkirch в [bpo-21800](https://python-all.ru/3.7/whatsnew/3.5.html).)

### imghdr

Функция [`what()`](https://python-all.ru/3.7/library/imghdr.html#imghdr.what) теперь распознает формат [OpenEXR](https://python-all.ru/3.7/whatsnew/3.5.html) (предложен Martin Vignali и Claudiu Popa в [bpo-20295](https://python-all.ru/3.7/whatsnew/3.5.html)) и формат [WebP](https://python-all.ru/3.7/whatsnew/3.5.html) (предложен Fabrice Aneche и Claudiu Popa в [bpo-20197](https://python-all.ru/3.7/whatsnew/3.5.html)).

### importlib

Класс [`util.LazyLoader`](https://python-all.ru/3.7/library/importlib.html#importlib.util.LazyLoader) позволяет отложенную загрузку модулей в приложениях, где время запуска критично. (Предложено Бреттом Кэнноном в [bpo-17621](https://python-all.ru/3.7/whatsnew/3.5.html).)

Метод [`abc.InspectLoader.source_to_code()`](https://python-all.ru/3.7/library/importlib.html#importlib.abc.InspectLoader.source_to_code) теперь является статическим. Это упрощает инициализацию объекта модуля кодом, скомпилированным из строки, через вызов `exec(code, module.__dict__)`. (Предложено Бреттом Кэнноном в [bpo-21156](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новая функция [`util.module_from_spec()`](https://python-all.ru/3.7/library/importlib.html#importlib.util.module_from_spec) теперь является предпочтительным способом создания модуля. В отличие от прямого создания экземпляра [`types.ModuleType`](https://python-all.ru/3.7/library/types.html#types.ModuleType), эта функция устанавливает различные атрибуты, управляемые импортом, на основе переданного объекта спецификации. (Предложено Бреттом Кэнноном в [bpo-20383](https://python-all.ru/3.7/whatsnew/3.5.html).)

### inspect

Оба класса – [`Signature`](https://python-all.ru/3.7/library/inspect.html#inspect.Signature) и [`Parameter`](https://python-all.ru/3.7/library/inspect.html#inspect.Parameter) – теперь поддерживают сериализацию и хеширование. (Предложено Юрием Селивановым в [bpo-20726](https://python-all.ru/3.7/whatsnew/3.5.html) и [bpo-20334](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый метод [`BoundArguments.apply_defaults()`](https://python-all.ru/3.7/library/inspect.html#inspect.BoundArguments.apply_defaults) позволяет задавать значения по умолчанию для отсутствующих аргументов:

```python
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
```

(Предложено Юрием Селивановым в [bpo-24190](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый метод класса [`Signature.from_callable()`](https://python-all.ru/3.7/library/inspect.html#inspect.Signature.from_callable) упрощает создание подклассов [`Signature`](https://python-all.ru/3.7/library/inspect.html#inspect.Signature). (Предложено Юрием Селивановым и Эриком Сноу в [bpo-17373](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`signature()`](https://python-all.ru/3.7/library/inspect.html#inspect.signature) теперь принимает необязательный именованный аргумент *follow\_wrapped*, который при установке в `False` отключает автоматическое следование по ссылкам `__wrapped__`. (Предложено Юрием Селивановым в [bpo-20691](https://python-all.ru/3.7/whatsnew/3.5.html).)

Добавлен набор новых функций для интроспекции [корутинных функций](https://python-all.ru/3.7/glossary.html#term-coroutine-function) и [объектов корутин](https://python-all.ru/3.7/glossary.html#term-coroutine): [`iscoroutine()`](https://python-all.ru/3.7/library/inspect.html#inspect.iscoroutine), [`iscoroutinefunction()`](https://python-all.ru/3.7/library/inspect.html#inspect.iscoroutinefunction), [`isawaitable()`](https://python-all.ru/3.7/library/inspect.html#inspect.isawaitable), [`getcoroutinelocals()`](https://python-all.ru/3.7/library/inspect.html#inspect.getcoroutinelocals) и [`getcoroutinestate()`](https://python-all.ru/3.7/library/inspect.html#inspect.getcoroutinestate). (Предложено Юрием Селивановым в [bpo-24017](https://python-all.ru/3.7/whatsnew/3.5.html) и [bpo-24400](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`stack()`](https://python-all.ru/3.7/library/inspect.html#inspect.stack), [`trace()`](https://python-all.ru/3.7/library/inspect.html#inspect.trace), [`getouterframes()`](https://python-all.ru/3.7/library/inspect.html#inspect.getouterframes) и [`getinnerframes()`](https://python-all.ru/3.7/library/inspect.html#inspect.getinnerframes) теперь возвращают список именованных кортежей. (Предложено Дэниэлом Шахафом в [bpo-16808](https://python-all.ru/3.7/whatsnew/3.5.html).)

### io

Новый метод [`BufferedIOBase.readinto1()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.readinto1), который использует не более одного вызова методов [`RawIOBase.read()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.read) или [`RawIOBase.readinto()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.readinto) базового необработанного потока. (Предложено Николаусом Ратом в [bpo-20578](https://python-all.ru/3.7/whatsnew/3.5.html).)

### ipaddress

Оба класса – [`IPv4Network`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv6Network) – теперь принимают аргумент-кортеж `(address, netmask)`, что позволяет легко создавать сетевые объекты из существующих адресов:

```python
>>> 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')
```

(Предложено Питером Муди и Антуаном Питру в [bpo-16531](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый атрибут `reverse_pointer` для классов [`IPv4Network`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv6Network) возвращает имя обратной DNS-записи PTR:

```python
>>> 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'
```

(Предложено Леоном Вебером в [bpo-20480](https://python-all.ru/3.7/whatsnew/3.5.html).)

### json

Интерфейс командной строки [`json.tool`](https://python-all.ru/3.7/library/json.html#module-json.tool) теперь сохраняет порядок ключей в JSON-объектах, переданных на вход. Новая опция `--sort-keys` позволяет сортировать ключи по алфавиту. (Предложено Беркером Пексагом в [bpo-21650](https://python-all.ru/3.7/whatsnew/3.5.html).)

Декодер JSON теперь вызывает [`JSONDecodeError`](https://python-all.ru/3.7/library/json.html#json.JSONDecodeError) вместо [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError), чтобы предоставить больше контекстной информации об ошибке. (Предложено Серхием Сторчакой в [bpo-19361](https://python-all.ru/3.7/whatsnew/3.5.html).)

### linecache

Новую функцию [`lazycache()`](https://python-all.ru/3.7/library/linecache.html#linecache.lazycache) можно использовать для захвата информации о модуле, не основанном на файле, чтобы позже получать его строки через [`getline()`](https://python-all.ru/3.7/library/linecache.html#linecache.getline). Это позволяет избежать операций ввода-вывода до тех пор, пока строка действительно не понадобится, и не требует бесконечного хранения глобальных переменных модуля. (Предложено Робертом Коллинзом в [bpo-17911](https://python-all.ru/3.7/whatsnew/3.5.html).)

### locale

Новая функция [`delocalize()`](https://python-all.ru/3.7/library/locale.html#locale.delocalize) позволяет преобразовать строку в нормализованное строковое представление числа с учётом настроек `LC_NUMERIC`:

```python
>>> 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'
```

(Предложено Седриком Криером в [bpo-13918](https://python-all.ru/3.7/whatsnew/3.5.html).)

### logging

Все методы логирования ([`Logger`](https://python-all.ru/3.7/library/logging.html#logging.Logger) [`log()`](https://python-all.ru/3.7/library/logging.html#logging.Logger.log), [`exception()`](https://python-all.ru/3.7/library/logging.html#logging.Logger.exception), [`critical()`](https://python-all.ru/3.7/library/logging.html#logging.Logger.critical), [`debug()`](https://python-all.ru/3.7/library/logging.html#logging.Logger.debug) и т.д.) теперь принимают экземпляры исключений в качестве аргумента *exc\_info* в дополнение к логическим значениям и кортежам исключений:

```python
>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception
```

(Предложено Юрием Селивановым в [bpo-20537](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`handlers.HTTPHandler`](https://python-all.ru/3.7/library/logging.handlers.html#logging.handlers.HTTPHandler) теперь принимает необязательный экземпляр [`ssl.SSLContext`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLContext) для настройки параметров SSL, используемых в HTTP-соединении. (Предложено Алексом Гейнором в [bpo-22788](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`handlers.QueueListener`](https://python-all.ru/3.7/library/logging.handlers.html#logging.handlers.QueueListener) теперь принимает именованный аргумент *respect\_handler\_level*, который при установке в `True` будет передавать сообщения обработчикам с учётом их уровней. (Предложено Винаем Саджипом.)

### lzma

Метод [`LZMADecompressor.decompress()`](https://python-all.ru/3.7/library/lzma.html#lzma.LZMADecompressor.decompress) теперь принимает необязательный аргумент *max\_length* для ограничения максимального размера распакованных данных. (Предложено Martin Panter в [bpo-15955](https://python-all.ru/3.7/whatsnew/3.5.html).)

### math

В модуль [`math`](https://python-all.ru/3.7/library/math.html#module-math) добавлены две новые константы: [`inf`](https://python-all.ru/3.7/library/math.html#math.inf) и [`nan`](https://python-all.ru/3.7/library/math.html#math.nan). (Предложено Mark Dickinson в [bpo-23185](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новая функция [`isclose()`](https://python-all.ru/3.7/library/math.html#math.isclose) предоставляет способ проверки приблизительного равенства. (Предложено Chris Barker и Tal Einat в [bpo-24270](https://python-all.ru/3.7/whatsnew/3.5.html).)

Добавлена новая функция [`gcd()`](https://python-all.ru/3.7/library/math.html#math.gcd). Функция [`fractions.gcd()`](https://python-all.ru/3.7/library/fractions.html#fractions.gcd) теперь устарела. (Предложено Mark Dickinson и Serhiy Storchaka в [bpo-22486](https://python-all.ru/3.7/whatsnew/3.5.html).)

### multiprocessing

Объекты [`sharedctypes.synchronized()`](https://python-all.ru/3.7/library/multiprocessing.html#multiprocessing.sharedctypes.synchronized) теперь поддерживают протокол [менеджера контекста](https://python-all.ru/3.7/glossary.html#term-context-manager). (Предложено Charles-François Natali в [bpo-21565](https://python-all.ru/3.7/whatsnew/3.5.html).)

### operator

Объекты [`attrgetter()`](https://python-all.ru/3.7/library/operator.html#operator.attrgetter), [`itemgetter()`](https://python-all.ru/3.7/library/operator.html#operator.itemgetter) и [`methodcaller()`](https://python-all.ru/3.7/library/operator.html#operator.methodcaller) теперь поддерживают упаковку (pickling). (Предложено Josh Rosenberg и Serhiy Storchaka в [bpo-22955](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые функции [`matmul()`](https://python-all.ru/3.7/library/operator.html#operator.matmul) и [`imatmul()`](https://python-all.ru/3.7/library/operator.html#operator.imatmul) для выполнения матричного умножения. (Предложено Benjamin Peterson в [bpo-21176](https://python-all.ru/3.7/whatsnew/3.5.html).)

### os

Добавлена новая функция [`scandir()`](https://python-all.ru/3.7/library/os.html#os.scandir), возвращающая итератор объектов [`DirEntry`](https://python-all.ru/3.7/library/os.html#os.DirEntry). Если возможно, [`scandir()`](https://python-all.ru/3.7/library/os.html#os.scandir) извлекает атрибуты файлов при сканировании каталога, что устраняет необходимость выполнять последующие системные вызовы для определения типа или атрибутов файла, что может значительно повысить производительность. (Предложено Ben Hoyt с помощью Victor Stinner в [bpo-22524](https://python-all.ru/3.7/whatsnew/3.5.html).)

В Windows теперь доступен новый атрибут [`stat_result.st_file_attributes`](https://python-all.ru/3.7/library/os.html#os.stat_result.st_file_attributes). Он соответствует элементу `dwFileAttributes` структуры `BY_HANDLE_FILE_INFORMATION`, возвращаемой функцией `GetFileInformationByHandle()`. (Предложено Ben Hoyt в [bpo-21719](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`urandom()`](https://python-all.ru/3.7/library/os.html#os.urandom) теперь использует системный вызов `getrandom()` в Linux 3.17 или новее и `getentropy()` в OpenBSD 5.6 и новее, что устраняет необходимость использовать `/dev/urandom` и позволяет избежать ошибок из-за возможного исчерпания файловых дескрипторов. (Предложено Victor Stinner в [bpo-22181](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые функции [`get_blocking()`](https://python-all.ru/3.7/library/os.html#os.get_blocking) и [`set_blocking()`](https://python-all.ru/3.7/library/os.html#os.set_blocking) позволяют получить и установить блокирующий режим файлового дескриптора ([`O_NONBLOCK`](https://python-all.ru/3.7/library/os.html#os.O_NONBLOCK).) (Предложено Victor Stinner в [bpo-22054](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`truncate()`](https://python-all.ru/3.7/library/os.html#os.truncate) и [`ftruncate()`](https://python-all.ru/3.7/library/os.html#os.ftruncate) теперь поддерживаются в Windows. (Предложено Steve Dower в [bpo-23668](https://python-all.ru/3.7/whatsnew/3.5.html).)

Появилась новая функция [`os.path.commonpath()`](https://python-all.ru/3.7/library/os.path.html#os.path.commonpath), возвращающая самый длинный общий подпуть каждого переданного имени пути. В отличие от функции [`os.path.commonprefix()`](https://python-all.ru/3.7/library/os.path.html#os.path.commonprefix), она всегда возвращает корректный путь:

```python
>>> 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](https://python-all.ru/3.7/whatsnew/3.5.html).)

### pathlib

Новый метод [`Path.samefile()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.samefile) можно использовать для проверки, указывает ли путь на тот же файл, что и другой путь, который может быть как объектом [`Path`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path), так и строкой:

```python
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
```

(Предложено Vajrasky Kok и Antoine Pitrou в [bpo-19775](https://python-all.ru/3.7/whatsnew/3.5.html).)

Метод [`Path.mkdir()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.mkdir) теперь принимает новый необязательный аргумент *exist\_ok* для соответствия функциональности `mkdir -p` и [`os.makedirs()`](https://python-all.ru/3.7/library/os.html#os.makedirs). (Предложено Berker Peksag в [bpo-21539](https://python-all.ru/3.7/whatsnew/3.5.html).)

Появился новый метод [`Path.expanduser()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.expanduser) для разворачивания префиксов `~` и `~user`. (Предложено Serhiy Storchaka и Claudiu Popa в [bpo-19776](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый классовый метод [`Path.home()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.home) можно использовать для получения экземпляра [`Path`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path), представляющего домашний каталог пользователя. (Предложено Victor Salgado и Mayank Tripathi в [bpo-19777](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые методы [`Path.write_text()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.write_text), [`Path.read_text()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.read_text), [`Path.write_bytes()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.write_bytes), [`Path.read_bytes()`](https://python-all.ru/3.7/library/pathlib.html#pathlib.Path.read_bytes) для упрощения операций чтения/записи файлов.

Следующий фрагмент кода создаст или перезапишет существующий файл `~/spam42`:

```python
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
```

(Предложено Christopher Welborn в [bpo-20218](https://python-all.ru/3.7/whatsnew/3.5.html).)

### pickle

Вложенные объекты, такие как несвязанные методы или вложенные классы, теперь могут быть упакованы (pickled) с использованием [протоколов pickle](https://python-all.ru/3.7/library/pickle.html#pickle-protocols) старше версии 4. Версия 4 протокола уже поддерживает эти случаи. (Предложено Serhiy Storchaka в [bpo-23611](https://python-all.ru/3.7/whatsnew/3.5.html).)

### poplib

Новая команда [`POP3.utf8()`](https://python-all.ru/3.7/library/poplib.html#poplib.POP3.utf8) включает поддержку [**RFC 6856**](https://python-all.ru/3.7/whatsnew/3.5.html) (Интернационализированная электронная почта), если POP-сервер это поддерживает. (Предложено Milan OberKirch в [bpo-21804](https://python-all.ru/3.7/whatsnew/3.5.html).)

### re

В ретроспективных проверках (lookbehind assertions) теперь разрешены ссылки и условные ссылки на группы фиксированной длины:

```python
>>> 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](https://python-all.ru/3.7/whatsnew/3.5.html).)

Количество групп захвата в регулярных выражениях больше не ограничено 100. (Автор: Serhiy Storchaka в [bpo-22437](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`sub()`](https://python-all.ru/3.7/library/re.html#re.sub) и [`subn()`](https://python-all.ru/3.7/library/re.html#re.subn) теперь заменяют несовпавшие группы пустыми строками вместо возбуждения исключения. (Автор: Serhiy Storchaka в [bpo-1519638](https://python-all.ru/3.7/whatsnew/3.5.html).)

Исключения [`re.error`](https://python-all.ru/3.7/library/re.html#re.error) получили новые атрибуты: [`msg`](https://python-all.ru/3.7/library/re.html#re.error.msg), [`pattern`](https://python-all.ru/3.7/library/re.html#re.error.pattern), [`pos`](https://python-all.ru/3.7/library/re.html#re.error.pos), [`lineno`](https://python-all.ru/3.7/library/re.html#re.error.lineno) и [`colno`](https://python-all.ru/3.7/library/re.html#re.error.colno), которые предоставляют более подробную контекстную информацию об ошибке:

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

(Автор: Serhiy Storchaka в [bpo-22578](https://python-all.ru/3.7/whatsnew/3.5.html).)

### readline

Новая функция [`append_history_file()`](https://python-all.ru/3.7/library/readline.html#readline.append_history_file) может использоваться для добавления указанного количества последних элементов истории в заданный файл. (Автор: Bruno Cauet в [bpo-22940](https://python-all.ru/3.7/whatsnew/3.5.html).)

### selectors

Новый [`DevpollSelector`](https://python-all.ru/3.7/library/selectors.html#selectors.DevpollSelector) обеспечивает эффективный опрос `/dev/poll` в Solaris. (Автор: Giampaolo Rodola’ в [bpo-18931](https://python-all.ru/3.7/whatsnew/3.5.html).)

### shutil

Функция [`move()`](https://python-all.ru/3.7/library/shutil.html#shutil.move) теперь принимает аргумент *copy\_function*, позволяющий, например, использовать функцию [`copy()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy) вместо стандартной [`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2), если необходимо игнорировать метаданные файлов при перемещении. (Автор: Claudiu Popa в [bpo-19840](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`make_archive()`](https://python-all.ru/3.7/library/shutil.html#shutil.make_archive) теперь поддерживает формат *xztar*. (Автор: Serhiy Storchaka в [bpo-5411](https://python-all.ru/3.7/whatsnew/3.5.html).)

### signal

В Windows функция [`set_wakeup_fd()`](https://python-all.ru/3.7/library/signal.html#signal.set_wakeup_fd) теперь также поддерживает дескрипторы сокетов. (Автор: Victor Stinner в [bpo-22018](https://python-all.ru/3.7/whatsnew/3.5.html).)

Различные константы `SIG*` в модуле [`signal`](https://python-all.ru/3.7/library/signal.html#module-signal) были преобразованы в [`Enums`](https://python-all.ru/3.7/library/enum.html#module-enum). Это позволяет выводить осмысленные имена при отладке вместо целочисленных «магических чисел». (Автор: Giampaolo Rodola’ в [bpo-21076](https://python-all.ru/3.7/whatsnew/3.5.html).)

### smtpd

Оба класса [`SMTPServer`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer) и [`SMTPChannel`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPChannel) теперь принимают именованный аргумент *decode\_data*, определяющий, будет ли часть `DATA` SMTP-транзакции декодироваться с использованием кодека `"utf-8"` или передаваться методу [`SMTPServer.process_message()`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer.process_message) в виде байтовой строки. По умолчанию `True` для обратной совместимости, но в Python 3.6 будет изменено на `False`. Если *decode\_data* установлен в `False`, метод `process_message` должен быть готов принимать именованные аргументы. (Автор: Maciej Szulik в [bpo-19662](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`SMTPServer`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer) теперь анонсирует расширение `8BITMIME` ([**RFC 6152**](https://python-all.ru/3.7/whatsnew/3.5.html)), если *decode\_data* установлен в `True`. Если клиент указывает `BODY=8BITMIME` в команде `MAIL`, оно передаётся в [`SMTPServer.process_message()`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer.process_message) через именованный аргумент *mail\_options*. (Авторы: Milan Oberkirch и R. David Murray в [bpo-21795](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`SMTPServer`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer) теперь также поддерживает расширение `SMTPUTF8` ([**RFC 6531**](https://python-all.ru/3.7/whatsnew/3.5.html): Internationalized Email). Если клиент указал `SMTPUTF8 BODY=8BITMIME` в команде `MAIL`, они передаются в [`SMTPServer.process_message()`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer.process_message) через именованный аргумент *mail\_options*. Метод `process_message` отвечает за корректную обработку данных `SMTPUTF8`. (Автор: Milan Oberkirch в [bpo-21725](https://python-all.ru/3.7/whatsnew/3.5.html).)

Теперь можно указывать IPv6-адреса в конструкторе [`SMTPServer`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer) напрямую или через разрешение имён, и он будет успешно подключаться. (Автор: Milan Oberkirch в [bpo-14758](https://python-all.ru/3.7/whatsnew/3.5.html).)

### smtplib

Новый метод [`SMTP.auth()`](https://python-all.ru/3.7/library/smtplib.html#smtplib.SMTP.auth) предоставляет удобный способ реализации пользовательских механизмов аутентификации. (Автор: Milan Oberkirch в [bpo-15014](https://python-all.ru/3.7/whatsnew/3.5.html).)

Метод [`SMTP.set_debuglevel()`](https://python-all.ru/3.7/library/smtplib.html#smtplib.SMTP.set_debuglevel) теперь принимает дополнительный уровень отладки (2), который включает временные метки в отладочных сообщениях. (Авторы: Gavin Chappell и Maciej Szulik в [bpo-16914](https://python-all.ru/3.7/whatsnew/3.5.html).)

Оба метода [`SMTP.sendmail()`](https://python-all.ru/3.7/library/smtplib.html#smtplib.SMTP.sendmail) и [`SMTP.send_message()`](https://python-all.ru/3.7/library/smtplib.html#smtplib.SMTP.send_message) теперь поддерживают [**RFC 6531**](https://python-all.ru/3.7/whatsnew/3.5.html) (SMTPUTF8). (Авторы: Milan Oberkirch и R. David Murray в [bpo-22027](https://python-all.ru/3.7/whatsnew/3.5.html).)

### sndhdr

Функции [`what()`](https://python-all.ru/3.7/library/sndhdr.html#sndhdr.what) и [`whathdr()`](https://python-all.ru/3.7/library/sndhdr.html#sndhdr.whathdr) теперь возвращают [`namedtuple()`](https://python-all.ru/3.7/library/collections.html#collections.namedtuple). (Автор: Claudiu Popa в [bpo-18615](https://python-all.ru/3.7/whatsnew/3.5.html).)

### socket

Функции с тайм-аутами теперь используют монотонные часы вместо системных. (Автор: Victor Stinner в [bpo-22043](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый метод [`socket.sendfile()`](https://python-all.ru/3.7/library/socket.html#socket.socket.sendfile) позволяет отправлять файл через сокет, используя высокопроизводительную функцию [`os.sendfile()`](https://python-all.ru/3.7/library/os.html#os.sendfile) в UNIX, что делает загрузку в 2–3 раза быстрее, чем при использовании обычного [`socket.send()`](https://python-all.ru/3.7/library/socket.html#socket.socket.send). (Автор: Giampaolo Rodola’ в [bpo-17552](https://python-all.ru/3.7/whatsnew/3.5.html).)

Метод [`socket.sendall()`](https://python-all.ru/3.7/library/socket.html#socket.socket.sendall) больше не сбрасывает тайм-аут сокета при каждом получении или отправке байтов. Тайм-аут сокета теперь представляет собой максимальную общую продолжительность отправки всех данных. (Автор: Victor Stinner в [bpo-23853](https://python-all.ru/3.7/whatsnew/3.5.html).)

Аргумент *backlog* метода [`socket.listen()`](https://python-all.ru/3.7/library/socket.html#socket.socket.listen) теперь необязателен. По умолчанию он устанавливается в [`SOMAXCONN`](https://python-all.ru/3.7/library/socket.html#socket.SOMAXCONN) или `128`, в зависимости от того, что меньше. (Автор: Charles-François Natali в [bpo-21455](https://python-all.ru/3.7/whatsnew/3.5.html).)

### ssl

#### Поддержка Memory BIO

(Предложено Geert Jansen в [bpo-21965](https://python-all.ru/3.7/whatsnew/3.5.html).)

Добавлен новый класс [`SSLObject`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLObject) для обеспечения поддержки протокола SSL в тех случаях, когда возможности сетевого ввода-вывода [`SSLSocket`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket) не нужны или неоптимальны. `SSLObject` представляет собой экземпляр протокола SSL, но не реализует методы сетевого ввода-вывода, а вместо этого предоставляет интерфейс с буфером в памяти. Новый класс [`MemoryBIO`](https://python-all.ru/3.7/library/ssl.html#ssl.MemoryBIO) можно использовать для передачи данных между Python и экземпляром протокола SSL.

Поддержка SSL через память BIO предназначена в первую очередь для фреймворков, реализующих асинхронный ввод-вывод, для которых модель готовности [`SSLSocket`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket) («select/poll») неэффективна.

Новый метод [`SSLContext.wrap_bio()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLContext.wrap_bio) можно использовать для создания нового экземпляра `SSLObject`.

#### Поддержка согласования протокола прикладного уровня

(Предложено Benjamin Peterson в [bpo-20188](https://python-all.ru/3.7/whatsnew/3.5.html).)

Если OpenSSL поддерживается, модуль [`ssl`](https://python-all.ru/3.7/library/ssl.html#module-ssl) теперь реализует расширение TLS *Согласование протокола прикладного уровня*, как описано в [**RFC 7301**](https://python-all.ru/3.7/whatsnew/3.5.html).

Новый [`SSLContext.set_alpn_protocols()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLContext.set_alpn_protocols) можно использовать для указания того, какие протоколы сокет должен объявлять во время рукопожатия TLS.

Новый [`SSLSocket.selected_alpn_protocol()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket.selected_alpn_protocol) возвращает протокол, выбранный во время рукопожатия TLS. Флаг [`HAS_ALPN`](https://python-all.ru/3.7/library/ssl.html#ssl.HAS_ALPN) указывает, присутствует ли поддержка ALPN.

#### Прочие изменения

Добавлен новый метод [`SSLSocket.version()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket.version) для запроса фактической используемой версии протокола. (Предложено Antoine Pitrou в [bpo-20421](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`SSLSocket`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket) теперь реализует метод `SSLSocket.sendfile()`. (Предложено Giampaolo Rodola’ в [bpo-17552](https://python-all.ru/3.7/whatsnew/3.5.html).)

Метод `SSLSocket.send()` теперь вызывает исключение [`ssl.SSLWantReadError`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLWantReadError) или [`ssl.SSLWantWriteError`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLWantWriteError) для неблокирующего сокета, если операция заблокировалась. Ранее он возвращал `0`. (Предложено Nikolaus Rath в [bpo-20951](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`cert_time_to_seconds()`](https://python-all.ru/3.7/library/ssl.html#ssl.cert_time_to_seconds) теперь интерпретирует входное время как UTC, а не как местное время, в соответствии с [**RFC 5280**](https://python-all.ru/3.7/whatsnew/3.5.html). Кроме того, возвращаемое значение всегда является [`int`](https://python-all.ru/3.7/library/functions.html#int). (Автор: Akira Li, [bpo-19940](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые методы `SSLObject.shared_ciphers()` и [`SSLSocket.shared_ciphers()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket.shared_ciphers) возвращают список шифров, отправленных клиентом во время рукопожатия. (Предложено Benjamin Peterson в [bpo-23186](https://python-all.ru/3.7/whatsnew/3.5.html).)

Методы [`SSLSocket.do_handshake()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket.do_handshake), [`SSLSocket.read()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket.read), `SSLSocket.shutdown()` и [`SSLSocket.write()`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket.write) класса [`SSLSocket`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLSocket) больше не сбрасывают тайм-аут сокета при каждом получении или отправке байтов. Теперь тайм-аут сокета – это максимальная общая продолжительность работы метода. (Предложено Victor Stinner в [bpo-23853](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`match_hostname()`](https://python-all.ru/3.7/library/ssl.html#ssl.match_hostname) теперь поддерживает сопоставление IP-адресов. (Предложено Antoine Pitrou в [bpo-23239](https://python-all.ru/3.7/whatsnew/3.5.html).)

### sqlite3

Класс [`Row`](https://python-all.ru/3.7/library/sqlite3.html#sqlite3.Row) теперь полностью поддерживает протокол последовательности, в частности итерацию [`reversed()`](https://python-all.ru/3.7/library/functions.html#reversed) и индексацию по срезам. (Предложено Claudiu Popa в [bpo-10203](https://python-all.ru/3.7/whatsnew/3.5.html); Lucas Sinclair, Jessica McKellar и Serhiy Storchaka в [bpo-13583](https://python-all.ru/3.7/whatsnew/3.5.html).)

### подпроцесс

Добавлена новая функция [`run()`](https://python-all.ru/3.7/library/subprocess.html#subprocess.run). Она запускает указанную команду и возвращает объект [`CompletedProcess`](https://python-all.ru/3.7/library/subprocess.html#subprocess.CompletedProcess), описывающий завершённый процесс. Новый API более согласован и является рекомендуемым способом вызова подпроцессов в коде Python, который не требует совместимости с более ранними версиями Python. (Предложено Thomas Kluyver в [bpo-23342](https://python-all.ru/3.7/whatsnew/3.5.html).)

Примеры:

```python
>>> subprocess.run(["ls", "-l"])  # не захватывает вывод
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()`](https://python-all.ru/3.7/library/sys.html#sys.set_coroutine_wrapper) function allows setting a global hook that will be called whenever a [coroutine object](https://python-all.ru/3.7/glossary.html#term-coroutine) is created by an [`async def`](https://python-all.ru/3.7/reference/compound_stmts.html#async-def) function. A corresponding [`get_coroutine_wrapper()`](https://python-all.ru/3.7/library/sys.html#sys.get_coroutine_wrapper) can be used to obtain a currently set wrapper. Both functions are [provisional](https://python-all.ru/3.7/glossary.html#term-provisional-api), and are intended for debugging purposes only. (Contributed by Yury Selivanov in [bpo-24017](https://python-all.ru/3.7/whatsnew/3.5.html).)

A new [`is_finalizing()`](https://python-all.ru/3.7/library/sys.html#sys.is_finalizing) function can be used to check if the Python interpreter is [shutting down](https://python-all.ru/3.7/glossary.html#term-interpreter-shutdown). (Contributed by Antoine Pitrou in [bpo-22696](https://python-all.ru/3.7/whatsnew/3.5.html).)

### sysconfig

Имя каталога сценариев пользователя в Windows теперь включает первые два компонента версии Python. (Предложено Paul Moore в [bpo-23437](https://python-all.ru/3.7/whatsnew/3.5.html).)

### tarfile

Аргумент *mode* функции [`open()`](https://python-all.ru/3.7/library/tarfile.html#tarfile.open) теперь принимает `"x"` для запроса эксклюзивного создания. (Предложено Berker Peksag в [bpo-21717](https://python-all.ru/3.7/whatsnew/3.5.html).)

Методы [`TarFile.extractall()`](https://python-all.ru/3.7/library/tarfile.html#tarfile.TarFile.extractall) и [`TarFile.extract()`](https://python-all.ru/3.7/library/tarfile.html#tarfile.TarFile.extract) теперь принимают именованный аргумент *numeric\_owner*. Если он установлен в `True`, извлечённые файлы и каталоги будут принадлежать числовому `uid` и `gid` из tar-файла. Если установлен в `False` (значение по умолчанию, и поведение в версиях до 3.5), они будут принадлежать указанным по имени пользователю и группе из tar-файла. (Предложено Michael Vogt и Eric Smith в [bpo-23193](https://python-all.ru/3.7/whatsnew/3.5.html).)

[`TarFile.list()`](https://python-all.ru/3.7/library/tarfile.html#tarfile.TarFile.list) теперь принимает необязательный именованный аргумент *members*, который можно установить на подмножество списка, возвращаемого [`TarFile.getmembers()`](https://python-all.ru/3.7/library/tarfile.html#tarfile.TarFile.getmembers). (Предложено Serhiy Storchaka в [bpo-21549](https://python-all.ru/3.7/whatsnew/3.5.html).)

### threading

Оба метода [`Lock.acquire()`](https://python-all.ru/3.7/library/threading.html#threading.Lock.acquire) и [`RLock.acquire()`](https://python-all.ru/3.7/library/threading.html#threading.RLock.acquire) теперь используют монотонные часы для управления тайм-аутом. (Предложено Виктором Стиннером в [bpo-22043](https://python-all.ru/3.7/whatsnew/3.5.html).)

### time

Функция [`monotonic()`](https://python-all.ru/3.7/library/time.html#time.monotonic) теперь всегда доступна. (Предложено Виктором Стиннером в [bpo-22043](https://python-all.ru/3.7/whatsnew/3.5.html).)

### timeit

Новый параметр командной строки `-u` или `--unit=U` позволяет указать единицу времени для вывода таймера. Поддерживаемые варианты: `usec`, `msec` или `sec`. (Предложено Джулианом Гинди в [bpo-18983](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`timeit()`](https://python-all.ru/3.7/library/timeit.html#timeit.timeit) получила новый параметр *globals* для указания пространства имён, в котором будет выполняться код. (Предложено Беном Робертсом в [bpo-2527](https://python-all.ru/3.7/whatsnew/3.5.html).)

### tkinter

Модуль `tkinter._fix`, использовавшийся для настройки окружения Tcl/Tk в Windows, был заменён на приватную функцию в модуле `_tkinter`, которая не вносит постоянных изменений в переменные окружения. (Предложено Закари Уэром в [bpo-20035](https://python-all.ru/3.7/whatsnew/3.5.html).)

### traceback

Новые функции [`walk_stack()`](https://python-all.ru/3.7/library/traceback.html#traceback.walk_stack) и [`walk_tb()`](https://python-all.ru/3.7/library/traceback.html#traceback.walk_tb) для удобного обхода объектов frame и traceback. (Автор: Robert Collins, [bpo-17911](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые облегчённые классы: [`TracebackException`](https://python-all.ru/3.7/library/traceback.html#traceback.TracebackException), [`StackSummary`](https://python-all.ru/3.7/library/traceback.html#traceback.StackSummary) и [`FrameSummary`](https://python-all.ru/3.7/library/traceback.html#traceback.FrameSummary). (Предложено Робертом Коллинзом в [bpo-17911](https://python-all.ru/3.7/whatsnew/3.5.html).)

Обе функции [`print_tb()`](https://python-all.ru/3.7/library/traceback.html#traceback.print_tb) и [`print_stack()`](https://python-all.ru/3.7/library/traceback.html#traceback.print_stack) теперь поддерживают отрицательные значения для аргумента *limit*. (Предложено Дмитрием Казаковым в [bpo-22619](https://python-all.ru/3.7/whatsnew/3.5.html).)

### types

Новая функция [`coroutine()`](https://python-all.ru/3.7/library/types.html#types.coroutine) для преобразования [генераторов](https://python-all.ru/3.7/glossary.html#term-generator-iterator) и объектов [`generator-like`](https://python-all.ru/3.7/library/collections.abc.html#collections.abc.Generator) в [ожидаемые объекты](https://python-all.ru/3.7/glossary.html#term-awaitable). (Предложено Юрием Селивановым в [bpo-24017](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый тип с именем [`CoroutineType`](https://python-all.ru/3.7/library/types.html#types.CoroutineType), который используется для объектов [корутин](https://python-all.ru/3.7/glossary.html#term-coroutine), создаваемых функциями [`async def`](https://python-all.ru/3.7/reference/compound_stmts.html#async-def). (Предложено Юрием Селивановым в [bpo-24400](https://python-all.ru/3.7/whatsnew/3.5.html).)

### unicodedata

Модуль [`unicodedata`](https://python-all.ru/3.7/library/unicodedata.html#module-unicodedata) теперь использует данные из [Unicode 8.0.0](https://python-all.ru/3.7/whatsnew/3.5.html).

### unittest

Метод [`TestLoader.loadTestsFromModule()`](https://python-all.ru/3.7/library/unittest.html#unittest.TestLoader.loadTestsFromModule) теперь принимает ключевой аргумент *pattern*, который передаётся в `load_tests` в качестве третьего аргумента. Найденные пакеты теперь проверяются на наличие `load_tests` независимо от того, совпадает ли их путь с *pattern*, потому что имя пакета не может совпадать с шаблоном по умолчанию. (Предложено Робертом Коллинзом и Барри А. Варшавой в [bpo-16662](https://python-all.ru/3.7/whatsnew/3.5.html).)

Ошибки обнаружения тестов теперь доступны в атрибуте [`TestLoader.errors`](https://python-all.ru/3.7/library/unittest.html#unittest.TestLoader.errors) экземпляра [`TestLoader`](https://python-all.ru/3.7/library/unittest.html#unittest.TestLoader). (Предложено Робертом Коллинзом в [bpo-19746](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый параметр командной строки `--locals` для отображения локальных переменных в трассировках. (Предложено Робертом Коллинзом в [bpo-22936](https://python-all.ru/3.7/whatsnew/3.5.html).)

### unittest.mock

Класс [`Mock`](https://python-all.ru/3.7/library/unittest.mock.html#unittest.mock.Mock) получил следующие улучшения:

- Конструктор класса получил новый параметр *unsafe*, который заставляет объекты mock вызывать [`AttributeError`](https://python-all.ru/3.7/library/exceptions.html#AttributeError) для имён атрибутов, начинающихся с `"assert"`. (Предложено Кушалом Дасом в [bpo-21238](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Новый метод [`Mock.assert_not_called()`](https://python-all.ru/3.7/library/unittest.mock.html#unittest.mock.Mock.assert_not_called) для проверки, был ли вызван объект mock. (Предложено Кушалом Дасом в [bpo-21262](https://python-all.ru/3.7/whatsnew/3.5.html).)

Класс [`MagicMock`](https://python-all.ru/3.7/library/unittest.mock.html#unittest.mock.MagicMock) теперь поддерживает операторы [`__truediv__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__truediv__), [`__divmod__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__divmod__) и [`__matmul__()`](https://python-all.ru/3.7/reference/datamodel.html#object.__matmul__). (Вклад: Johannes Baiter в [bpo-20968](https://python-all.ru/3.7/whatsnew/3.5.html), и Håkan Lövdahl в [bpo-23581](https://python-all.ru/3.7/whatsnew/3.5.html) и [bpo-23568](https://python-all.ru/3.7/whatsnew/3.5.html).)

Больше нет необходимости явно передавать `create=True` функции [`patch()`](https://python-all.ru/3.7/library/unittest.mock.html#unittest.mock.patch) при подмене встроенных имён. (Предложено Кушалом Дасом в [bpo-17660](https://python-all.ru/3.7/whatsnew/3.5.html).)

### urllib

Новый класс [`request.HTTPPasswordMgrWithPriorAuth`](https://python-all.ru/3.7/library/urllib.request.html#urllib.request.HTTPPasswordMgrWithPriorAuth) позволяет управлять учётными данными HTTP Basic Authentication, чтобы исключить ненужную обработку ответа `401` или безусловно отправлять учётные данные в первом запросе для взаимодействия с серверами, которые возвращают ответ `404` вместо `401`, если заголовок `Authorization` не отправлен. (Предложено Матеем Цеплом в [bpo-19494](https://python-all.ru/3.7/whatsnew/3.5.html) и Акшитом Кхураной в [bpo-7159](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новый аргумент *quote\_via* для функции [`parse.urlencode()`](https://python-all.ru/3.7/library/urllib.parse.html#urllib.parse.urlencode) предоставляет способ управлять кодировкой частей запроса при необходимости. (Предложено Samwyse и Арноном Яари в [bpo-13866](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`request.urlopen()`](https://python-all.ru/3.7/library/urllib.request.html#urllib.request.urlopen) принимает объект [`ssl.SSLContext`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLContext) в качестве аргумента *context*, который будет использоваться для HTTPS-соединения. (Предложено Алексом Гейнором в [bpo-22366](https://python-all.ru/3.7/whatsnew/3.5.html).)

The [`parse.urljoin()`](https://python-all.ru/3.7/library/urllib.parse.html#urllib.parse.urljoin) was updated to use the [**RFC 3986**](https://python-all.ru/3.7/whatsnew/3.5.html) semantics for the resolution of relative URLs, rather than [**RFC 1808**](https://python-all.ru/3.7/whatsnew/3.5.html) and [**RFC 2396**](https://python-all.ru/3.7/whatsnew/3.5.html). (Contributed by Demian Brecht and Senthil Kumaran in [bpo-22118](https://python-all.ru/3.7/whatsnew/3.5.html).)

### wsgiref

Аргумент *headers* конструктора класса [`headers.Headers`](https://python-all.ru/3.7/library/wsgiref.html#wsgiref.headers.Headers) теперь необязателен. (Авторы: Pablo Torres Navarrete и SilentGhost в [bpo-5800](https://python-all.ru/3.7/whatsnew/3.5.html).)

### xmlrpc

Класс [`client.ServerProxy`](https://python-all.ru/3.7/library/xmlrpc.client.html#xmlrpc.client.ServerProxy) теперь поддерживает протокол [контекстного менеджера](https://python-all.ru/3.7/glossary.html#term-context-manager). (Автор: Claudiu Popa в [bpo-20627](https://python-all.ru/3.7/whatsnew/3.5.html).)

Конструктор [`client.ServerProxy`](https://python-all.ru/3.7/library/xmlrpc.client.html#xmlrpc.client.ServerProxy) теперь принимает необязательный экземпляр [`ssl.SSLContext`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLContext). (Автор: Alex Gaynor в [bpo-22960](https://python-all.ru/3.7/whatsnew/3.5.html).)

### xml.sax

SAX-парсеры теперь поддерживают символьный поток объекта [`xmlreader.InputSource`](https://python-all.ru/3.7/library/xml.sax.reader.html#xml.sax.xmlreader.InputSource). (Автор: Serhiy Storchaka в [bpo-2175](https://python-all.ru/3.7/whatsnew/3.5.html).)

[`parseString()`](https://python-all.ru/3.7/library/xml.sax.html#xml.sax.parseString) теперь принимает экземпляр [`str`](https://python-all.ru/3.7/library/stdtypes.html#str). (Автор: Serhiy Storchaka в [bpo-10590](https://python-all.ru/3.7/whatsnew/3.5.html).)

### zipfile

Вывод ZIP теперь можно записывать в непозиционируемые потоки. (Автор: Serhiy Storchaka в [bpo-23252](https://python-all.ru/3.7/whatsnew/3.5.html).)

Аргумент *mode* метода [`ZipFile.open()`](https://python-all.ru/3.7/library/zipfile.html#zipfile.ZipFile.open) теперь принимает `"x"` для запроса эксклюзивного создания. (Автор: Serhiy Storchaka в [bpo-21717](https://python-all.ru/3.7/whatsnew/3.5.html).)

## Прочие изменения на уровне модулей

Многие функции в модулях [`mmap`](https://python-all.ru/3.7/library/mmap.html#module-mmap), [`ossaudiodev`](https://python-all.ru/3.7/library/ossaudiodev.html#module-ossaudiodev), [`socket`](https://python-all.ru/3.7/library/socket.html#module-socket), [`ssl`](https://python-all.ru/3.7/library/ssl.html#module-ssl) и [`codecs`](https://python-all.ru/3.7/library/codecs.html#module-codecs) теперь принимают записываемые [байтоподобные объекты](https://python-all.ru/3.7/glossary.html#term-bytes-like-object). (Автор: Serhiy Storchaka в [bpo-23001](https://python-all.ru/3.7/whatsnew/3.5.html).)

## Оптимизации

Функция [`os.walk()`](https://python-all.ru/3.7/library/os.html#os.walk) ускорена в 3–5 раз на POSIX-системах и в 7–20 раз на Windows. Это было сделано с помощью новой функции [`os.scandir()`](https://python-all.ru/3.7/library/os.html#os.scandir), которая предоставляет информацию о файлах из системных вызовов `readdir` или `FindFirstFile`/`FindNextFile`. (Автор: Ben Hoyt при содействии Victor Stinner в [bpo-23605](https://python-all.ru/3.7/whatsnew/3.5.html).)

Создание `bytes(int)` (заполненного нулевыми байтами) стало быстрее и использует меньше памяти для больших объектов. Для выделения памяти под эти объекты применяется `calloc()` вместо `malloc()`. (Автор: Victor Stinner в [bpo-21233](https://python-all.ru/3.7/whatsnew/3.5.html).)

Некоторые операции над [`ipaddress`](https://python-all.ru/3.7/library/ipaddress.html#module-ipaddress), [`IPv4Network`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv4Network) и [`IPv6Network`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv6Network) значительно ускорены, например [`subnets()`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv4Network.subnets), [`supernet()`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.IPv4Network.supernet), [`summarize_address_range()`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.summarize_address_range), [`collapse_addresses()`](https://python-all.ru/3.7/library/ipaddress.html#ipaddress.collapse_addresses). Ускорение может составлять от 3 до 15 раз. (Авторы: Antoine Pitrou, Michel Albert и Markus в [bpo-21486](https://python-all.ru/3.7/whatsnew/3.5.html), [bpo-21487](https://python-all.ru/3.7/whatsnew/3.5.html), [bpo-20826](https://python-all.ru/3.7/whatsnew/3.5.html), [bpo-23266](https://python-all.ru/3.7/whatsnew/3.5.html).)

Сериализация объектов [`ipaddress`](https://python-all.ru/3.7/library/ipaddress.html#module-ipaddress) оптимизирована для получения значительно меньшего вывода. (Автор: Serhiy Storchaka в [bpo-23133](https://python-all.ru/3.7/whatsnew/3.5.html).)

Многие операции над [`io.BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO) теперь выполняются на 50–100% быстрее. (Авторы: Serhiy Storchaka в [bpo-15381](https://python-all.ru/3.7/whatsnew/3.5.html) и David Wilson в [bpo-22003](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`marshal.dumps()`](https://python-all.ru/3.7/library/marshal.html#marshal.dumps) теперь работает быстрее: на 65–85% для версий 3 и 4, на 20–25% для версий 0–2 на типичных данных и до 5 раз в лучших случаях. (Автор: Serhiy Storchaka в [bpo-20416](https://python-all.ru/3.7/whatsnew/3.5.html) и [bpo-23344](https://python-all.ru/3.7/whatsnew/3.5.html).)

Кодировщик UTF-32 теперь работает в 3–7 раз быстрее. (Автор: Serhiy Storchaka в [bpo-15027](https://python-all.ru/3.7/whatsnew/3.5.html).)

Регулярные выражения теперь разбираются до 10% быстрее. (Автор: Serhiy Storchaka в [bpo-19380](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`json.dumps()`](https://python-all.ru/3.7/library/json.html#json.dumps) оптимизирована так, что работает с `ensure_ascii=False` так же быстро, как с `ensure_ascii=True`. (Автор: Naoki Inada в [bpo-23206](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`PyObject_IsInstance()`](https://python-all.ru/3.7/c-api/object.html#c.PyObject_IsInstance) и [`PyObject_IsSubclass()`](https://python-all.ru/3.7/c-api/object.html#c.PyObject_IsSubclass) ускорены в типичном случае, когда второй аргумент имеет [`type`](https://python-all.ru/3.7/library/functions.html#type) в качестве метакласса. (Автор: Georg Brandl в [bpo-22540](https://python-all.ru/3.7/whatsnew/3.5.html).)

Кеширование методов было немного улучшено, что дало до 5% прироста производительности в некоторых тестах. (Автор: Antoine Pitrou в [bpo-22847](https://python-all.ru/3.7/whatsnew/3.5.html).)

Объекты из модуля [`random`](https://python-all.ru/3.7/library/random.html#module-random) теперь используют на 50% меньше памяти в 64-битных сборках. (Автор: Serhiy Storchaka в [bpo-23488](https://python-all.ru/3.7/whatsnew/3.5.html).)

Вызовы геттера [`property()`](https://python-all.ru/3.7/library/functions.html#property) стали до 25% быстрее. (Автор: Joe Jevnik в [bpo-23910](https://python-all.ru/3.7/whatsnew/3.5.html).)

Создание экземпляра [`fractions.Fraction`](https://python-all.ru/3.7/library/fractions.html#fractions.Fraction) теперь до 30% быстрее. (Автор: Stefan Behnel в [bpo-22464](https://python-all.ru/3.7/whatsnew/3.5.html).)

Строковые методы [`find()`](https://python-all.ru/3.7/library/stdtypes.html#str.find), [`rfind()`](https://python-all.ru/3.7/library/stdtypes.html#str.rfind), [`split()`](https://python-all.ru/3.7/library/stdtypes.html#str.split), [`partition()`](https://python-all.ru/3.7/library/stdtypes.html#str.partition) и оператор [`in`](https://python-all.ru/3.7/reference/expressions.html#in) теперь значительно быстрее при поиске подстрок из одного символа. (Автор: Serhiy Storchaka в [bpo-23573](https://python-all.ru/3.7/whatsnew/3.5.html).)

## Изменения в сборке и C API

Добавлены новые функции `calloc`:

- [`PyMem_RawCalloc()`](https://python-all.ru/3.7/c-api/memory.html#c.PyMem_RawCalloc),
- [`PyMem_Calloc()`](https://python-all.ru/3.7/c-api/memory.html#c.PyMem_Calloc),
- [`PyObject_Calloc()`](https://python-all.ru/3.7/c-api/memory.html#c.PyObject_Calloc).

(Автор: Victor Stinner в [bpo-21233](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые вспомогательные функции кодирования/декодирования:

- [`Py_DecodeLocale()`](https://python-all.ru/3.7/c-api/sys.html#c.Py_DecodeLocale) (заменён `_Py_char2wchar()`),
- [`Py_EncodeLocale()`](https://python-all.ru/3.7/c-api/sys.html#c.Py_EncodeLocale) (заменён `_Py_wchar2char()`).

(Предложено Victor Stinner в [bpo-18395](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новая функция [`PyCodec_NameReplaceErrors()`](https://python-all.ru/3.7/c-api/codec.html#c.PyCodec_NameReplaceErrors) для замены ошибки кодирования unicode на управляющие последовательности `\N{...}`. (Предложено Serhiy Storchaka в [bpo-19676](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новая функция [`PyErr_FormatV()`](https://python-all.ru/3.7/c-api/exceptions.html#c.PyErr_FormatV), аналогичная [`PyErr_Format()`](https://python-all.ru/3.7/c-api/exceptions.html#c.PyErr_Format), но принимающая аргумент `va_list`. (Предложено Antoine Pitrou в [bpo-18711](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новое исключение `PyExc_RecursionError`. (Предложено Georg Brandl в [bpo-19235](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые функции [`PyModule_FromDefAndSpec()`](https://python-all.ru/3.7/c-api/module.html#c.PyModule_FromDefAndSpec), [`PyModule_FromDefAndSpec2()`](https://python-all.ru/3.7/c-api/module.html#c.PyModule_FromDefAndSpec2) и [`PyModule_ExecDef()`](https://python-all.ru/3.7/c-api/module.html#c.PyModule_ExecDef), введённые [**PEP 489**](https://python-all.ru/3.7/whatsnew/3.5.html) – многофазная инициализация модулей расширения. (Предложено Petr Viktorin в [bpo-24268](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новые функции [`PyNumber_MatrixMultiply()`](https://python-all.ru/3.7/c-api/number.html#c.PyNumber_MatrixMultiply) и [`PyNumber_InPlaceMatrixMultiply()`](https://python-all.ru/3.7/c-api/number.html#c.PyNumber_InPlaceMatrixMultiply) для умножения матриц. (Предложено Benjamin Peterson в [bpo-21176](https://python-all.ru/3.7/whatsnew/3.5.html). См. также [**PEP 465**](https://python-all.ru/3.7/whatsnew/3.5.html) для подробностей.)

Слот [`PyTypeObject.tp_finalize`](https://python-all.ru/3.7/c-api/typeobj.html#c.PyTypeObject.tp_finalize) теперь является частью стабильного ABI.

Сборки для Windows теперь требуют Microsoft Visual C++ 14.0, который доступен в составе [Visual Studio 2015](https://python-all.ru/3.7/whatsnew/3.5.html).

Модули расширения теперь включают метку информации о платформе в своё имя файла на некоторых платформах (метка необязательна, и 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`, за исключением расширений, собранных для работы с 32-битным ABI на 64-битных платформах; в этом случае он равен `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` для Win64, `win_ia64` для Windows Itanium 64 и `win_arm` для Windows на ARM.
  - Если собрано в режиме отладки, `<debug>` будет `_d`, иначе он будет пустым.
- На платформах OS X имена файлов модулей расширения теперь заканчиваются на `-darwin.so`.
- На всех остальных платформах имена файлов модулей расширения такие же, как в Python 3.4.

## Устарело

### Новые ключевые слова

`async` и `await` не рекомендуется использовать в качестве имён переменных, классов, функций или модулей. Введённые [**PEP 492**](https://python-all.ru/3.7/whatsnew/3.5.html) в Python 3.5, они станут полноценными ключевыми словами в Python 3.7.

### Устаревшее поведение Python

Возбуждение исключения [`StopIteration`](https://python-all.ru/3.7/library/exceptions.html#StopIteration) внутри генератора теперь будет вызывать скрытое [`PendingDeprecationWarning`](https://python-all.ru/3.7/library/exceptions.html#PendingDeprecationWarning), которое станет явным предупреждением об устаревании в Python 3.6 и вызовет [`RuntimeError`](https://python-all.ru/3.7/library/exceptions.html#RuntimeError) в Python 3.7. См. [PEP 479: Change StopIteration handling inside generators](https://python-all.ru/3.7/whatsnew/3.5.html#whatsnew-pep-479) для подробностей.

### Неподдерживаемые операционные системы

Windows XP больше не поддерживается Microsoft, поэтому в соответствии с [**PEP 11**](https://python-all.ru/3.7/whatsnew/3.5.html) CPython 3.5 официально больше не поддерживается на этой ОС.

### Устаревшие модули, функции и методы Python

Модуль [`formatter`](https://python-all.ru/3.7/library/formatter.html#module-formatter) теперь полностью устарел и по-прежнему планируется к удалению в Python 3.6.

Функция `asyncio.async()` устарела; вместо неё следует использовать [`ensure_future()`](https://python-all.ru/3.7/library/asyncio-future.html#asyncio.ensure_future).

Модуль [`smtpd`](https://python-all.ru/3.7/library/smtpd.html#module-smtpd) в прошлом всегда декодировал часть DATA сообщений электронной почты с помощью кодеков `utf-8`. Теперь это можно контролировать с помощью нового ключевого слова *decode\_data* в функции [`SMTPServer`](https://python-all.ru/3.7/library/smtpd.html#smtpd.SMTPServer). Значение по умолчанию – `True`, но это значение по умолчанию устарело. Укажите ключевое слово *decode\_data* с подходящим значением, чтобы избежать предупреждения об устаревании.

Прямое присваивание значений атрибутам [`key`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.key), [`value`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.value) и [`coded_value`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.coded_value) объектов [`http.cookies.Morsel`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel) устарело. Вместо этого используйте метод [`set()`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.set). Кроме того, недокументированный параметр *LegalChars* функции [`set()`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.set) устарел и теперь игнорируется.

Передача строки формата в качестве ключевого аргумента *format\_string* методу [`format()`](https://python-all.ru/3.7/library/string.html#string.Formatter.format) класса [`string.Formatter`](https://python-all.ru/3.7/library/string.html#string.Formatter) устарела. (Предложено Сергеем Сторчакой в [bpo-23671](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`platform.dist()`](https://python-all.ru/3.7/library/platform.html#platform.dist) и [`platform.linux_distribution()`](https://python-all.ru/3.7/library/platform.html#platform.linux_distribution) теперь устарели. Дистрибутивы Linux используют слишком много разных способов описания себя, поэтому функциональность оставлена на усмотрение пакета. (Предложено Vajrasky Kok и Berker Peksag в [bpo-1322](https://python-all.ru/3.7/whatsnew/3.5.html).)

Ранее недокументированные методы `from_function` и `from_builtin` класса [`inspect.Signature`](https://python-all.ru/3.7/library/inspect.html#inspect.Signature) устарели. Вместо них используйте новый метод [`Signature.from_callable()`](https://python-all.ru/3.7/library/inspect.html#inspect.Signature.from_callable). (Предложено Юрием Селивановым в [bpo-24248](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функция [`inspect.getargspec()`](https://python-all.ru/3.7/library/inspect.html#inspect.getargspec) устарела и запланирована к удалению в Python 3.6. (Подробнее см. [bpo-20438](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`inspect`](https://python-all.ru/3.7/library/inspect.html#module-inspect) [`getfullargspec()`](https://python-all.ru/3.7/library/inspect.html#inspect.getfullargspec), [`getcallargs()`](https://python-all.ru/3.7/library/inspect.html#inspect.getcallargs) и [`formatargspec()`](https://python-all.ru/3.7/library/inspect.html#inspect.formatargspec) устарели; вместо них следует использовать [`inspect.signature()`](https://python-all.ru/3.7/library/inspect.html#inspect.signature) API. (Предложено Юрием Селивановым в [bpo-20438](https://python-all.ru/3.7/whatsnew/3.5.html).)

Функции [`getargvalues()`](https://python-all.ru/3.7/library/inspect.html#inspect.getargvalues) и [`formatargvalues()`](https://python-all.ru/3.7/library/inspect.html#inspect.formatargvalues) были случайно помечены как устаревшие в выпуске Python 3.5.0.

Использование флага [`re.LOCALE`](https://python-all.ru/3.7/library/re.html#re.LOCALE) с шаблонами str или [`re.ASCII`](https://python-all.ru/3.7/library/re.html#re.ASCII) теперь устарело. (Предложено Сергеем Сторчакой в [bpo-22407](https://python-all.ru/3.7/whatsnew/3.5.html).)

Использование нераспознаваемых специальных последовательностей, состоящих из `'\'` и буквы ASCII, в шаблонах регулярных выражений и шаблонах замены теперь вызывает предупреждение об устаревании и будет запрещено в Python 3.6. (Предложено Сергеем Сторчакой в [bpo-23622](https://python-all.ru/3.7/whatsnew/3.5.html).)

Недокументированный и неофициальный аргумент по умолчанию *use\_load\_tests* метода [`unittest.TestLoader.loadTestsFromModule()`](https://python-all.ru/3.7/library/unittest.html#unittest.TestLoader.loadTestsFromModule) теперь устарел и игнорируется. (Предложено Robert Collins и Barry A. Warsaw в [bpo-16662](https://python-all.ru/3.7/whatsnew/3.5.html).)

## Удалено

### Удаление API и функций

Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:

- Атрибут `__version__` был удалён из пакета email. Код email уже давно не поставлялся отдельно от стандартной библиотеки, а строка `__version__` не обновлялась в последних нескольких выпусках.
- Внутренний класс `Netrc` в модуле [`ftplib`](https://python-all.ru/3.7/library/ftplib.html#module-ftplib) был объявлен устаревшим в версии 3.4 и теперь удалён. (Предложено Matt Chaput в [bpo-6623](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Концепция файлов `.pyo` была удалена.
- Класс JoinableQueue в экспериментальном модуле [`asyncio`](https://python-all.ru/3.7/library/asyncio.html#module-asyncio) был объявлен устаревшим в версии 3.4.4 и теперь удалён. (Предложено A. Jesse Jiryu Davis в [bpo-23464](https://python-all.ru/3.7/whatsnew/3.5.html).)

## Переход на Python 3.5

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.

### Изменения в поведении Python

- Из-за недосмотра более ранние версии Python ошибочно принимали следующий синтаксис:

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

  Python 3.5 теперь корректно вызывает исключение [`SyntaxError`](https://python-all.ru/3.7/library/exceptions.html#SyntaxError), так как выражения-генераторы должны быть заключены в круглые скобки, если они не являются единственным аргументом функции.

### Изменения в Python API

- [**PEP 475**](https://python-all.ru/3.7/whatsnew/3.5.html): Системные вызовы теперь повторяются при прерывании сигналом вместо возбуждения [`InterruptedError`](https://python-all.ru/3.7/library/exceptions.html#InterruptedError), если обработчик сигнала Python не возбуждает исключение.
- До Python 3.5 объект [`datetime.time`](https://python-all.ru/3.7/library/datetime.html#datetime.time) считался ложным, если он представлял полночь по UTC. Такое поведение считалось неочевидным и подверженным ошибкам и было удалено в Python 3.5. Подробнее см. [bpo-13936](https://python-all.ru/3.7/whatsnew/3.5.html).
- Метод `ssl.SSLSocket.send()` теперь возбуждает либо [`ssl.SSLWantReadError`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLWantReadError), либо [`ssl.SSLWantWriteError`](https://python-all.ru/3.7/library/ssl.html#ssl.SSLWantWriteError) на неблокирующем сокете, если операция заблокируется. Ранее он возвращал `0`. (Предложено Nikolaus Rath в [bpo-20951](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Атрибут `__name__` генераторов теперь берётся из имени функции, а не из имени кода. Используйте `gen.gi_code.co_name` для получения имени кода. У генераторов также появился новый атрибут `__qualname__` – уточнённое имя, которое теперь используется для представления генератора (`repr(gen)`). (Предложено Victor Stinner в [bpo-21205](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Устаревший режим «strict» и аргумент функций [`HTMLParser`](https://python-all.ru/3.7/library/html.parser.html#html.parser.HTMLParser), `HTMLParser.error()` и исключения `HTMLParserError` были удалены. (Предложено Ezio Melotti в [bpo-15114](https://python-all.ru/3.7/whatsnew/3.5.html).) Аргумент *convert\_charrefs* функции [`HTMLParser`](https://python-all.ru/3.7/library/html.parser.html#html.parser.HTMLParser) теперь по умолчанию равен `True`. (Предложено Berker Peksag в [bpo-21047](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Хотя это формально не является частью API, для целей переноса (например, исправления тестов) стоит отметить, что сообщения об ошибках, которые ранее имели вид «'sometype' не поддерживает буферный протокол», теперь имеют вид «a [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) is required, not 'sometype'». (Предложено Ezio Melotti в [bpo-16518](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Если текущая директория установлена на директорию, которой больше не существует, то [`FileNotFoundError`](https://python-all.ru/3.7/library/exceptions.html#FileNotFoundError) больше не будет возбуждаться, а [`find_spec()`](https://python-all.ru/3.7/library/importlib.html#importlib.machinery.FileFinder.find_spec) вернёт `None` **без** кэширования `None` в [`sys.path_importer_cache`](https://python-all.ru/3.7/library/sys.html#sys.path_importer_cache), что отличается от типичного случая ([bpo-22834](https://python-all.ru/3.7/whatsnew/3.5.html)).
- Коды состояния HTTP и сообщения из [`http.client`](https://python-all.ru/3.7/library/http.client.html#module-http.client) и [`http.server`](https://python-all.ru/3.7/library/http.server.html#module-http.server) были реорганизованы в общее перечисление [`HTTPStatus`](https://python-all.ru/3.7/library/http.html#http.HTTPStatus). Значения в [`http.client`](https://python-all.ru/3.7/library/http.client.html#module-http.client) и [`http.server`](https://python-all.ru/3.7/library/http.server.html#module-http.server) остаются доступными для обратной совместимости. (Автор: Demian Brecht, [bpo-21793](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Если загрузчик импорта определяет `importlib.machinery.Loader.exec_module()`, то ожидается, что он также определяет `create_module()` (сейчас это вызывает [`DeprecationWarning`](https://python-all.ru/3.7/library/exceptions.html#DeprecationWarning), а в Python 3.6 станет ошибкой). Если загрузчик наследует от [`importlib.abc.Loader`](https://python-all.ru/3.7/library/importlib.html#importlib.abc.Loader), то ничего делать не нужно; в противном случае просто определите `create_module()` так, чтобы он возвращал `None`. (Автор: Brett Cannon, [bpo-23014](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Функция [`re.split()`](https://python-all.ru/3.7/library/re.html#re.split) всегда игнорировала пустые совпадения с шаблоном, поэтому шаблон `"x*"` работал так же, как `"x+"`, а шаблон `"\b"` никогда не работал. Теперь [`re.split()`](https://python-all.ru/3.7/library/re.html#re.split) выдаёт предупреждение, если шаблон может совпадать с пустой строкой. Для совместимости используйте шаблоны, которые никогда не совпадают с пустой строкой (например, `"x+"` вместо `"x*"`). Шаблоны, которые могут совпадать только с пустой строкой (такие как `"\b"`), теперь вызывают ошибку. (Автор: Serhiy Storchaka, [bpo-22818](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Интерфейс, подобный словарю, для [`http.cookies.Morsel`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel) стал самосогласованным: сравнение morsel теперь учитывает [`key`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.key) и [`value`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.value), [`copy()`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.copy) теперь возвращает экземпляр [`Morsel`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel), а не [`dict`](https://python-all.ru/3.7/library/stdtypes.html#dict), а [`update()`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.update) теперь будет вызывать исключение, если какой-либо из ключей в обновляемом словаре недействителен. Кроме того, недокументированный параметр *LegalChars* функции [`set()`](https://python-all.ru/3.7/library/http.cookies.html#http.cookies.Morsel.set) устарел и теперь игнорируется. (Автор: Demian Brecht, [bpo-2211](https://python-all.ru/3.7/whatsnew/3.5.html).)
- [**PEP 488**](https://python-all.ru/3.7/whatsnew/3.5.html) has removed `.pyo` files from Python and introduced the optional `opt-` tag in `.pyc` file names. The [`importlib.util.cache_from_source()`](https://python-all.ru/3.7/library/importlib.html#importlib.util.cache_from_source) has gained an *optimization* parameter to help control the `opt-` tag. Because of this, the *debug\_override* parameter of the function is now deprecated. *.pyo* files are also no longer supported as a file argument to the Python interpreter and thus serve no purpose when distributed on their own (i.e. sourceless code distribution). Due to the fact that the magic number for bytecode has changed in Python 3.5, all old *.pyo* files from previous versions of Python are invalid regardless of this PEP.
- Модуль [`socket`](https://python-all.ru/3.7/library/socket.html#module-socket) теперь экспортирует константу [`CAN_RAW_FD_FRAMES`](https://python-all.ru/3.7/library/socket.html#socket.CAN_RAW_FD_FRAMES) в linux 3.6 и выше.
- Функция [`ssl.cert_time_to_seconds()`](https://python-all.ru/3.7/library/ssl.html#ssl.cert_time_to_seconds) теперь интерпретирует входное время как UTC, а не как местное время, в соответствии с [**RFC 5280**](https://python-all.ru/3.7/whatsnew/3.5.html). Кроме того, возвращаемое значение всегда является [`int`](https://python-all.ru/3.7/library/functions.html#int). (Автор: Akira Li, [bpo-19940](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Инструмент `pygettext.py` теперь использует стандартный формат +NNNN для часовых поясов в заголовке POT-Creation-Date.
- Модуль [`smtplib`](https://python-all.ru/3.7/library/smtplib.html#module-smtplib) теперь использует [`sys.stderr`](https://python-all.ru/3.7/library/sys.html#sys.stderr) вместо предыдущей модульной переменной `stderr` для отладочного вывода. Если ваша (тестовая) программа зависит от подмены модульной переменной для захвата отладочного вывода, вам нужно обновить её, чтобы захватывать sys.stderr вместо этого.
- Методы [`str.startswith()`](https://python-all.ru/3.7/library/stdtypes.html#str.startswith) и [`str.endswith()`](https://python-all.ru/3.7/library/stdtypes.html#str.endswith) больше не возвращают `True` при поиске пустой строки, если индексы полностью выходят за диапазон. (Автор: Serhiy Storchaka, [bpo-24284](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Функция [`inspect.getdoc()`](https://python-all.ru/3.7/library/inspect.html#inspect.getdoc) теперь возвращает строки документации, унаследованные от базовых классов. Строки документации больше не нужно дублировать, если унаследованная документация подходит. Чтобы подавить унаследованную строку, необходимо указать пустую строку (или документация может быть заполнена). Это изменение влияет на вывод модуля [`pydoc`](https://python-all.ru/3.7/library/pydoc.html#module-pydoc) и функции [`help()`](https://python-all.ru/3.7/library/functions.html#help). (Автор: Serhiy Storchaka, [bpo-15582](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Вложенные вызовы [`functools.partial()`](https://python-all.ru/3.7/library/functools.html#functools.partial) теперь уплощаются. Если предыдущее поведение использовалось, теперь можно добавить атрибут к объекту [`functools.partial()`](https://python-all.ru/3.7/library/functools.html#functools.partial) или создать подкласс [`functools.partial()`](https://python-all.ru/3.7/library/functools.html#functools.partial). (Автор: Alexander Belopolsky, [bpo-7830](https://python-all.ru/3.7/whatsnew/3.5.html).)

### Изменения в C API

- Недокументированный член `format` (непубличной) структуры `PyMemoryViewObject` был удалён. Все расширения, полагающиеся на соответствующие части в `memoryobject.h`, должны быть пересобраны.
- Структура `PyMemAllocator` была переименована в [`PyMemAllocatorEx`](https://python-all.ru/3.7/c-api/memory.html#c.PyMemAllocatorEx), и добавлено новое поле `calloc`.
- Удалён недокументированный макрос `PyObject_REPR`, который приводил к утечке ссылок. Используйте символ формата `%R` в функциях, подобных [`PyUnicode_FromFormat()`](https://python-all.ru/3.7/c-api/unicode.html#c.PyUnicode_FromFormat), для форматирования [`repr()`](https://python-all.ru/3.7/library/functions.html#repr) объекта. (Автор: Serhiy Storchaka, [bpo-22453](https://python-all.ru/3.7/whatsnew/3.5.html).)
- Поскольку отсутствие атрибута `__module__` нарушает сериализацию pickle и интроспекцию, для встроенных типов без атрибута `__module__` теперь выдаётся предупреждение об устаревании. В будущем это будет приводить к исключению AttributeError. (Автор: Serhiy Storchaka в [bpo-20204](https://python-all.ru/3.7/whatsnew/3.5.html).)
- В рамках реализации [**PEP 492**](https://python-all.ru/3.7/whatsnew/3.5.html) слот `tp_reserved` структуры [`PyTypeObject`](https://python-all.ru/3.7/c-api/type.html#c.PyTypeObject) был заменён на слот [`tp_as_async`](https://python-all.ru/3.7/c-api/typeobj.html#c.tp_as_async). См. [Объекты корутин](https://python-all.ru/3.7/c-api/coro.html#coro-objects) для новых типов, структур и функций.

## Примечательные изменения в Python 3.5.4

### Новая `make regen-all` цель сборки

Чтобы упростить кросс-компиляцию и гарантировать, что CPython можно надежно\\nсобрать без необходимости уже иметь установленную версию Python,\\nсистема сборки на основе autotools больше не пытается неявно\\nперекомпилировать сгенерированные файлы, ориентируясь на время их изменения.

Вместо этого была добавлена новая команда `make regen-all` для принудительной\\nперегенерации этих файлов при необходимости (например, после того, как начальная версия Python уже\\nбыла собрана на основе предварительно сгенерированных версий).

Также определены более выборочные цели регенерации – подробнее см.\\n[Makefile.pre.in](https://python-all.ru/src/3.7/Makefile.pre.in).

(Предложено Victor Stinner в [bpo-23404](https://python-all.ru/3.7/whatsnew/3.5.html).)

Новое в версии 3.5.4.

### Удаление `make touch` цели сборки

Цель сборки `make touch`, ранее использовавшаяся для запроса неявной перегенерации\\nсгенерированных файлов путем обновления времени их изменения, была удалена.

Она заменена новой целью `make regen-all`.

(Предложено Victor Stinner в [bpo-23404](https://python-all.ru/3.7/whatsnew/3.5.html).)

Изменено в версии 3.5.4.
