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

Редакторы:Элвис Пранскевичус, Юрий Селиванов

В этой статье объясняются новые возможности Python 3.5 по сравнению с 3.4. Python 3.5 был выпущен 13 сентября 2015 года. Полный список изменений см. в новостях.

См.также

PEP 478 — Расписание релиза Python 3.5

Резюме. Основные моменты релиза

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

  • PEP 492, корутины с синтаксисом async и await.
  • PEP 465, новый оператор умножения матриц: a @ b.
  • PEP 448, дополнительные обобщения распаковки.

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

Новые встроенные функции:

  • bytes % args, bytearray % args: PEP 461 – добавление форматирования % к bytes и bytearray.
  • Новые методы bytes.hex(), bytearray.hex() и memoryview.hex(). (Предоставлено Арноном Яари в bpo-9951.)
  • memoryview теперь поддерживает индексацию кортежей (в том числе многомерных). (Предоставлено Антуаном Питру в bpo-23632.)
  • У генераторов появился новый атрибут gi_yieldfrom, который возвращает объект, итерируемый выражениями yield from. (Предоставлено Бенно Лесли и Юрием Селивановым в bpo-24450.)
  • Новое исключение RecursionError теперь вызывается при достижении максимальной глубины рекурсии. (Предоставлено Георгом Брандлом в bpo-19235.)

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

  • Когда локаль LC_TYPE является локалью POSIX (локаль C), sys.stdin и sys.stdout теперь используют обработчик ошибок surrogateescape вместо обработчика ошибок strict. (Предоставлено Виктором Стиннером в bpo-19977.)
  • Файлы .pyo больше не используются и заменены более гибкой схемой, которая явно включает уровень оптимизации в .pyc имени. (См. PEP 488: обзор.)
  • Встроенные и модули расширения теперь инициализируются в многоэтапном процессе, подобно загрузке Python модулей. (См. PEP 489: обзор.)

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

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

  • SSLv3 теперь отключён во всей стандартной библиотеке. Его по-прежнему можно включить, создав экземпляр ssl.SSLContext вручную. (Дополнительные сведения см. в bpo-22638; это изменение было перенесено в CPython 3.4 и 2.7.)
  • Парсинг HTTP cookie теперь более строгий, чтобы защитить от потенциальных атак путём внедрения. (Предоставлено Антуаном Питру в bpo-22796.)

Улучшения Windows:

  • Новый установщик для Windows заменил старый MSI. См. Использование Python в Windows для получения дополнительной информации.
  • Сборки Windows теперь используют Microsoft Visual C++ 14.0, и модули расширения должны использовать то же самое.

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

Новые особенности

PEP 492: корутины с синтаксисом async и await

PEP 492 значительно улучшает поддержку асинхронного программирования в Python, добавляя ожидаемые объекты, функции корутины, асинхронные итерируемые объекты и асинхронные контекстные менеджеры.

Функции корутины объявляются с использованием нового синтаксиса async def:

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

Внутри функции корутины новое await выражение может использоваться для приостановки выполнения корутины до тех пор, пока не будет доступен результат. Любой объект может быть ожидаться, если он реализует ожидаемый протокол, определяя метод __await__().

PEP 492 также добавляет оператор async for для удобной итерации по асинхронным итерируемым объектам.

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

import asyncio

async def http_get(domain):
    reader, writer = await asyncio.open_connection(domain, 80)

    writer.write(b'\r\n'.join([
        b'GET / HTTP/1.1',
        b'Host: %b' % domain.encode('latin-1'),
        b'Connection: close',
        b'', b''
    ]))

    async for line in reader:
        print('>>>', line)

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('digitology.tech'))
finally:
    loop.close()

Как и в случае с асинхронной итерацией, для асинхронных менеджеров контекста используется новый синтаксис. Например:

import asyncio

async def coro(name, lock):
    print('coro {}: ожидание блокировки'.format(name))
    async with lock:
        print('coro {}: удержание блокировки'.format(name))
        await asyncio.sleep(1)
        print('coro {}: освобождение блокировки'.format(name))

loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
    loop.run_until_complete(coros)
finally:
    loop.close()

будет выводить:

coro 2: ожидание блокировки
coro 2: удержание блокировки
coro 1: ожидание блокировки
coro 2: освобождение блокировки
coro 1: удержание блокировки
coro 1: освобождение блокировки

Обратите внимание, что async for и async with могут использоваться только внутри функции корутины, объявленной с помощью async def.

Функции корутины предназначены для запуска внутри совместимого событийного цикла, такого как asyncio цикл.

Примечание

Изменено в версии 3.5.2: Начиная с CPython 3.5.2, __aiter__ может напрямую возвращать асинхронные итераторы. Возвращение ожидаемого объекта вызывает PendingDeprecationWarning.

Подробнее см. в разделе документации Асинхронные итераторы.

См.также

PEP 492 — Корутины с синтаксисом async и await
PEP написан и реализован Юрием Селивановым.

PEP 465: cпециальный инфиксный оператор для умножения матриц

PEP 465 добавляет инфиксный оператор @ для умножения матриц. В настоящее время ни один встроенный тип Python не реализует новый оператор, однако его можно реализовать, определив __matmul__(), __rmatmul__() и __imatmul__() для обычного, отраженного и матричного умножения. Семантика данных методов аналогична семантике методов, определяющих другие инфиксные арифметические операторы.

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

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

вместо:

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

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

>>> import numpy

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @ m
array([ 1., 1., 1.])

См.также

PEP 465 – специальный инфиксный оператор для умножения матриц
PEP, написанный Натаниэлем Дж. Смитом; реализован Бенджамином Петерсоном.

PEP 448: дополнительные обобщения распаковки

PEP 448 расширяет возможности использования итерируемого оператора распаковки * и оператора распаковки словаря **. Теперь можно использовать произвольное количество распаковок в вызовы функций:

>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5

>>> def fn(a, b, c, d):
...     print(a, b, c, d)
...

>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4

Точно так же отображение кортежей, списков, наборов и словарей допускает множественную распаковку (см. Списки выражений и Отображение словаря):

>>> *range(4), 4
(0, 1, 2, 3, 4)

>>> [*range(4), 4]
[0, 1, 2, 3, 4]

>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

См.также

PEP 448 – Дополнительные обобщения распаковки
PEP, написанный Джошуа Ландау; реализованный Нилом Гирдхаром Томас Воутерс и Джошуа Ландау.

PEP 461: поддержка процентного форматирования байтов и массива байтов

PEP 461 добавляет поддержку % оператора форматирования для bytes и bytearray.

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

Примеры:

>>> b'Привет %b!' % b'Мир'
b'Привет Мир!'

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

Юникод не разрешен для %b, но принимается %a (эквивалент repr(obj).encode('ascii', 'backslashreplace')):

>>> b'Привет %b!' % 'Мир'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'цена: %a' % '10€'
b"цена: '10\\u20ac'"

Обратите внимание, что типы преобразования %s и %r, хотя и поддерживаются, должны использоваться только в кодовых базах, которым требуется совместимость с Python 2.

См.также

PEP 461 – Добавлено % форматирование к байтам и массиву байтов
PEP, написанный Итаном Фурманом; реализованный Нилом Шеменауэром и Итан Фурман.

PEP 484: подсказки типов

Синтаксис аннотаций функций был функцией Python, начиная с версии 3.0 (PEP 3107), однако семантика аннотаций осталась неопределённой.

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

PEP 484 представляет временный модуль для предоставления данных стандартных определений и инструментов, а также некоторых соглашений для ситуаций, когда аннотации недоступны.

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

def greeting(name: str) -> str:
    return 'Привет ' + name

Хотя данные аннотации доступны во время выполнения через обычный атрибут __annotations__, автоматическая проверка типов не происходит во время выполнения. Вместо этого предполагается, что для анализа исходного кода по требованию будет использоваться отдельная автономная программа проверки типов (например, mypy).

Система типов поддерживает объединения, универсальные типы и специальный тип с именем Any, который совместим со всеми типами (т. е. может назначаться им и из них).

См.также

  • Документация модуля typing
  • PEP 484 – Подсказки типов, написанные Гвидо ван Россумом, Юккой Лехтосало и Лукашем Лангой; реализован Гвидо ван Россумом.
  • PEP 483 – Теория подсказок типов, написанная Гвидо ван Россумом

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

PEP 471 добавляет в стандартную библиотеку новую функцию итерации каталога os.scandir(). Кроме того, os.walk() теперь реализован с использованием scandir, что делает его в 3–5 раз быстрее в системах POSIX и в 7–20 раз быстрее в системах Windows. В значительной степени это достигается за счёт значительного сокращения количества вызовов os.stat(), необходимых для обхода дерева каталогов.

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

