Документация Python неофициальный перевод
Содержание страницы

Что нового в Python 3.5What’s New In Python 3.5

Редакторы

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

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

См. также

PEP 478 – График выпуска Python 3.5

Итоги – основные измененияSummary – Release highlights

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

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

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

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

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

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

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

  • Новые методы bytes.hex(), bytearray.hex() и memoryview.hex(). (Автор: Arnon Yaari в bpo-9951.)

  • memoryview теперь поддерживает индексацию кортежей (включая многомерную). (Автор: Antoine Pitrou в bpo-23632.)

  • У генераторов появился новый атрибут gi_yieldfrom, который возвращает объект, итерируемый выражениями yield from. (Авторы: Benno Leslie и Yury Selivanov в bpo-24450.)

  • Теперь при достижении максимальной глубины рекурсии возбуждается новое исключение RecursionError. (Автор: Georg Brandl в bpo-19235.)

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

  • Когда LC_TYPE локаль является локалью POSIX (C локаль), sys.stdin и sys.stdout теперь используют обработчик ошибок surrogateescape, вместо обработчика ошибок strict. (Автор: Victor Stinner в bpo-19977.)

  • Файлы .pyo больше не используются; вместо них используется более гибкая схема, которая явно включает уровень оптимизации в имя .pyc. (См. обзор PEP 488.)

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

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

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

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

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

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

  • A new installer for Windows has replaced the old MSI. See Using Python on Windows for more information.

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

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

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

PEP 492 – Корутины с синтаксисом async и awaitPEP 492 - Coroutines with async and await syntax

PEP 492 greatly improves support for asynchronous programming in Python by adding awaitable objects, coroutine functions, asynchronous iteration, and asynchronous context managers.

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

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

Inside a coroutine function, the new await expression can be used to suspend coroutine execution until the result is available. Any object can be awaited, as long as it implements the awaitable protocol by defining the __await__() method.

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 можно использовать только внутри корутинной функции, объявленной с async def.

Coroutine functions are intended to be run inside a compatible event loop, such as the asyncio loop.

Примечание

Changed in version 3.5.2: Starting with CPython 3.5.2, __aiter__ can directly return asynchronous iterators. Returning an awaitable object will result in a PendingDeprecationWarning.

See more details in the Asynchronous Iterators documentation section.

См. также

PEP 492 – Coroutines with async and await syntax

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

PEP 465 – Выделенный инфиксный оператор для умножения матрицPEP 465 - A dedicated infix operator for matrix multiplication

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 - Additional Unpacking Generalizations

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 – поддержка процентного форматирования для bytes и bytearrayPEP 461 - percent formatting support for bytes and bytearray

PEP 461 добавляет поддержку % оператора интерполяции для 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'

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

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

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

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

См. также

PEP 461 – Добавление % форматирования для bytes и bytearray

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

PEP 484 – Подсказки типовPEP 484 - Type Hints

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

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

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

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

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() function – a better and faster directory iterator

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 написан и реализован Беном Хойтом (Ben Hoyt) при содействии Виктора Стиннера (Victor Stinner).

PEP 475: Повтор системных вызовов, завершающихся с EINTRPEP 475: Retry system calls failing with 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 и реализация написаны Шарлем-Франсуа Натали (Charles-François Natali) и Виктором Стиннером (Victor Stinner) при содействии Антуана Питру (Antoine Pitrou) (французское звено).

PEP 479: Изменение обработки StopIteration внутри генераторовPEP 479: Change StopIteration handling inside generators

Взаимодействие генераторов и 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 написан Крисом Анжелико (Chris Angelico) и Гвидо ван Россумом (Guido van Rossum). Реализован Крисом Анжелико, Юрием Селивановым и Ником Когланом (Nick Coghlan).

PEP 485: Функция для проверки приблизительного равенстваPEP 485: A function for testing approximate equality

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

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

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

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

См. также

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

