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

Редакция:

Элвис Пранскевичус <elvis@magic.io>, Юрий Селиванов <yury@magic.io>

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

См.также

PEP 478 - График выхода Python 3.5

Резюме - Основные моменты выпуска

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

  • PEP 492, корутины с синтаксисом async и await.

  • PEP 465, новый оператор умножения матриц: a @ b.

  • PEP 448, дополнительная распаковка обобщений.

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

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

  • bytes % args, bytearray % args: PEP 461 – Добавление форматирования % к байтам и байтовым массивам.

  • Новые методы 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 overview).

  • Встроенные и расширенные модули теперь инициализируются в многофазном процессе, который похож на то, как загружаются модули Python. (См. PEP 489 overview).

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

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

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

  • Разбор HTTP-куки теперь более строгий, чтобы защитить от потенциальных атак с использованием инъекций. (Внесено Антуаном Питру в bpo-22796).

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

  • Новый установщик для Windows заменил старый MSI. Дополнительную информацию см. в разделе Использование Python в Windows.

  • В сборках для Windows теперь используется Microsoft Visual C++ 14.0, и модули расширения должны использовать его же.

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

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

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

PEP 492 значительно улучшает поддержку асинхронного программирования в Python, добавляя awaitable objects, coroutine functions, asynchronous iteration и asynchronous context managers.

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

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

Внутри корутинной функции новое выражение await может использоваться для приостановки выполнения корутины до получения результата. Любой объект может быть ожидаемым, если он реализует протокол awaitable, определив метод __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('example.com'))
finally:
    loop.close()

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

import asyncio

async def coro(name, lock):
    print('coro {}: waiting for lock'.format(name))
    async with lock:
        print('coro {}: holding the lock'.format(name))
        await asyncio.sleep(1)
        print('coro {}: releasing the lock'.format(name))

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

выведет:

coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock

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

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

Примечание

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

Более подробную информацию вы найдете в разделе документации Асинхронные итераторы.

См.также

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

PEP написан и реализован Юрием Селивановым.

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

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

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

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 расширяет допустимые варианты использования оператора распаковки * iterable и оператора распаковки ** словаря. Теперь в function calls можно использовать произвольное количество распаковок:

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

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

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

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

>>> *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 добавляет поддержку % interpolation operator до bytes и bytearray.

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

Примеры:

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

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

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

>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'

>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"

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

См.также

PEP 461 – Добавление форматирования % к байтам и массивам байтов

PEP написан Итаном Фурманом; реализован Нилом Шеменауэром и Итаном Фурманом.

PEP 484 - Подсказки по типу

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

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

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

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

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

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

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

См.также

  • typing документация по модулю

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

    PEP написан Гвидо ван Россумом, Юккой Лехтосало и Лукашем Ланга; реализован Гвидо ван Россумом.

  • PEP 483 – Теория подсказок типа

    PEP, автор Гвидо ван Россум

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

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

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

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

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

См.также

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

PEP написан и реализован Беном Хойтом при помощи Виктора Стиннера.

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

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

  1. Не обращайте внимания на InterruptedError.

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

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

print("Hello World")

и:

while True:
    try:
        print("Hello World")
        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

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 каждый раз, когда внутри генератора будет возникать исключение 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 Launcher осведомленным о виртуальных средах

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

См.также

PEP 486 – Сделать Python Launcher осведомленным о виртуальных средах

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 codecs. (Внесено Сергеем Сторчакой в bpo-22682 и bpo-22681).

  • Докстринги свойств теперь можно записывать. Это особенно полезно для докстрин collections.namedtuple(). (Внесено Беркером Пексагом в bpo-24064).

  • Теперь поддерживается круговой импорт с относительным импортом. (Вклад внесли Бретт Кэннон и Антуан Питру в bpo-17636).

Новые модули

набор текста

Новый typing provisional модуль предоставляет стандартные определения и инструменты для аннотаций типов функций. Более подробную информацию см. в разделе Type Hints.

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 теперь позволяет отключить abbreviated usage длинных опций, установив allow_abbrev в False. (Вклад внесли Джонатан По, Стивен Бетард, paul j3 и Даниэль Эрикссон в bpo-14910).

asyncio

Поскольку модуль asyncio стал provisional, все изменения, внесенные в 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 для coroutine. Метод create_task также используется всеми функциями asyncio, которые оборачивают coroutines в задачи, такими как 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(), теперь принимают все виды awaitable objects. (Внесено Юрием Селивановым.)

  • Новая функция 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) больше не требуется, чтобы адрес был разрешен до вызова. (Внесено А. Джесси Джирю Дэвисом).

bz2

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

cgi

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

cmath

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

код

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

коллекции

Класс 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 coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'

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

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

коллекции.abc

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

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

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

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

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() context manager (аналогичный redirect_stdout()) облегчает работу утилитных скриптов с негибкими API, которые записывают вывод в sys.stderr и не предоставляют никаких опций для его перенаправления:

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

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

csv

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

проклятия

Новая функция 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, если модуль не содержит docstrings, вместо того, чтобы поднимать ValueError. (Внесено Гленом Джонсом в bpo-15916).

e-mail

Новый параметр политики 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).

глобус

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

gzip

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

heapq

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

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

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

http

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

http.client

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

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

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

idlelib и IDLE

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

imaplib

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