В следующем примере показано простое использование os.scandir() для отображения всех файлов (за исключением каталогов) в данном path, которые не начинаются с '.'. Вызов entry.is_file() обычно не вызывает дополнительных системных вызовов:

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

См.также

PEP 471: функция os.scandir() – лучший и более быстрый итератор каталогов
PEP написан и реализован Беном Хойтом с помощью Виктора Стиннера.

PEP 475: повтор попытки системных вызовов с ошибкой EINTR

Код ошибки errno.EINTR возвращается всякий раз, когда системный вызов, ожидающий ввода-вывода, прерывается сигналом. Раньше Python в таких случаях вызывал InterruptedError. Это означало, что при написании приложения Python у разработчика было два варианта:

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

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

print("Привет, мир")

а также:

while True:
    try:
        print("Привет, мир")
        break
    except InterruptedError:
        continue

PEP 475 реализует автоматический повтор системных вызовов на EINTR. Это устраняет необходимость работы с EINTR или InterruptedError в пользовательском коде в большинстве ситуаций и делает программы Python, включая стандартную библиотеку, более надёжными. Обратите внимание, что системный вызов повторяется только в том случае, если обработчик сигнала не вызывает исключение.

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

См.также

PEP 475 – Повтор системных вызовов с ошибкой EINTR
PEP и реализация написаны Шарлем-Франсуа Натали и Виктор Стиннер с помощью Антуана Питру (французское соединение).

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

Взаимодействие генераторов и StopIteration в Python 3.4 и более ранних версиях иногда вызывало удивление и могло скрывать непонятные ошибки. Ранее StopIteration, случайно вызванное внутри функции-генератора, интерпретировался как конец итерации конструкцией цикла, управляющей генератором.

PEP 479 изменяет поведение генераторов: когда внутри генератора вызывается исключение StopIteration, оно заменяется на RuntimeError до выхода из фрейма генератора. Основная цель этого изменения — упростить отладку в ситуации, когда незащищенный вызов next() вызывает StopIteration и приводит к автоматическому завершению итерации, управляемой генератором. Это особенно опасно в сочетании с конструкцией yield from.

Это обратно несовместимое изменение, поэтому для включения нового поведения необходимо импортировать __future__:

>>> from __future__ import generator_stop

>>> def gen():
...     next(iter([]))
...     yield
...
>>> next(gen())
Traceback (most recent call last):
  File "<stdin>", line 2, in gen
StopIteration

Вышеупомянутое исключение было прямой причиной следующего исключения:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration

Без импорта __future__ PendingDeprecationWarning будет вызываться всякий раз, когда внутри генератора вызывается исключение StopIteration.

См.также

PEP 479 – Изменена обработка StopIteration внутри генераторов
PEP, написанный Крисом Анджелико и Гвидо ван Россумом. Реализовано Крис Анджелико, Юрий Селиванов и Ник Коглан.

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

PEP 485 добавляет функции math.isclose() и cmath.isclose(), которые сообщают, являются ли два значения приблизительно равными или «близкими» друг к другу. Считаются ли два значения близкими или нет, определяется в соответствии с заданными абсолютными и относительными допусками. Относительный допуск — это максимально допустимая разница между аргументами isclose относительно большего абсолютного значения:

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False

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

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False

См.также

PEP 485 – Функция для проверки приблизительного равенства
PEP, написанный Кристофером Баркером; реализовано Крисом Баркером и Эйнат.

PEP 486: выполняет Python запускальщик осведомленным о виртуальных средах

PEP 486 сообщает запускальщику Windows (см. PEP 397) об активной виртуальной среде. Когда будет использоваться интерпретатор по умолчанию и установлена переменная среды VIRTUAL_ENV, будет использоваться интерпретатор в виртуальной среде.

См.также

PEP 486 — Выполняет Python запускальщик осведомленным о виртуальных средах
PEP написан и реализован Полом Муром.

PEP 488: удаление PYO файлов

PEP 488 устраняет концепцию файлов .pyo. Это означает, что файлы .pyc представляют как неоптимизированный, так и оптимизированный байт-код. Чтобы предотвратить необходимость постоянного повторного создания файлов байт-кода, файлы .pyc теперь имеют необязательный тег opt- в своём имени, когда байт-код оптимизирован. Побочным эффектом этого является отсутствие конфликтов имён файлов байт-кода при работе с -O или -OO. Следовательно, файлы байт-кода, сгенерированные из -O и -OO, теперь могут существовать одновременно. importlib.util.cache_from_source() имеет обновленный API, чтобы помочь с этим изменением.

См.также

PEP 488 – Удаление PYO файлов
PEP написан и реализован Бреттом Кэнноном.

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

PEP 489 обновляет инициализацию модуля расширения, чтобы использовать двухэтапный механизм загрузки модуля, представленный PEP 451 в Python 3.4.

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

См.также

PEP 489 – Инициализация многофазного модуля расширения
PEP, написанный Петром Викториным, Стефаном Бенелем и Ником Когланом; реализован Петром Викториным.

Другие языковые изменения

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

  • Добавлены обработчики ошибок "namereplace". Обработчики ошибок "backslashreplace" теперь работают с декодированием и переводом. (Предоставлено Сергеем Сторчакой в bpo-19676 и bpo-22286.)
  • Параметр -b теперь влияет на сравнение bytes с int. (Предоставил Сергей Сторчака в bpo-23681.)
  • Новые казахские kz1048 и таджикские koi8_t кодеки. (Предоставлено Сергеем Сторчакой в bpo-22682 и bpo-22681.)
  • Строки документации свойств теперь доступны для записи. Это особенно полезно для строк документации collections.namedtuple(). (Предоставлено Беркером Пексагом в bpo-24064.)
  • Циклический импорт, включающий относительный импорт, теперь поддерживается. (Предоставлено Бреттом Кэнноном и Антуаном Питру в bpo-17636.)

Новые модули

typing

Новый модуль временный typing предоставляет стандартные определения и инструменты для подсказок типов функций. См. аннотации типов для получения дополнительной информации.

zipapp

Новый модуль zipapp (указан в PEP 441) предоставляет API и инструмент командной строки для создания исполняемых Python Zip приложений, которые были представлены в Python 2.6 в bpo-1739468, но не получили широкой огласки ни в то время, ни позже.

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

$ python -m zipapp myapp
$ python myapp.pyz

Реализация модуля была предоставлена Полом Муром в bpo-23491.

См.также

PEP 441 – Улучшение поддержки Python ZIP приложений

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

argparse

Класс ArgumentParser теперь позволяет отключить сокращенное использование длинных параметров, установив allow_abbrev в False. (Предоставлено Джонатаном По, Стивеном Бетардом, Полом Дж3 и Даниэлем Эрикссоном в bpo-14910.)

asyncio

Поскольку модуль asyncio предварительный, все изменения, внесённые в Python 3.5, также были перенесены в Python 3.4.x.

Заметные изменения в модуле asyncio по сравнению с Python 3.4.0:

  • Новые API отладки: методы loop.set_debug() и loop.get_debug(). (Предоставлено Виктором Стиннером.)
  • Событийный цикл proactor теперь поддерживает SSL. (Предоставлено Антуаном Питру и Виктором Стиннером в bpo-22560.)
  • Новый метод loop.is_closed() для проверки того, закрыт ли цикл обработки событий. (Предоставлено Виктором Стиннером в bpo-21326.)
  • Новый loop.create_task() для удобного создания и планирования нового Task для корутины. Метод create_task также используется всеми асинхронными функциями, которые оборачивают корутины в задачи, например asyncio.wait(), asyncio.gather() и т. д. (Предоставил Виктор Стиннер)
  • Новый метод transport.get_write_buffer_limits() для запроса ограничений по высокому- и низкому- уровню для управления потоком. (Предоставлено Виктором Стиннером.)
  • Функция async() устарела в пользу ensure_future(). (Предоставил Юрий Селиванов.)
  • Новые методы loop.set_task_factory() и loop.get_task_factory() для настройки фабрики задач, которую использует метод loop.create_task(). (Предоставил Юрий Селиванов.)
  • Новые методы очереди Queue.join() и Queue.task_done(). (Предоставлено Виктором Стиннером.)
  • Класс JoinableQueue был удалён в пользу класса asyncio.Queue. (Предоставлено Виктором Стиннером.)

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

  • Функция ensure_future() и все функции, которые её используют, такие как loop.run_until_complete(), теперь принимают все виды ожидаемых объектов. (Предоставил Юрий Селиванов.)
  • Новая функция run_coroutine_threadsafe() для отправки корутин в событийные циклы из других потоков. (Предоставлено Винсентом Мишелем.)
  • Новый метод Transport.is_closing() для проверки закрытия транспорта. (Предоставил Юрий Селиванов.)
  • Метод loop.create_server() теперь может принимать список хостов. (Предоставлено Янном Сионно.)

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

  • Новый метод loop.create_future() для создания Future объектов. Это позволяет альтернативным реализациям цикла обработки событий, таким как uvloop, обеспечить более быструю реализацию asyncio.Future. (Предоставил Юрий Селиванов.)
  • Новый метод loop.get_exception_handler() для получения текущего обработчика исключений. (Предоставил Юрий Селиванов.)
  • Новый метод StreamReader.readuntil() для чтения данных из потока до появления последовательности байтов-разделителей. (Предоставлено Марком Коренбергом.)
  • Методы loop.create_connection() и loop.create_server() оптимизированы, чтобы избежать вызова системной функции getaddrinfo, если адрес уже разрешён. (Предоставлено А. Джесси Джирю Дэвис.)
  • loop.sock_connect(sock, address) больше не требует разрешения address перед вызовом. (Предоставлено А. Джесси Джирю Дэвис)