PEP написан Кристофером Баркером (Christopher Barker); реализован Крисом Баркером (Chris Barker) и Талем Эйнатом (Tal Einat).

PEP 486: Обучить средство запуска Python работе с виртуальными окружениямиPEP 486: Make the Python Launcher aware of virtual environments

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

См. также

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

PEP написан и реализован Полом Муром.

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

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

См. также

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

PEP написан и реализован Бреттом Кэнноном.

PEP 489: Многофазная инициализация модулей расширенияPEP 489: Multi-phase extension module initialization

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

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

См. также

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

PEP написан Петром Викториным, Стефаном Бенелем и Ником Когленом; реализован Петром Викториным.

Прочие изменения языка Other Language Changes

Некоторые небольшие изменения, внесённые в ядро языка 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.)

Новые модулиNew Modules

typing

Новый typing временный модуль предоставляет стандартные определения и инструменты для аннотаций типов функций. См. 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-приложений

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

argparse

Класс ArgumentParser теперь позволяет отключать сокращённое использование длинных опций, установив allow_abbrev в False. (Предоставлено Джонатаном Пофом, Стивеном Бетардом, paul j3 и Даниэлем Эрикссоном в 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, которые оборачивают корутины в задачи, такими как 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(), теперь принимают все виды ожидаемых объектов. (Автор: Yury Selivanov.)

  • Новая функция run_coroutine_threadsafe() для отправки корутин в циклы событий из других потоков. (Автор: Vincent Michel.)

  • Новый метод Transport.is_closing() для проверки, закрывается ли транспорт или уже закрыт. (Автор: Yury Selivanov.)

  • Метод loop.create_server() теперь может принимать список хостов. (Автор: Yann Sionneau.)

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

  • Новый метод loop.create_future() для создания объектов Future. Это позволяет альтернативным реализациям цикла событий, таким как uvloop, предоставлять более быструю реализацию asyncio.Future. (Предложено Юрием Селивановым.)

  • Новый метод loop.get_exception_handler() для получения текущего обработчика исключений. (Предложено Юрием Селивановым.)

  • Новый метод StreamReader.readuntil() для чтения данных из потока до появления последовательности байтов-разделителей. (Автор: Mark Korenberg.)

  • Методы loop.create_connection() и loop.create_server() оптимизированы, чтобы избежать вызова системной функции getaddrinfo, если адрес уже разрешён. (Предложено А. Джесси Джирю Дэвисом.)

  • loop.sock_connect(sock, 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(), а также поддерживает операторы + и *. Это позволяет распознавать объекты deque как 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 и т. д. (Автор: Devin Jeanpierre в bpo-23086.)

Новый абстрактный базовый класс Generator. (Автор: Stefan Behnel в bpo-24018.)

Новые абстрактные базовые классы Awaitable, Coroutine, AsyncIterator и AsyncIterable. (Автор: Yury Selivanov в bpo-24184.)

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

compileall

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

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

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

concurrent.futures

Метод Executor.map() теперь принимает аргумент chunksize для группировки задач с целью повышения производительности при использовании ProcessPoolExecutor(). (Автор: Dan O’Reilly в bpo-11271.)

Количество рабочих процессов в конструкторе ThreadPoolExecutor теперь необязательно. Значение по умолчанию – 5 * количество CPU. (Автор: Claudiu Popa в 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']

(Автор: Łukasz Langa в 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'

(Автор: Berker Peksag в bpo-22389.)

csv

Метод writerow() теперь поддерживает произвольные итерируемые объекты, а не только последовательности. (Автор: Serhiy Storchaka в bpo-23171.)

curses

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

dbm

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

difflib

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

Функция diff_bytes() теперь может сравнивать списки байтовых строк. Это исправляет регрессию из Python 2. (Авторы: Terry J. Reedy и Greg Ward в bpo-17445.)

distutils

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

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

doctest

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

email

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

Новый метод Message.get_content_disposition() предоставляет простой доступ к каноническому значению для заголовка Content-Disposition. (Автор: Abhilash Raj в bpo-21083.)

Новую опцию политики EmailPolicy.utf8 можно установить в True для кодирования заголовков электронных писем с использованием кодировки UTF-8 вместо кодированных слов. Это позволяет форматировать Messages в соответствии с RFC 6532 и использовать с SMTP-сервером, поддерживающим расширение RFC 6531 SMTPUTF8. (Автор: R. David Murray в bpo-24211.)

Конструктор mime.text.MIMEText теперь принимает экземпляр charset.Charset. (Авторы: Claude Paroz и Berker Peksag в bpo-16324.)

enum

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

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

(Автор: Ethan Furman в bpo-21706.)

faulthandler

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

functools

Большая часть механизма lru_cache() теперь реализована на C, что делает его значительно быстрее. (Авторы: Matt Joiner, Alexey Kachayev и Serhiy Storchaka в bpo-14373.)

glob

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

gzip

Аргумент mode конструктора GzipFile теперь принимает "x" для запроса эксклюзивного создания. (Автор: Tim Heaney в 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']

(Автор: Raymond Hettinger в bpo-13742.)

http

Новое перечисление HTTPStatus, определяющее набор HTTP-кодов состояния, фраз причины и подробных описаний на английском языке. (Автор: Demian Brecht в 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

(Автор: Martin Panter в bpo-3566.)

idlelib и IDLEidlelib and IDLE

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

imaplib

Класс IMAP4 теперь поддерживает протокол менеджера контекста. При использовании в операторе with команда IMAP4 LOGOUT будет автоматически вызвана в конце блока. (Авторы: Tarek Ziadé и Serhiy Storchaka в bpo-4972.)

Модуль imaplib теперь поддерживает RFC 5161 (ENABLE Extension) и RFC 6855 (UTF-8 Support) через метод IMAP4.enable(). Новый атрибут IMAP4.utf8_enabled отслеживает, включена ли поддержка RFC 6855. (Авторы: Milan Oberkirch, R. David Murray и Maciej Szulik в bpo-21800.)

Модуль imaplib теперь автоматически кодирует не-ASCII строки имен пользователей и паролей с использованием UTF-8, как рекомендуется в RFC. (Автор: Milan Oberkirch в bpo-21800.)

imghdr

Функция what() теперь распознает формат OpenEXR (предложен Martin Vignali и Claudiu Popa в bpo-20295) и формат WebP (предложен Fabrice Aneche и Claudiu Popa в bpo-20197).

importlib

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

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

Новая функция util.module_from_spec() теперь является предпочтительным способом создания модуля. В отличие от прямого создания экземпляра types.ModuleType, эта функция устанавливает различные атрибуты, управляемые импортом, на основе переданного объекта спецификации. (Предложено Бреттом Кэнноном в 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 возвращает имя обратной DNS-записи PTR:

>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'

(Предложено Леоном Вебером в 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, '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.)

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 для ограничения максимального размера распакованных данных. (Предложено Martin Panter в bpo-15955.)

math

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

Новая функция isclose() предоставляет способ проверки приблизительного равенства. (Предложено Chris Barker и Tal Einat в bpo-24270.)

Добавлена новая функция gcd(). Функция fractions.gcd() теперь устарела. (Предложено Mark Dickinson и Serhiy Storchaka в bpo-22486.)

multiprocessing

Объекты sharedctypes.synchronized() теперь поддерживают протокол менеджера контекста. (Предложено Charles-François Natali в bpo-21565.)

operator

Объекты attrgetter(), itemgetter() и methodcaller() теперь поддерживают упаковку (pickling). (Предложено Josh Rosenberg и Serhiy Storchaka в bpo-22955.)

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

os

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

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

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

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

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

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

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

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

(Предложено Rafik Draoui и Serhiy Storchaka в bpo-10395.)

pathlib

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

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

(Предложено Vajrasky Kok и Antoine Pitrou в bpo-19775.)

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

Появился новый метод Path.expanduser() для разворачивания префиксов ~ и ~user. (Предложено Serhiy Storchaka и Claudiu Popa в bpo-19776.)

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

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

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

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

(Предложено Christopher Welborn в bpo-20218.)

pickle

Вложенные объекты, такие как несвязанные методы или вложенные классы, теперь могут быть упакованы (pickled) с использованием протоколов pickle старше версии 4. Версия 4 протокола уже поддерживает эти случаи. (Предложено Serhiy Storchaka в bpo-23611.)

poplib

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

re

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

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

(Автор: Serhiy Storchaka в bpo-9179.)

Количество групп захвата в регулярных выражениях больше не ограничено 100. (Автор: Serhiy Storchaka в bpo-22437.)

Функции sub() и subn() теперь заменяют несовпавшие группы пустыми строками вместо возбуждения исключения. (Автор: Serhiy Storchaka в bpo-1519638.)

Исключения re.error получили новые атрибуты: 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() может использоваться для добавления указанного количества последних элементов истории в заданный файл. (Автор: Bruno Cauet в bpo-22940.)

selectors

Новый DevpollSelector обеспечивает эффективный опрос /dev/poll в Solaris. (Автор: Giampaolo Rodola’ в bpo-18931.)

shutil

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

Функция make_archive() теперь поддерживает формат xztar. (Автор: Serhiy Storchaka в bpo-5411.)

signal

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

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

smtpd

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

Класс SMTPServer теперь анонсирует расширение 8BITMIME (RFC 6152), если decode_data установлен в True. Если клиент указывает BODY=8BITMIME в команде MAIL, оно передаётся в SMTPServer.process_message() через именованный аргумент mail_options. (Авторы: Milan Oberkirch и R. David Murray в bpo-21795.)

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

Теперь можно указывать IPv6-адреса в конструкторе SMTPServer напрямую или через разрешение имён, и он будет успешно подключаться. (Автор: Milan Oberkirch в bpo-14758.)

smtplib

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

Метод SMTP.set_debuglevel() теперь принимает дополнительный уровень отладки (2), который включает временные метки в отладочных сообщениях. (Авторы: Gavin Chappell и Maciej Szulik в bpo-16914.)

Оба метода SMTP.sendmail() и SMTP.send_message() теперь поддерживают RFC 6531 (SMTPUTF8). (Авторы: Milan Oberkirch и R. David Murray в bpo-22027.)

sndhdr

Функции what() и whathdr() теперь возвращают namedtuple(). (Автор: Claudiu Popa в bpo-18615.)

socket

Функции с тайм-аутами теперь используют монотонные часы вместо системных. (Автор: Victor Stinner в bpo-22043.)

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

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

Аргумент backlog метода socket.listen() теперь необязателен. По умолчанию он устанавливается в SOMAXCONN или 128, в зависимости от того, что меньше. (Автор: Charles-François Natali в bpo-21455.)

ssl

Поддержка Memory BIOMemory BIO Support

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

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

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

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

Поддержка согласования протокола прикладного уровняApplication-Layer Protocol Negotiation Support

(Предложено Benjamin Peterson в bpo-20188.)

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

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

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

Прочие измененияOther Changes

Добавлен новый метод SSLSocket.version() для запроса фактической используемой версии протокола. (Предложено Antoine Pitrou в bpo-20421.)

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

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

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

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

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

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

sqlite3

Класс Row теперь полностью поддерживает протокол последовательности, в частности итерацию reversed() и индексацию по срезам. (Предложено Claudiu Popa в bpo-10203; Lucas Sinclair, Jessica McKellar и Serhiy Storchaka в bpo-13583.)

подпроцессsubprocess

Добавлена новая функция run(). Она запускает указанную команду и возвращает объект CompletedProcess, описывающий завершённый процесс. Новый API более согласован и является рекомендуемым способом вызова подпроцессов в коде Python, который не требует совместимости с более ранними версиями Python. (Предложено Thomas Kluyver в 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

A new set_coroutine_wrapper() function allows setting a global hook that will be called whenever a coroutine object is created by an async def function. A corresponding get_coroutine_wrapper() can be used to obtain a currently set wrapper. Both functions are provisional, and are intended for debugging purposes only. (Contributed by Yury Selivanov in bpo-24017.)

A new is_finalizing() function can be used to check if the Python interpreter is shutting down. (Contributed by Antoine Pitrou in bpo-22696.)

sysconfig

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

tarfile

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

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

TarFile.list() теперь принимает необязательный именованный аргумент members, который можно установить на подмножество списка, возвращаемого TarFile.getmembers(). (Предложено Serhiy Storchaka в 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() для удобного обхода объектов frame и traceback. (Автор: Robert Collins, bpo-17911.)

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

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

types

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

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

unicodedata

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

unittest

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

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

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

unittest.mock

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

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

  • Новый метод Mock.assert_not_called() для проверки, был ли вызван объект mock. (Предложено Кушалом Дасом в bpo-21262.)

Класс MagicMock теперь поддерживает операторы __truediv__(), __divmod__() и __matmul__(). (Вклад: Johannes Baiter в bpo-20968, и Håkan Lövdahl в bpo-23581 и bpo-23568.)

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

urllib

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

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

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

The parse.urljoin() was updated to use the RFC 3986 semantics for the resolution of relative URLs, rather than RFC 1808 and RFC 2396. (Contributed by Demian Brecht and Senthil Kumaran in bpo-22118.)

wsgiref

Аргумент headers конструктора класса headers.Headers теперь необязателен. (Авторы: Pablo Torres Navarrete и SilentGhost в bpo-5800.)

xmlrpc

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

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

xml.sax

SAX-парсеры теперь поддерживают символьный поток объекта xmlreader.InputSource. (Автор: Serhiy Storchaka в bpo-2175.)

parseString() теперь принимает экземпляр str. (Автор: Serhiy Storchaka в bpo-10590.)

zipfile

Вывод ZIP теперь можно записывать в непозиционируемые потоки. (Автор: Serhiy Storchaka в bpo-23252.)

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

Прочие изменения на уровне модулейOther module-level changes

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

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

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

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

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

Сериализация объектов ipaddress оптимизирована для получения значительно меньшего вывода. (Автор: Serhiy Storchaka в bpo-23133.)

Многие операции над io.BytesIO теперь выполняются на 50–100% быстрее. (Авторы: Serhiy Storchaka в bpo-15381 и David Wilson в bpo-22003.)

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

Кодировщик UTF-32 теперь работает в 3–7 раз быстрее. (Автор: Serhiy Storchaka в bpo-15027.)

Регулярные выражения теперь разбираются до 10% быстрее. (Автор: Serhiy Storchaka в bpo-19380.)

Функция json.dumps() оптимизирована так, что работает с ensure_ascii=False так же быстро, как с ensure_ascii=True. (Автор: Naoki Inada в bpo-23206.)

Функции PyObject_IsInstance() и PyObject_IsSubclass() ускорены в типичном случае, когда второй аргумент имеет type в качестве метакласса. (Автор: Georg Brandl в bpo-22540.)

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

Объекты из модуля random теперь используют на 50% меньше памяти в 64-битных сборках. (Автор: Serhiy Storchaka в bpo-23488.)

Вызовы геттера property() стали до 25% быстрее. (Автор: Joe Jevnik в bpo-23910.)

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

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

Изменения в сборке и C APIBuild and C API Changes

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

(Автор: Victor Stinner в bpo-21233.)

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

(Предложено Victor Stinner в bpo-18395.)

Новая функция PyCodec_NameReplaceErrors() для замены ошибки кодирования unicode на управляющие последовательности \N{...}. (Предложено Serhiy Storchaka в bpo-19676.)

Новая функция PyErr_FormatV(), аналогичная PyErr_Format(), но принимающая аргумент va_list. (Предложено Antoine Pitrou в bpo-18711.)

Новое исключение PyExc_RecursionError. (Предложено Georg Brandl в bpo-19235.)

Новые функции PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2() и PyModule_ExecDef(), введённые PEP 489 – многофазная инициализация модулей расширения. (Предложено Petr Viktorin в bpo-24268.)

Новые функции PyNumber_MatrixMultiply() и PyNumber_InPlaceMatrixMultiply() для умножения матриц. (Предложено Benjamin Peterson в 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.

УстарелоDeprecated

Новые ключевые словаNew Keywords

async и await не рекомендуется использовать в качестве имён переменных, классов, функций или модулей. Введённые PEP 492 в Python 3.5, они станут полноценными ключевыми словами в Python 3.7.

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

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

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

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

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

Модуль 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 используют слишком много разных способов описания себя, поэтому функциональность оставлена на усмотрение пакета. (Предложено Vajrasky Kok и Berker Peksag в 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() теперь устарел и игнорируется. (Предложено Robert Collins и Barry A. Warsaw в bpo-16662.)

УдаленоRemoved

Удаление API и функцийAPI and Feature Removals

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

  • Атрибут __version__ был удалён из пакета email. Код email уже давно не поставлялся отдельно от стандартной библиотеки, а строка __version__ не обновлялась в последних нескольких выпусках.

  • Внутренний класс Netrc в модуле ftplib был объявлен устаревшим в версии 3.4 и теперь удалён. (Предложено Matt Chaput в bpo-6623.)

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

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

Переход на Python 3.5Porting to Python 3.5

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

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

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

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

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

Изменения в Python APIChanges in the Python API

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

  • До Python 3.5 объект datetime.time считался ложным, если он представлял полночь по UTC. Такое поведение считалось неочевидным и подверженным ошибкам и было удалено в Python 3.5. Подробнее см. bpo-13936.

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

  • Атрибут __name__ генераторов теперь берётся из имени функции, а не из имени кода. Используйте gen.gi_code.co_name для получения имени кода. У генераторов также появился новый атрибут __qualname__ – уточнённое имя, которое теперь используется для представления генератора (repr(gen)). (Предложено Victor Stinner в bpo-21205.)

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

  • Хотя это формально не является частью API, для целей переноса (например, исправления тестов) стоит отметить, что сообщения об ошибках, которые ранее имели вид «'sometype' не поддерживает буферный протокол», теперь имеют вид «a байтоподобный объект is required, not 'sometype'». (Предложено Ezio Melotti в bpo-16518.)

  • Если текущая директория установлена на директорию, которой больше не существует, то FileNotFoundError больше не будет возбуждаться, а find_spec() вернёт None без кэширования None в sys.path_importer_cache, что отличается от типичного случая (bpo-22834).

  • Коды состояния HTTP и сообщения из http.client и http.server были реорганизованы в общее перечисление HTTPStatus. Значения в http.client и http.server остаются доступными для обратной совместимости. (Автор: Demian Brecht, bpo-21793.)

  • Если загрузчик импорта определяет importlib.machinery.Loader.exec_module(), то ожидается, что он также определяет create_module() (сейчас это вызывает DeprecationWarning, а в Python 3.6 станет ошибкой). Если загрузчик наследует от importlib.abc.Loader, то ничего делать не нужно; в противном случае просто определите create_module() так, чтобы он возвращал None. (Автор: Brett Cannon, bpo-23014.)

  • Функция re.split() всегда игнорировала пустые совпадения с шаблоном, поэтому шаблон "x*" работал так же, как "x+", а шаблон "\b" никогда не работал. Теперь re.split() выдаёт предупреждение, если шаблон может совпадать с пустой строкой. Для совместимости используйте шаблоны, которые никогда не совпадают с пустой строкой (например, "x+" вместо "x*"). Шаблоны, которые могут совпадать только с пустой строкой (такие как "\b"), теперь вызывают ошибку. (Автор: Serhiy Storchaka, bpo-22818.)

  • Интерфейс, подобный словарю, для http.cookies.Morsel стал самосогласованным: сравнение morsel теперь учитывает key и value, copy() теперь возвращает экземпляр Morsel, а не dict, а update() теперь будет вызывать исключение, если какой-либо из ключей в обновляемом словаре недействителен. Кроме того, недокументированный параметр LegalChars функции set() устарел и теперь игнорируется. (Автор: Demian Brecht, bpo-2211.)

  • PEP 488 has removed .pyo files from Python and introduced the optional opt- tag in .pyc file names. The importlib.util.cache_from_source() has gained an optimization parameter to help control the opt- tag. Because of this, the debug_override parameter of the function is now deprecated. .pyo files are also no longer supported as a file argument to the Python interpreter and thus serve no purpose when distributed on their own (i.e. sourceless code distribution). Due to the fact that the magic number for bytecode has changed in Python 3.5, all old .pyo files from previous versions of Python are invalid regardless of this PEP.

  • Модуль socket теперь экспортирует константу CAN_RAW_FD_FRAMES в linux 3.6 и выше.

  • Функция ssl.cert_time_to_seconds() теперь интерпретирует входное время как UTC, а не как местное время, в соответствии с RFC 5280. Кроме того, возвращаемое значение всегда является int. (Автор: Akira Li, bpo-19940.)

  • Инструмент pygettext.py теперь использует стандартный формат +NNNN для часовых поясов в заголовке POT-Creation-Date.

  • Модуль smtplib теперь использует sys.stderr вместо предыдущей модульной переменной stderr для отладочного вывода. Если ваша (тестовая) программа зависит от подмены модульной переменной для захвата отладочного вывода, вам нужно обновить её, чтобы захватывать sys.stderr вместо этого.

  • Методы str.startswith() и str.endswith() больше не возвращают True при поиске пустой строки, если индексы полностью выходят за диапазон. (Автор: Serhiy Storchaka, bpo-24284.)

  • Функция inspect.getdoc() теперь возвращает строки документации, унаследованные от базовых классов. Строки документации больше не нужно дублировать, если унаследованная документация подходит. Чтобы подавить унаследованную строку, необходимо указать пустую строку (или документация может быть заполнена). Это изменение влияет на вывод модуля pydoc и функции help(). (Автор: Serhiy Storchaka, bpo-15582.)

  • Вложенные вызовы functools.partial() теперь уплощаются. Если предыдущее поведение использовалось, теперь можно добавить атрибут к объекту functools.partial() или создать подкласс functools.partial(). (Автор: Alexander Belopolsky, bpo-7830.)

Изменения в C APIChanges in the C API

  • Недокументированный член format (непубличной) структуры PyMemoryViewObject был удалён. Все расширения, полагающиеся на соответствующие части в memoryobject.h, должны быть пересобраны.

  • Структура PyMemAllocator была переименована в PyMemAllocatorEx, и добавлено новое поле calloc.

  • Удалён недокументированный макрос PyObject_REPR, который приводил к утечке ссылок. Используйте символ формата %R в функциях, подобных PyUnicode_FromFormat(), для форматирования repr() объекта. (Автор: Serhiy Storchaka, bpo-22453.)

  • Поскольку отсутствие атрибута __module__ нарушает сериализацию pickle и интроспекцию, для встроенных типов без атрибута __module__ теперь выдаётся предупреждение об устаревании. В будущем это будет приводить к исключению AttributeError. (Автор: Serhiy Storchaka в bpo-20204.)

  • В рамках реализации PEP 492 слот tp_reserved структуры PyTypeObject был заменён на слот tp_as_async. См. Объекты корутин для новых типов, структур и функций.

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

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

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

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

Также определены более выборочные цели регенерации – подробнее см.\nMakefile.pre.in.

(Предложено Victor Stinner в bpo-23404.)

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

Удаление make touch цели сборкиRemoval of make touch build target

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

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

(Предложено Victor Stinner в bpo-23404.)

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