Модуль imaplib теперь поддерживает RFC 5161 (ENABLE Extension) и RFC 6855 (UTF-8 Support) с помощью метода 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, эта новая функция устанавливает различные контролируемые импортом атрибуты на основе переданного объекта spec. (Внесено Бреттом Кэнноном в bpo-20383).

осмотреть

Классы Signature и Parameter теперь являются picklable и hashable. (Внесено Юрием Селивановым в 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).

Добавлен набор новых функций для проверки coroutine functions и coroutine objects: 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).

локаль

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

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'

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

ведение журнала

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

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

(Внесено Юрием Селивановым в bpo-20537).

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

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

lzma

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

математика

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

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

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

многопроцессорная обработка

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

оператор

Объекты attrgetter(), itemgetter() и methodcaller() теперь поддерживают pickling. (Вклад Джоша Розенберга и Сергея Сторчака в 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 protocols старше, чем в протоколе версии 4. Протокол версии 4 уже поддерживает такие случаи. (Внесено Сергеем Сторчакой в bpo-23611).

poplib

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

re

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

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

(Предоставлено Serhiy Storchaka в bpo-9179).

Количество групп захвата в регулярных выражениях больше не ограничено 100. (Внесено Сергеем Сторчакой в 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)

(Предоставлено Serhiy Storchaka в bpo-22578).

readline

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

селекторы

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

ШУТИЛ

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

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

сигнал

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

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

smtpd

Оба класса SMTPServer и SMTPChannel теперь принимают аргумент decode_data, чтобы определить, будет ли часть DATA SMTP-транзакции декодирована с помощью кодека "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. Ответственность за правильную обработку данных SMTPUTF8 лежит на методе process_message. (Внесено Миланом Оберкирхом в 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).

сокет

Функции с тайм-аутом теперь используют монотонные часы, а не системные. (Внесено Виктором Стиннером в 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

Поддержка БИО памяти

(Предоставлено Geert Jansen в bpo-21965).

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

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

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

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

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

При наличии поддержки OpenSSL модуль ssl теперь реализует расширение Application-Layer Protocol Negotiation TLS, как описано в RFC 7301.

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

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

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

Появился новый метод SSLSocket.version() для запроса фактической версии используемого протокола. (Внесен Антуаном Питру в 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).

подпроцесс

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

Примеры:

>>> subprocess.run(["ls", "-l"])  # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)

>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
  ...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

sys

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

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

sysconfig

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

tarfile

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

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

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

нарезка резьбы

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

время

Функция 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() для удобного обхода фрейма и traceback objects. (Внесено Робертом Коллинзом в bpo-17911).

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

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

типы

Новая функция coroutine() для преобразования объектов generator и generator-like в awaitables. (Внесено Юрием Селивановым в bpo-24017).

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

unicodedata

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

unittest

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

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

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

unittest.mock

Класс Mock имеет следующие улучшения:

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

  • Новый метод Mock.assert_not_called() для проверки того, был ли вызван объект mock. (Внесено Кушалом Дасом в 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 теперь поддерживает протокол context manager. (Внесено Клаудиу Попа в bpo-20627).

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

xml.sax

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

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

zip-файл

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

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

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

Многие функции в модулях mmap, ossaudiodev, socket, ssl и codecs теперь принимают записываемые bytes-like objects. (Внесено Сергеем Сторчакой в 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 теперь значительно быстрее выполняют поиск 1-символьных подстрок. (Внесено Сергеем Сторчакой в 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 on 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: Change StopIteration handling inside generators.

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

Windows XP больше не поддерживается компанией Microsoft, поэтому, согласно 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() устарели в пользу inspect.signature(). API. (Внесено Юрием Селивановым в 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. Код электронной почты уже давно не поставляется отдельно от stdlib, а строка __version__ не обновлялась в последних выпусках.

  • Внутренний класс Netrc в модуле ftplib был устаревшим в версии 3.4 и теперь удален. (Внесено Мэттом Чапутом в bpo-6623).

  • Концепция файлов .pyo была удалена.

  • Класс JoinableQueue в предварительном модуле asyncio был устаревшим в версии 3.4.4 и теперь удален. (Внесено A. Jesse Jiryu Davis в bpo-23464).

Переход на Python 3.5

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

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

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

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

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

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

  • PEP 475: Системные вызовы теперь повторяются при прерывании сигналом вместо того, чтобы поднимать InterruptedError, если обработчик сигнала Python не поднимает исключение.

  • До Python 3.5 объект datetime.time считался ложным, если он представлял полночь по Гринвичу. Такое поведение считалось неясным и чреватым ошибками и было удалено в 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).

  • Устаревшие режим «strict» и аргумент HTMLParser, HTMLParser.error(), а также исключение HTMLParserError были удалены. (Внесено Эцио Мелотти в bpo-15114.) Аргумент convert_charrefs в HTMLParser теперь по умолчанию равен True. (Внесено Беркером Пексагом в bpo-21047).

  • Хотя формально это не является частью API, для целей переноса (т. е. исправления тестов) стоит отметить, что сообщения об ошибках, которые раньше имели вид «„sometype“ не поддерживает протокол буфера», теперь имеют вид «требуется bytes-like object, а не „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() появился параметр оптимизация, который помогает управлять тегом 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).

Изменения в API языка C

  • Недокументированный член 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, система сборки на основе autotools больше не пытается неявно перекомпилировать сгенерированные файлы на основе времени модификации файлов.

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

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

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

Added in version 3.5.4.

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

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

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

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

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