bz2

Метод BZ2Decompressor.decompress теперь принимает необязательный аргумент max_length для ограничения максимального размера распакованных данных. (Предоставлено Николаусом Ратом в bpo-15955.)

cgi

Класс FieldStorage теперь поддерживает протокол контекстного менеджера. (Предоставлено Беркером Пексагом в bpo-20289.)

cmath

Новая функция isclose() позволяет проверить приблизительное равенство. (Предоставлено Крисом Баркером и Талем Эйнатом в bpo-24270.)

code

Метод InteractiveInterpreter.showtraceback() теперь выводит полную цепочку трассировки, как и интерактивный интерпретатор. (Предоставлено Клаудиу Попа в bpo-17442.)

collections

Класс OrderedDict теперь реализован на C, что делает его быстрее в 4-100 раз. (Предоставлено Эриком Сноу в bpo-16991.)

Представления OrderedDict.items(), OrderedDict.keys(), OrderedDict.values() теперь поддерживают итерацию reversed(). (Предоставил Сергей Сторчака в bpo-19505.)

Класс deque теперь определяет index(), insert() и copy() и поддерживает операторы + и *. Это позволяет распознавать очереди как MutableSequence и улучшает их заменяемость для списков. (Предоставлено Рэймондом Хеттингером в bpo-23704.)

Строки документации, созданные namedtuple(), теперь можно обновлять:

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

(Предоставлено Беркером Пексагом в bpo-24064.)

Класс UserString теперь реализует методы __getnewargs__(), __rmod__(), casefold(), format_map(), isprintable() и maketrans(), соответствующие соответствующим методам класса str. (Предоставлено Джо Джевником в bpo-22189.)

collections.abc

Метод Sequence.index() теперь принимает аргументы start и stop для соответствия соответствующим методам tuple, list и т. д. (предоставлено Девином Жанпьером в bpo-23086)

Новый абстрактный базовый класс Generator. (Предоставлено Стефаном Бенелем в bpo-24018.)

Новые абстрактные базовые классы Awaitable, Coroutine, AsyncIterator и AsyncIterable. (Предоставил Юрий Селиванов в bpo-24184.)

Для более ранних версий Python резервная копия новых ABC доступна во внешнем файле PyPI пакета.

compileall

Новая опция compileall, -j N, позволяет одновременно запускать N рабочих процессов для выполнения параллельной компиляции байт-кода. Функция compile_dir() имеет соответствующий параметр workers. (Предоставлено Клаудиу Попа в bpo-16104.)

Ещё одна новая опция, -r, позволяет контролировать максимальный уровень рекурсии для подкаталогов. (Предоставлено Клаудиу Попа в bpo-19628.)

Параметр командной строки -q теперь можно указать более одного раза, и в этом случае весь вывод, включая ошибки, будет подавляться. Соответствующий параметр quiet в compile_dir(), compile_file() и compile_path() теперь может принимать целочисленное значение, указывающее уровень подавления вывода. (Предоставлено Томасом Клюйвером в bpo-21338.)

concurrent.futures

Метод Executor.map() теперь принимает аргумент chunksize, позволяющий группировать задачи для повышения производительности при использовании ProcessPoolExecutor(). (Предоставлено Дэном О’Рейли в bpo-11271.)

Количество воркеров в конструкторе ThreadPoolExecutor теперь опционально. Значение по умолчанию в 5 раз превышает количество процессоров. (Предоставлено Клаудиу Попа в bpo-21527.)

configparser

configparser теперь предоставляет способ настроить преобразование значений, указав словарь преобразователей в конструкторе ConfigParser или определив их как методы в подклассах ConfigParser. Преобразователи, определённые в экземпляре парсера, наследуются прокси его секции.

Пример:

>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']

(Предоставлено Лукашем Лангой в bpo-18159.)

contextlib

Новый redirect_stderr() контекстный менеджер (похожий на redirect_stdout()) упрощает обработку для служебных сценариев негибких API, которые записывают свои выходные данные в sys.stderr и не предоставляют каких-либо параметров для его перенаправления:

>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'

(Предоставлено Беркером Пексагом в bpo-22389.)

csv

Метод writerow() теперь поддерживает произвольные итерации, а не только последовательности. (Предоставил Сергей Сторчака в bpo-23171.)

curses

Новая функция update_lines_cols() обновляет переменные среды LINES и COLS. Это полезно для обнаружения ручного изменения размера экрана. (Предоставлено Арноном Яари в bpo-4254.)

dbm

dumb.open всегда создаёт новую базу данных, если флаг имеет значение "n". (Предоставлено Клаудиу Попа в bpo-18039.)

difflib

Кодировку HTML-документов, сгенерированных HtmlDiff.make_file(), теперь можно настроить с помощью нового только ключевого аргумента charset. Кодировка по умолчанию HTML-документа изменена с "ISO-8859-1" на "utf-8". (Предоставлено Беркером Пексагом в bpo-2052.)

Функция diff_bytes() теперь может сравнивать списки байтовых строк. Это исправляет регрессию из Python 2. (Предоставлено Терри Дж. Риди и Грегом Уордом в bpo-17445.)

distutils

Обе команды build и build_ext теперь принимают параметр -j для включения параллельного построения модулей расширения. (Предоставлено Антуаном Питру в bpo-5309.)

Модуль distutils теперь поддерживает сжатие xz, и его можно включить, передав xztar в качестве аргумента для bdist --format. (Предоставил Сергей Сторчака в bpo-16314.)

doctest

Функция DocTestSuite() возвращает пустой unittest.TestSuite, если модуль не содержит строк документации, вместо того, чтобы вызывать ValueError. (Предоставлено Гленном Джонсом в bpo-15916.)

email

Новый параметр политики Policy.mangle_from_ определяет, будут ли строки, начинающиеся с "From " в теле электронной почты, иметь префикс ">" от генераторов. По умолчанию используется True для compat32 и False для всех остальных политик. (Предоставлено Миланом Оберкирхом в bpo-20098.)

Новый метод Message.get_content_disposition() обеспечивает легкий доступ к каноническому значению для заголовка Content-Disposition. (Предоставлено Абхилашем Раджем в bpo-21083.)

Для нового параметра политики EmailPolicy.utf8 можно установить значение True для кодирования заголовков электронной почты с использованием кодировки UTF-8 вместо использования закодированных слов. Это позволяет форматировать Messages в соответствии с RFC 6532 и использовать с SMTP-сервером, который поддерживает расширение RFC 6531 SMTPUTF8. (Предоставлено Р. Дэвидом Мюрреем в bpo-24211.)

Конструктор mime.text.MIMEText теперь принимает экземпляр charset.Charset. (Предоставлено Клодом Парозом и Беркером Пексагом в bpo-16324.)

enum

Вызываемый объект Enum имеет новый параметр start для указания начального количества значений перечисления, если предоставлено только имена значений:

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

(Предоставлено Этаном Фурманом в bpo-21706.)

faulthandler

Функции enable(), register(), dump_traceback() и dump_traceback_later() теперь принимают файловые дескрипторы в дополнение к файловым объектам. (Предоставлено Вей Ву в bpo-23566.)

functools

Большая часть механизмов lru_cache() теперь реализована на языке C, что делает его значительно быстрее. (Предоставлено Мэттом Джойнером, Алексеем Качаевым и Сергеем Сторчакой в bpo-14373.)

glob

Функции iglob() и glob() теперь поддерживают рекурсивный поиск в подкаталогах с использованием шаблона "**". (Предоставил Сергей Сторчака в bpo-13968.)

gzip

Аргумент mode конструктора GzipFile теперь принимает "x" для запроса монопольного создания. (Предоставлено Тимом Хини в bpo-19222.)

heapq

Сравнение элементов в merge() теперь можно настроить, передав ключевую функцию в новом необязательном ключевом аргументе key, а новый необязательный ключевой аргумент reverse можно использовать для обратного сравнения элементов:

>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']

(Предоставлено Рэймондом Хеттингером в bpo-13742.)

http

Новое перечисление HTTPStatus, которое определяет множество кодов состояния HTTP, фраз причин и длинных описаний, написанных на английском языке. (Предоставлено Демианом Брехтом в bpo-21793.)

http.client

HTTPConnection.getresponse() теперь вызывает исключение RemoteDisconnected, когда подключение к удалённому серверу неожиданно закрывается. Кроме того, если вызывается ConnectionError (подклассом которого является RemoteDisconnected), клиентский сокет автоматически закрывается и повторно подключается при следующем запросе:

import http.client
conn = http.client.HTTPConnection('digitology.tech')
for retries in range(3):
    try:
        conn.request('GET', '/')
        resp = conn.getresponse()
    except http.client.RemoteDisconnected:
        pass

(Предоставлено Мартином Пантером в bpo-3566.)

idlelib и IDLE

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

imaplib

Класс IMAP4 теперь поддерживает протокол контекстного менеджера. При использовании в операторе with команда IMAP4 LOGOUT будет вызываться автоматически в конце блока. (Предоставлено Тареком Зиаде и Сергеем Сторчакой в bpo-4972.)

Модуль imaplib теперь поддерживает RFC 5161 (ENABLE Extension) и RFC 6855 (поддержка UTF-8) с помощью метода IMAP4.enable(). Новый атрибут IMAP4.utf8_enabled отслеживает, включена ли поддержка RFC 6855. (Предоставлено Миланом Оберкирхом, Р. Дэвидом Мюрреем и Мацеем Шуликом в bpo-21800.)

Модуль imaplib теперь автоматически кодирует строковые имена пользователей и пароли, отличные от ASCII, с использованием UTF-8, как это рекомендовано RFC. (Предоставлено Миланом Оберкирхом в bpo-21800.)

imghdr

Функция what() теперь распознает формат OpenEXR (предоставленный Мартином Виньяли и Клаудиу Попа в bpo-20295) и формат WebP (предоставленный Фабрисом Анеш и Клаудиу Попа в bpo-20197.)

importlib

Класс util.LazyLoader позволяет отложенную загрузку модулей в приложениях, где важно время запуска. (Предоставлено Бреттом Кэнноном в bpo-17621.)

Метод abc.InspectLoader.source_to_code() теперь является статическим методом. Это упрощает инициализацию объекта модуля кодом, скомпилированным из строки, запустив exec(code, module.__dict__). (Предоставлено Бреттом Кэнноном в bpo-21156.)

Новая функция util.module_from_spec() теперь является предпочтительным способом создания нового модуля. В отличие от непосредственного создания экземпляра types.ModuleType, новая функция будет устанавливать различные атрибуты, контролируемые импортом, на основе переданного объекта спецификации. (Предоставлено Бреттом Кэнноном в bpo-20383.)

inspect

Оба класса Signature и Parameter теперь доступны для обработки и хеширования. (Предоставлено Юрием Селивановым в bpo-20726 и bpo-20334.)

Новый метод BoundArguments.apply_defaults() позволяет установить значения по умолчанию для отсутствующих аргументов:

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

(Предоставлено Юрием Селивановым в bpo-24190.)

Новый метод класса Signature.from_callable() упрощает создание подклассов Signature. (Предоставлено Юрием Селивановым и Эриком Сноу в bpo-17373.)

Функция signature() теперь принимает необязательный ключевой аргумент follow_wrapped, который, если задано значение False, отключает автоматическое отслеживание ссылок __wrapped__. (Предоставил Юрий Селиванов в bpo-20691.)

Добавлен множество новых функций для проверки функции корутины и объектов корутины: iscoroutine(), iscoroutinefunction(), isawaitable(), getcoroutinelocals() и getcoroutinestate(). (Предоставлено Юрием Селивановым в bpo-24017 и bpo-24400.)

Функции stack(), trace(), getouterframes() и getinnerframes() теперь возвращают список именованных кортежей. (Предоставлено Даниэлем Шахафом в bpo-16808.)

io

Новый метод BufferedIOBase.readinto1(), использующий не более одного вызова методов базового необработанного потока RawIOBase.read() или RawIOBase.readinto(). (Предоставлено Николаусом Ратом в bpo-20578.)

ipaddress

Оба класса IPv4Network и IPv6Network теперь принимают аргумент кортежа (address, netmask), чтобы легко создавать сетевые объекты из существующих адресов:

>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')

(Предоставлено Питером Муди и Антуаном Питру в bpo-16531.)

Новый атрибут reverse_pointer для классов IPv4Network и IPv6Network возвращает имя обратной PTR-записи DNS:

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

json

Интерфейс командной строки json.tool теперь сохраняет порядок ключей в объектах JSON, передаваемых на вход. Новая опция --sort-keys может использоваться для сортировки ключей по алфавиту. (Предоставлено Беркером Пексагом в bpo-21650.)

Декодер JSON теперь вызывает JSONDecodeError вместо ValueError, чтобы предоставить более точную контекстную информацию об ошибке. (Предоставил Сергей Сторчака в bpo-19361.)

linecache

Новая функция lazycache() может использоваться для сбора информации о нефайловом модуле, чтобы разрешить получение его строк позже через getline(). Это позволяет избежать ввода-вывода до тех пор, пока строка действительно не понадобится, без необходимости бесконечного переноса глобальных переменных модуля. (Предоставлено Робертом Коллинзом в bpo-17911.)

locale

Новая функция delocalize() может использоваться для преобразования строки в нормализованную числовую строку с учётом настроек LC_NUMERIC:

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'ru_RU.UTF-8')
'ru_RU.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.)

logging

Все методы логгирования (Logger, log(), exception(), critical(), debug() и т. д.) теперь принимают экземпляры исключений в качестве аргумента exc_info в дополнение к логическим значениям и кортежам исключений:

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

(Предоставил Юрий Селиванов в bpo-20537.)

Класс handlers.HTTPHandler теперь принимает необязательный экземпляр ssl.SSLContext для настройки параметров SSL, используемых в HTTP-соединении. (Предоставлено Алексом Гейнором в bpo-22788.)

Класс handlers.QueueListener теперь принимает ключевой аргумент respect_handler_level, который, если установлено значение True, будет передавать сообщения обработчикам с учётом уровней обработчика. (Предоставлено Винаем Саджипом.)

lzma

Метод LZMADecompressor.decompress() теперь принимает необязательный аргумент max_length для ограничения максимального размера распакованных данных. (Предоставлено Мартином Пантером в bpo-15955.)

math

В модуль math добавлены две новые константы: inf и nan. (Предоставлено Марком Дикинсоном в bpo-23185.)

Новая функция isclose() предоставляет способ проверки приблизительного равенства. (Предоставлено Крисом Баркером и Талем Эйнатом в bpo-24270.)

Добавлена новая функция gcd(). Функция fractions.gcd() устарела. (Предоставлено Марком Дикинсоном и Сергеем Сторчакой в bpo-22486.)

multiprocessing

Объекты sharedctypes.synchronized() теперь поддерживают протокол контекстного менеджера. (Предоставлено Шарлем-Франсуа Натали в bpo-21565.)

operator

Объекты attrgetter(), itemgetter() и methodcaller() теперь поддерживают пиклинг. (Предоставлено Джошем Розенбергом и Сергеем Сторчакой в bpo-22955.)

Новые функции matmul() и imatmul() для выполнения матричного умножения. (Предоставлено Бенджамином Петерсоном в bpo-21176.)

os

Добавлена новая функция scandir(), возвращающая итератор объектов DirEntry. Если возможно, scandir() извлекает атрибуты файла при сканировании каталога, устраняя необходимость выполнять последующие системные вызовы для определения типа файла или атрибутов, что может значительно повысить производительность. (Предоставлено Беном Хойтом с помощью Виктора Стиннера в bpo-22524.)

В Windows теперь доступен новый атрибут stat_result.st_file_attributes. Он соответствует члену dwFileAttributes структуры BY_HANDLE_FILE_INFORMATION, возвращенной GetFileInformationByHandle(). (Предоставлено Беном Хойтом в bpo-21719.)

Функция urandom() теперь использует системный вызов getrandom() в Linux 3.17 или новее и getentropy() в OpenBSD 5.6 и новее, устраняя необходимость использования /dev/urandom и предотвращая сбои из-за потенциального исчерпания дескриптора файла. (Предоставлено Виктором Стиннером в bpo-22181.)

Новые функции get_blocking() и set_blocking() позволяют получать и устанавливать режим блокировки дескриптора файла (O_NONBLOCK.) (Предоставлено Виктором Стиннером в bpo-22054.)

Функции truncate() и ftruncate() теперь поддерживаются в Windows. (Предоставлено Стивом Дауэром в bpo-23668.)

Существует новая функция os.path.commonpath(), возвращающая самый длинный общий подпуть каждого переданного имени пути. В отличие от функции os.path.commonprefix(), она всегда возвращает допустимый путь:

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

(Предоставлено Рафиком Драуи и Сергеем Сторчакой в bpo-10395.)

pathlib

Новый метод Path.samefile() можно использовать для проверки того, указывает ли путь на тот же файл, что и другой путь, который может быть либо другим объектом Path, либо строкой:

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

(Предоставлено Ваджраски Коком и Антуаном Питру в bpo-19775.)

Метод Path.mkdir() теперь принимает новый необязательный аргумент exist_ok для соответствия функциям mkdir -p и os.makedirs(). (Предоставлено Беркером Пексагом в bpo-21539.)

Существует новый метод Path.expanduser() для расширения префиксов ~ и ~user. (Предоставили Сергей Сторчака и Клаудиу Попа в bpo-19776.)

Новый метод класса Path.home() можно использовать для получения экземпляра Path, представляющего домашний каталог пользователя. (Предоставлено Виктором Сальгадо и Маянк Трипати в bpo-19777.)

Новые методы Path.write_text(), Path.read_text(), Path.write_bytes(), Path.read_bytes() для упрощения операций чтения/записи файлов.

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

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

(Предоставлено Кристофером Велборном в bpo-20218.)

pickle

Вложенные объекты, такие как несвязанные методы или вложенные классы, теперь могут быть обработаны с помощью более ранних, чем версия протокола 4 pickle протоколов. Протокол версии 4 уже поддерживает данные случаи. (Предоставил Сергей Сторчака в bpo-23611.)

poplib

Новая команда POP3.utf8() включает поддержку RFC 6856 (интернационализированная электронная почта), если её поддерживает POP-сервер. (Предоставлено Миланом ОберКирхом в bpo-21804.)

re

Ссылки и условные ссылки на группы фиксированной длины теперь разрешены в утверждениях просмотра назад:

>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>

(Предоставил Сергей Сторчака в bpo-9179.)

Количество групп захвата в регулярных выражениях больше не ограничено 100. (Предоставил Сергей Сторчака в bpo-22437.)

Функции sub() и subn() теперь заменяют несопоставленные группы пустыми строками, а не вызывают исключение. (Предоставил Сергей Сторчака в bpo-1519638.)

Исключения re.error имеют новые атрибуты msg, pattern, pos, lineno и colno, которые предоставляют более точную контекстную информацию об ошибке:

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

(Предоставлено Сергеем Сторчакой в bpo-22578.)

readline

Новая функция append_history_file() может использоваться для добавления указанного количества конечных элементов в истории к данному файлу. (Предоставлено Бруно Коэ в bpo-22940.)

selectors

Новый DevpollSelector поддерживает эффективный опрос /dev/poll в Solaris. (Предоставлено Джампаоло Родола в bpo-18931.)

shutil

Функция move() теперь принимает аргумент copy_function, что позволяет, например, использовать функцию copy() вместо copy2() по умолчанию, если необходимо игнорировать метаданные файла при перемещении. (Предоставлено Клаудиу Попа в bpo-19840.)

Функция make_archive() теперь поддерживает формат xztar. (Предоставил Сергей Сторчака в bpo-5411.)

signal

В Windows функция set_wakeup_fd() теперь также поддерживает дескрипторы сокетов. (Предоставлено Виктором Стиннером в bpo-22018.)

Различные константы SIG* в модуле signal были преобразованы в Enums. Это позволяет печатать осмысленные имена во время отладки вместо целых «магических чисел». (Предоставлено Джампаоло Родола в bpo-21076.)

smtpd

Оба класса SMTPServer и SMTPChannel теперь принимают ключевой аргумент decode_data, чтобы определить, декодируется ли часть транзакции SMTP DATA с использованием кодека "utf-8" или вместо этого предоставляется методу SMTPServer.process_message() в виде строки байтов. По умолчанию используется True из соображений обратной совместимости, но в Python 3.6 он изменится на False. Если для decode_data задано значение False, метод process_message должен быть готов принимать ключевые аргументы. (Предоставлено Мацеем Шуликом в bpo-19662.)

Класс SMTPServer теперь объявляет расширение 8BITMIME (RFC 6152), если для decode_data установлено значение True. Если клиент указывает BODY=8BITMIME в команде MAIL, он передаётся в SMTPServer.process_message() через ключевой аргумент mail_options. (Предоставлено Миланом Оберкирхом и Р. Дэвидом Мюрреем в bpo-21795.)

Класс SMTPServer теперь также поддерживает расширение SMTPUTF8 (RFC 6531: интернационализированная электронная почта). Если клиент указал SMTPUTF8 BODY=8BITMIME в команде MAIL, они передаются в SMTPServer.process_message() через ключевой аргумент mail_options. Метод process_message отвечает за правильную обработку данных SMTPUTF8. (Предоставлено Миланом Оберкирхом в bpo-21725.)

Теперь можно предоставить напрямую или через разрешение имён IPv6-адреса в конструкторе SMTPServer и успешно подключиться. (Предоставлено Миланом Оберкирхом в bpo-14758.)

smtplib

Новый метод SMTP.auth() предоставляет удобный способ реализации пользовательских механизмов проверки подлинности. (Предоставлено Миланом Оберкирхом в bpo-15014.)

Метод SMTP.set_debuglevel() теперь принимает дополнительный уровень отладки (2), который включает метки времени в сообщениях отладки. (Предоставлено Гэвином Чаппеллом и Мацеем Шуликом в bpo-16914.)

Оба метода SMTP.sendmail() и SMTP.send_message() теперь поддерживают RFC 6531 (SMTPUTF8). (Предоставлено Миланом Оберкирхом и Р. Дэвидом Мюрреем в bpo-22027.)

sndhdr

Функции what() и whathdr() теперь возвращают namedtuple(). (Предоставлено Клаудиу Попа в bpo-18615.)

socket

Функции с тайм-аутами теперь используют монотонные часы вместо системных. (Предоставлено Виктором Стиннером в bpo-22043.)

Новый метод socket.sendfile() позволяет отправлять файл через сокет с помощью высокопроизводительной функции os.sendfile() в UNIX, в результате чего загрузка выполняется в 2–3 раза быстрее, чем при использовании обычного socket.send(). (Предоставлено Джампаоло Родола в bpo-17552.)

Метод socket.sendall() больше не сбрасывает время ожидания сокета каждый раз при получении или отправке байтов. Тайм-аут сокета теперь является максимальной общей продолжительностью отправки всех данных. (Предоставлено Виктором Стиннером в bpo-23853.)

Аргумент backlog метода socket.listen() теперь является необязательным. По умолчанию установлено значение SOMAXCONN или 128, в зависимости от того, что меньше. (Предоставлено Шарлем-Франсуа Натали в bpo-21455.)

ssl

Поддержка BIO памяти

(Предоставлено Гертом Янсеном в bpo-21965.)

Добавлен новый класс SSLObject, обеспечивающий поддержку протокола SSL для случаев, когда возможности сетевого ввода-вывода SSLSocket не нужны или неоптимальны. SSLObject представляет экземпляр протокола SSL, но не реализует какие-либо сетевые методы ввода-вывода, а вместо этого предоставляет интерфейс буфера памяти. Новый класс MemoryBIO можно использовать для передачи данных между Python и экземпляром SSL протокола.

Поддержка BIO памяти SSL в первую очередь предназначена для использования в платформах, реализующих асинхронный ввод-вывод, для которых модель готовности SSLSocket («выбор/опрос») неэффективна.

Новый метод SSLContext.wrap_bio() можно использовать для создания нового экземпляра SSLObject.

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

(Предоставлено Бенджамином Петерсоном в bpo-20188.)

Там, где присутствует поддержка OpenSSL, модуль ssl теперь реализует расширение TLS Согласование протокола прикладного уровня, как приведено в RFC 7301.

Новый SSLContext.set_alpn_protocols() можно использовать для указания того, какие протоколы сокет должен объявлять во время рукопожатия TLS.

Новый SSLSocket.selected_alpn_protocol() возвращает протокол, выбранный во время TLS рукопожатия. Флаг HAS_ALPN указывает, присутствует ли ALPN поддержка.

Другие изменения

Существует новый метод SSLSocket.version() для запроса фактической используемой версии протокола. (Предоставлено Антуаном Питру в bpo-20421.)

Класс SSLSocket теперь реализует метод SSLSocket.sendfile(). (Предоставлено Джампаоло Родола в bpo-17552.)

Метод SSLSocket.send() теперь вызывает исключение ssl.SSLWantReadError или ssl.SSLWantWriteError для неблокирующего сокета, если операция блокируется. Раньше он возвращал 0. (Предоставлено Николаусом Ратом в bpo-20951.)

Функция cert_time_to_seconds() теперь интерпретирует время ввода как время в формате UTC, а не как местное время согласно RFC 5280. Кроме того, возвращаемое значение всегда int. (Предоставлено Акирой Ли в bpo-19940.)

Новые методы SSLObject.shared_ciphers() и SSLSocket.shared_ciphers() возвращают список шифров, отправленных клиентом во время рукопожатия. (Предоставлено Бенджамином Петерсоном в bpo-23186.)

Методы SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown() и SSLSocket.write() класса SSLSocket больше не сбрасывают время ожидания сокета каждый раз при получении или отправке байтов. Время ожидания сокета теперь является максимальной общей продолжительностью метода. (Предоставлено Виктором Стиннером в bpo-23853.)

Функция match_hostname() теперь поддерживает сопоставление IP- адресов. (Предоставлено Антуаном Питру в bpo-23239.)

sqlite3

Класс Row теперь полностью поддерживает протокол последовательности, в частности итерацию reversed() и индексацию среза. (Предоставил Клаудиу Попа в bpo-10203; Лукас Синклер, Джессика МакКеллар и Сергей Сторчака в bpo-13583.)

subprocess

Добавлена новая функция run(). Она запускает указанную команду и возвращает объект CompletedProcess, определяющий законченный процесс. Новый API более согласован и является рекомендуемым подходом к вызову подпроцессов в коде Python, который не требует обеспечения совместимости с более ранними версиями Python. (Предоставлено Томасом Клюйвером в bpo-23342.)

Примеры:

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

Новая функция set_coroutine_wrapper() позволяет установить глобальную ловушку, которая будет вызываться всякий раз, когда объект корутины создаётся функцией async def. Соответствующий get_coroutine_wrapper() можно использовать для получения текущей установленной оболочки. Обе функции предварительны и предназначены только для целей отладки. (Предоставил Юрий Селиванов в bpo-24017.)

Новую функцию is_finalizing() можно использовать для проверки того, является ли интерпретатор Python выключение. (Предоставлено Антуаном Питру в bpo-22696.)

sysconfig

Имя каталога пользовательских скриптов в Windows теперь включает первые два компонента версии Python. (Предоставлено Полом Муром в bpo-23437.)

tarfile

Аргумент mode функции open() теперь принимает "x" для запроса монопольного создания. (Предоставлено Беркером Пексагом в bpo-21717.)

Методы TarFile.extractall() и TarFile.extract() теперь принимают ключевой аргумент numeric_owner. Если установлено значение True, извлечённые файлы и каталоги будут принадлежать числовым uid и gid из tar-файла. Если установлено значение False (по умолчанию и поведение в версиях до 3.5), они будут принадлежать указанному пользователю и группе в tar-файле. (Предоставлено Майклом Фогтом и Эриком Смитом в bpo-23193.)

TarFile.list() теперь принимает необязательный ключевой аргумент members, который может быть установлен в подмножество списка, возвращаемого TarFile.getmembers(). (Предоставлено Сергеем Сторчакой в bpo-21549.)

threading

Оба метода Lock.acquire() и RLock.acquire() теперь используют монотонные часы для управления временем ожидания. (Предоставлено Виктором Стиннером в bpo-22043.)

time

Функция monotonic() теперь всегда доступна. (Предоставлено Виктором Стиннером в bpo-22043.)

timeit

Новый параметр командной строки -u или --unit=U можно использовать для указания единицы времени для вывода таймера. Поддерживаемые параметры: usec, msec или sec. (Предоставлено Джулианом Гинди в bpo-18983.)

Функция timeit() имеет новый параметр globals для указания пространства имён, в котором будет выполняться код. (Предоставлено Беном Робертсом в bpo-2527.)

tkinter

Модуль tkinter._fix, используемый для настройки Tcl/Tk среды в Windows, был заменен частной функцией в модуле _tkinter, которая не вносит постоянных изменений в переменные среды. (Предоставлено Закари Уэром в bpo-20035.)

traceback

Новые функции walk_stack() и walk_tb() для удобного обхода объектов фрейма и трассировки. (Предоставлено Робертом Коллинзом в bpo-17911.)

Новые облегченные классы: TracebackException, StackSummary и FrameSummary. (Предоставлено Робертом Коллинзом в bpo-17911.)

Обе функции print_tb() и print_stack() теперь поддерживают отрицательные значения аргумента limit. (Предоставлено Дмитрием Казаковым в bpo-22619.)

types

Новая функция coroutine() для преобразования генератора и генераторподобный в ожидаемый. (Предоставил Юрий Селиванов в bpo-24017.)

Новый тип с именем CoroutineType, который используется для объектов корутина, созданных функциями async def. (Предоставил Юрий Селиванов в bpo-24400.)

unicodedata

Модуль unicodedata теперь использует данные из Юникода 8.0.0.

unittest

Метод TestLoader.loadTestsFromModule() теперь принимает только ключевой аргумент pattern, который передаётся в load_tests в качестве третьего аргумента. Найденные пакеты теперь проверяются на load_tests независимо от того, соответствует ли их путь pattern, потому что невозможно, чтобы имя пакета соответствовало шаблону по умолчанию. (Предоставлено Робертом Коллинзом и Барри А. Варшавой в bpo-16662.)

Ошибки обнаружения unittest теперь отображаются в атрибуте TestLoader.errors экземпляра TestLoader. (Предоставлено Робертом Коллинзом в bpo-19746.)

Новый параметр командной строки --locals для отображения локальных переменных в трассировках. (Предоставлено Робертом Коллинзом в bpo-22936.)

unittest.mock

У класса Mock появились следующие улучшения:

  • У конструктора класса появился новый параметр unsafe, который заставляет мок объекты вызвать AttributeError для имён атрибутов, начинающихся с "assert". (Предоставлено Кушалом Дасом в bpo-21238.)
  • Новый метод Mock.assert_not_called() для проверки того, был ли вызван мок объект. (Предоставлено Кушалом Дасом в bpo-21262.)

Класс MagicMock теперь поддерживает операторы __truediv__(), __divmod__() и __matmul__(). (Предоставлено Йоханнесом Байтером в bpo-20968 и Хоканом Лёвдалем в bpo-23581 и bpo-23568.)

Больше нет необходимости явно передавать create=True в функцию patch() при исправлении встроенных имён. (Предоставлено Кушалом Дасом в bpo-17660.)

urllib

Новый класс request.HTTPPasswordMgrWithPriorAuth позволяет управлять учётными данными базовой аутентификации HTTP, чтобы исключить ненужную обработку 401 ответов или безоговорочно отправлять учётные данные по первому запросу для связи с серверами, которые возвращают ответ 404 вместо 401, если заголовок Authorization не отправлен. (Предоставили Матей Чепл в bpo-19494 и Акшит Хурана в bpo-7159.)

Новый аргумент quote_via для функции parse.urlencode() позволяет при необходимости управлять кодированием частей запроса. (Предоставлено Сэмвайсом и Арноном Яари в bpo-13866.)

Функция request.urlopen() принимает объект ssl.SSLContext в качестве context аргумента, который будет использоваться для HTTPS соединения. (Предоставлено Алексом Гейнором в bpo-22366.)

parse.urljoin() был обновлён для использования семантики RFC 3986 для разрешения относительных URL-адресов, а не RFC 1808 и RFC 2396. (Предоставлено Демианом Брехтом и Сентилом Кумараном в bpo-22118.)

wsgiref

Аргумент headers конструктора класса headers.Headers теперь является необязательным. (Предоставлено Пабло Торресом Наваррете и SilentGhost в bpo-5800.)

xmlrpc

Класс client.ServerProxy теперь поддерживает протокол контекстного менеджера. (Предоставлено Клаудиу Попа в bpo-20627.)

Конструктор client.ServerProxy теперь принимает необязательный экземпляр ssl.SSLContext. (Предоставлено Алексом Гейнором в bpo-22960.)

xml.sax

Парсеры SAX теперь поддерживают поток символов объекта xmlreader.InputSource. (Предоставил Сергей Сторчака в bpo-2175.)

parseString() теперь принимает экземпляр str. (Предоставил Сергей Сторчака в bpo-10590.)

zipfile

Вывод ZIP теперь можно записывать в недоступные для поиска потоки. (Предоставил Сергей Сторчака в bpo-23252.)

Аргумент mode метода ZipFile.open() теперь принимает "x" для запроса монопольного создания. (Предоставил Сергей Сторчака в bpo-21717.)

Другие изменения на уровне модуля

Многие функции в модулях mmap, ossaudiodev, socket, ssl и codecs теперь допускают запись байтоподобных объектов. (Предоставил Сергей Сторчака в bpo-23001.)

Оптимизации

Функция os.walk() была ускорена в 3–5 раз в системах POSIX и в 7–20 раз в Windows. Это было сделано с помощью новой функции os.scandir(), которая предоставляет информацию о файлах из базовых системных вызовов readdir или FindFirstFile/FindNextFile. (Предоставлено Беном Хойтом с помощью Виктора Стиннера в bpo-23605.)

Построение bytes(int) (заполненного нулевыми байтами) выполняется быстрее и использует меньше памяти для больших объектов. calloc() используется вместо malloc() для выделения памяти для данных объектов. (Предоставлено Виктором Стиннером в bpo-21233.)

Некоторые операции с ipaddress, IPv4Network и IPv6Network были значительно ускорены, например, subnets(), supernet(), summarize_address_range(), collapse_addresses(). Ускорение может варьироваться от 3 до 15 раз. (Предоставлено Антуаном Питру, Мишелем Альбертом и Маркусом в bpo-21486, bpo-21487, bpo-20826, bpo-23266.)

Пиклинг объектов ipaddress было оптимизировано для получения значительно меньшего вывода. (Предоставил Сергей Сторчака в bpo-23133.)

Многие операции на io.BytesIO теперь выполняются на 50–100 % быстрее. (Предоставлено Сергеем Сторчакой в bpo-15381 и Дэвидом Уилсоном в bpo-22003.)

Функция marshal.dumps() теперь работает быстрее: 65–85% с версиями 3 и 4, 20–25% с версиями от 0 до 2 на типичных данных и до 5 раз в лучших случаях. (Предоставлено Сергеем Сторчакой в bpo-20416 и bpo-23344.)

Кодировщик UTF-32 теперь работает в 3-7 раз быстрее. (Предоставил Сергей Сторчака в bpo-15027.)

Регулярные выражения теперь обрабатываются на 10% быстрее. (Предоставил Сергей Сторчака в bpo-19380.)

Функция json.dumps() была оптимизирована для работы с ensure_ascii=False так же быстро, как с ensure_ascii=True. (Предоставлено Наоки Инада в bpo-23206.)

Функции PyObject_IsInstance() и PyObject_IsSubclass() были ускорены в общем случае, когда второй аргумент имеет метакласс type. (Предоставлено Георгом Брандлом в bpo-22540.)

Кэширование методов было немного улучшено, что позволило повысить производительность до 5% в некоторых тестах. (Предоставлено Антуаном Питру в bpo-22847.)

Объекты из модуля random теперь используют на 50% меньше памяти в 64-битных сборках. (Предоставил Сергей Сторчака в bpo-23488.)

Вызовы геттера property() выполняются до 25% быстрее. (Предоставлено Джо Джевником в bpo-23910.)

Создание экземпляра fractions.Fraction теперь до 30% быстрее. (Предоставлено Стефаном Бенелем в bpo-22464.)

Строковые методы find(), rfind(), split(), partition() и строковый оператор in теперь работают значительно быстрее при поиске односимвольных подстрок. (Предоставил Сергей Сторчака в bpo-23573.)

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

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

(Предоставлено Виктором Стиннером в bpo-21233.)

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

(Предоставлено Виктором Стиннером в bpo-18395.)

Новая функция PyCodec_NameReplaceErrors() для замены ошибки кодирования Юникод экранами \N{...}. (Предоставил Сергей Сторчака в bpo-19676.)

Новая функция PyErr_FormatV() похожа на PyErr_Format(), но принимает аргумент va_list. (Предоставлено Антуаном Питру в bpo-18711.)

Новое исключение PyExc_RecursionError. (Предоставлено Георгом Брандлом в bpo-19235.)

Новые функции PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2() и PyModule_ExecDef(), представленные PEP 489 — многоэтапная инициализация модуля расширения. (Предоставлено Петром Викториным в bpo-24268.)

Новые функции PyNumber_MatrixMultiply() и PyNumber_InPlaceMatrixMultiply() для выполнения умножения матриц. (Предоставлено Бенджамином Петерсоном в bpo-21176. Подробности см. также в PEP 465.)

Слот PyTypeObject.tp_finalize теперь является частью стабильного ABI.

Для сборок Windows теперь требуется Microsoft Visual C++ 14.0, который доступен как часть Visual Studio 2015.

Модули расширения теперь включают тег информации о платформе в свое имя файла на некоторых платформах (тег является необязательным, и CPython будет импортировать расширения без него, хотя, если тег присутствует и не соответствует, расширение не будет загружено):

  • В Linux имена файлов модулей расширения заканчиваются на .cpython-<major><minor>m-<architecture>-<os>.pyd:
    • <major> — старший номер версии Python; для Python 3.5 это 3.
    • <minor> — младший номер версии Python; для Python 3.5 это 5.
    • <architecture> — аппаратная архитектура, для которой был создан модуль расширения. Чаще всего это либо 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 в Python 3.5, они станут правильными ключевыми словами в Python 3.7.

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

Вызов исключения StopIteration внутри генератора теперь будет генерировать тихий PendingDeprecationWarning, который станет не молчаливым предупреждением об устаревании в Python 3.6 и вызовет RuntimeError в Python 3.7. Подробности см. в PEP 479: Изменение обработки StopIteration внутри генераторов.

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

Microsoft больше не поддерживает Windows XP, поэтому согласно PEP 11 CPython 3.5 больше официально не поддерживается в этой ОС.

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

Модуль formatter в настоящее время полностью устарел и все ещё планируется удалить в Python 3.6.

Функция asyncio.async() устарела в пользу ensure_future().

В прошлом модуль smtpd всегда декодировал часть DATA сообщений электронной почты с использованием кодека utf-8. Теперь это можно контролировать с помощью нового ключевого слова decode_data до SMTPServer. Значение по умолчанию — True, но это значение по умолчанию устарело. Укажите ключевой аргумент decode_data с соответствующим значением, чтобы избежать предупреждения об устаревании.

Прямое присвоение значений объектам key, value и coded_value объектов http.cookies.Morsel не рекомендуется. Вместо этого используйте метод set(). Кроме того, недокументированный параметр LegalChars set() устарел и теперь игнорируется.

Передача строки формата в качестве ключевого аргумента format_string в метод format() класса string.Formatter устарела. (Предоставлено Сергеем Сторчакой в bpo-23671.)

Функции platform.dist() и platform.linux_distribution() устарели. Дистрибутивы Linux используют слишком много разных способов самоописания, поэтому функциональность предоставляется пакету. (Предоставлено Ваджраски Коком и Беркером Пексагом в bpo-1322.)

Ранее недокументированные методы from_function и from_builtin inspect.Signature устарели. Вместо этого используйте новый метод Signature.from_callable(). (Предоставил Юрий Селиванов в bpo-24248.)

Функция inspect.getargspec() устарела и должна быть удалена в Python 3.6. (Подробности см. в bpo-20438)

Функции inspect getfullargspec(), getcallargs() и formatargspec() устарели в пользу API inspect.signature(). (Предоставил Юрий Селиванов в bpo-20438.)

Функции getargvalues() и formatargvalues() были случайно помечены как устаревшие в выпуске Python 3.5.0.

Использование флага re.LOCALE с шаблонами str или re.ASCII больше не рекомендуется. (Предоставил Сергей Сторчака в bpo-22407.)

Использование нераспознанных специальных последовательностей, состоящих из '\' и буквы ASCII в шаблонах регулярных выражений и шаблонах замены, теперь вызывает предупреждение об устаревании и будет запрещено в Python 3.6. (Предоставлено Сергеем Сторчакой в bpo-23622.)

Недокументированный и неофициальный аргумент по умолчанию use_load_tests метода unittest.TestLoader.loadTestsFromModule() теперь устарел и игнорируется. (Предоставлено Робертом Коллинзом и Барри А. Варшавой в bpo-16662.)

Удаления

Удалённые API и функции

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

  • Атрибут __version__ удалён из пакета email. Код email уже давно не поставляется отдельно от стандартной библиотеки, а строка __version__ не обновлялась в последних нескольких выпусках.
  • Внутренний класс Netrc в модуле ftplib устарел в версии 3.4 и теперь удалён. (Предоставлено Мэттом Чапутом в bpo-6623.)
  • Концепция файлов .pyo удалена.
  • Класс JoinableQueue в предварительном модуле asyncio устарел в версии 3.4.4 и теперь удалён. (Предоставлено А. Джесси Джирю Дэвис в bpo-23464.)

Портирование на Python 3.5

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

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

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

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

    Python 3.5 теперь правильно генерирует SyntaxError, т. к. выражения генератора должны быть заключены в круглые скобки, если они не являются единственным аргументом функции.

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

  • PEP 475: системные вызовы теперь повторяются при прерывании сигналом, а не вызывают InterruptedError, если обработчик сигналов Python не вызывает исключение.
  • До Python 3.5 объект datetime.time считался ложным, если он представлял полночь в UTC. Такое поведение считалось неясным и подверженным ошибкам и было удалено в Python 3.5. См. bpo-13936 для получения полной информации.
  • Метод ssl.SSLSocket.send() теперь вызывает ssl.SSLWantReadError или ssl.SSLWantWriteError в неблокирующем сокете, если операция блокируется. Раньше он возвращал 0. (Предоставлено Николаусом Ратом в bpo-20951.)
  • Атрибут генераторов __name__ теперь устанавливается из имени функции, а не из кодового имени. Используйте gen.gi_code.co_name, чтобы получить кодовое имя. Генераторы также имеют новый атрибут __qualname__, полное имя, которое теперь используется для представления генератора (repr(gen)). (Предоставлено Виктором Стиннером в bpo-21205.)
  • Устаревший «строгий» режим и аргумент HTMLParser, HTMLParser.error() и исключение HTMLParserError были удалены. (Предоставлено Эцио Мелотти в bpo-15114.) Аргумент convert_charrefs HTMLParser теперь по умолчанию равен True. (Предоставлено Беркером Пексагом в bpo-21047.)
  • Хотя формально он не является частью API, в целях переноса (т. е. исправления тестов) стоит отметить, что сообщения об ошибках, которые ранее имели форму «“sometype“ не поддерживает протокол буфера», теперь имеют вид «требуется байтоподобный объект, а не «какой-то тип». (Предоставлено Эцио Мелотти в bpo-16518.)
  • Если текущий каталог установлен в каталог, который больше не существует, FileNotFoundError больше не будет вызываться, а вместо этого find_spec() вернёт None, без кэширования None в sys.path_importer_cache, что отличается от типичного случая (bpo-22834).
  • Код состояния HTTP и сообщения из http.client и http.server были реорганизованы в общее перечисление HTTPStatus. Значения в http.client и http.server остаются доступными для обратной совместимости. (Предоставлено Демианом Брехтом в bpo-21793.)
  • Когда загрузчик импорта определяет importlib.machinery.Loader.exec_module(), теперь ожидается, что он также определит create_module() (сейчас вызывает DeprecationWarning, что будет ошибкой в Python 3.6). Если загрузчик наследуется от importlib.abc.Loader, то делать нечего, иначе просто определяет create_module(), чтобы возвращает None. (Предоставлено Бреттом Кэнноном в bpo-23014.)
  • Функция re.split() всегда игнорировала совпадения с пустым шаблоном, поэтому шаблон "x*" работал так же, как "x+", а шаблон "\b" никогда не работал. Теперь re.split() вызывает предупреждение, если шаблон может соответствовать пустой строке. Для совместимости используйте шаблоны, которые никогда не соответствуют пустой строке (например, "x+" вместо "x*"). Шаблоны, которые могут соответствовать только пустой строке (например, "\b"), теперь вызывают ошибку. (Предоставил Сергей Сторчака в bpo-22818.)
  • Подобный словарю интерфейс http.cookies.Morsel, стал самосогласованным: сравнение фрагментов теперь учитывает key и value, copy() теперь приводит к экземпляру Morsel, а не к dict, а update() теперь вызывает исключение в обновлении, если какой-либо из ключей словарь недействителен. Кроме того, недокументированный параметр LegalChars set() устарел и теперь игнорируется. (Предоставлено Демианом Брехтом в bpo-2211.)
  • PEP 488 удалил файлы .pyo из Python и добавил необязательный тег opt- в имена файлов .pyc. importlib.util.cache_from_source() получил параметр optimization, помогающий управлять тегом opt-. Из-за этого параметр функции debug_override теперь устарел. Файлы .pyo также больше не поддерживаются в качестве файлового аргумента для интерпретатора Python и, таким образом, бесполезны при самостоятельном распространении (т. е. при распространении исходного кода). Из-за того, что магическое число для байт-кода изменилось в Python 3.5, все старые файлы .pyo из предыдущих версий Python недействительны независимо от данного PEP.
  • Модуль socket теперь экспортирует константу CAN_RAW_FD_FRAMES в Linux 3.6 и выше.
  • Функция ssl.cert_time_to_seconds() теперь интерпретирует время ввода как время в формате UTC, а не как местное время согласно RFC 5280. Кроме того, возвращаемое значение всегда int. (Предоставлено Акирой Ли в bpo-19940.)
  • Инструмент pygettext.py теперь использует стандартный формат +NNNN для часовых поясов в заголовке POT-Creation-Date.
  • Модуль smtplib теперь использует sys.stderr вместо предыдущей переменной уровня модуля stderr для вывода отладки. Если ваша (тестовая) программа зависит от исправления переменной уровня модуля для захвата вывода отладки, вам нужно будет обновить её, чтобы вместо этого захватить sys.stderr.
  • Методы str.startswith() и str.endswith() больше не возвращают True при обнаружении пустой строки, а индексы полностью выходят за пределы допустимого диапазона. (Предоставлено Сергеем Сторчакой в bpo-24284.)
  • Функция inspect.getdoc() теперь возвращает строки документации, унаследованные от базовых классов. Строки документации больше не нужно дублировать, если унаследованная документация подходит. Чтобы подавить унаследованную строку, необходимо указать пустую строку (или можно заполнить документацию). Это изменение влияет на выходные данные модуля pydoc и функции help(). (Предоставил Сергей Сторчака в bpo-15582.)
  • Вложенные вызовы functools.partial() теперь сведены. Если вы полагались на предыдущее поведение, теперь вы можете либо добавить атрибут к объекту functools.partial(), либо создать подкласс functools.partial(). (Предоставлено Александром Белопольским в bpo-7830.)

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

  • Недокументированный элемент format (непубличной) структуры PyMemoryViewObject был удалён. Все расширения, основанные на соответствующих частях memoryobject.h, должны быть перестроены.
  • Структура PyMemAllocator была переименована в PyMemAllocatorEx, и было добавлено новое поле calloc.
  • Удалён недокументированный макрос PyObject_REPR, из-за которого просочились ссылки. Используйте символ формата %R в функциях, подобных PyUnicode_FromFormat(), для форматирования repr() объекта. (Предоставил Сергей Сторчака в bpo-22453.)
  • Поскольку отсутствие атрибута __module__ мешает процессу пиклинга и самоанализа, для встроенных типов без атрибута __module__ теперь выдается предупреждение об устаревании. В будущем это будет AttributeError. (Предоставлено Сергеем Сторчакой в bpo-20204.)
  • В рамках реализации PEP 492 слот tp_reserved PyTypeObject был заменен слотом tp_as_async. См. Объекты корутин для получения информации о новых типах, структурах и функциях.

Заметные изменения в Python 3.5.4

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

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

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

Также определены более избирательные цели регенерации — подробности см. в Makefile.pre.in.

(Предоставлено Виктором Стиннером в bpo-23404.)

Добавлено в версии 3.5.4.

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

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

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

(Предоставлено Виктором Стиннером в bpo-23404.)

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