Что нового в 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'

Внутри функции coroutine выражение new await может быть использовано для приостановки выполнения coroutine до получения результата. Любой объект может быть ожидаемым, если он реализует протокол 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 расширяет допустимые варианты использования оператора распаковки итерабельных файлов * и оператора распаковки словарей **. Теперь в можно использовать произвольное количество распаковок в 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 – Улучшение поддержки ZIP-приложений в Python

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

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(), а также поддерживает операторы + и *. Это позволяет распознавать deques как 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).

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

электронная почта

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

(Внесено Сергеем Сторчакой в bpo-9179).

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

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

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

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

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

readline

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

селекторы

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

shutil

Функция 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. Ответственность за правильную обработку данных process_message несет метод SMTPUTF8. (Внесено Миланом Оберкирхом в bpo-21725).

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

smtplib

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

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

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

sndhdr

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

розетка

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

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

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

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

ssl

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

(Внесено Геертом Янсеном из bpo-21965).

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

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

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

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

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

Там, где присутствует поддержка OpenSSL, модуль ssl теперь реализует расширение TLS Application-Layer Protocol Negotiation, как описано в 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() для удобного обхода объектов frame и traceback. (Внесено Робертом Коллинзом в 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() теперь принимает аргумент шаблон только для ключевого слова, который передается в 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() предоставляет возможность контролировать кодировку частей запроса, если это необходимо. (Вклад Samwyse и Арнона Яари в 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 теперь является необязательным. (Вклад внесли Pablo Torres Navarrete и 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).

zipfile

Вывод 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).

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

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

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

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

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

Новая функция PyCodec_NameReplaceErrors() для замены ошибки кодировки unicode на эскейпы \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() устарели в пользу API inspect.signature(). (Внесено Юрием Селивановым в bpo-20438).

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

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

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

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

Удалено

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

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

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

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

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

  • Класс JoinableQueue в предварительном модуле asyncio был устаревшим в версии 3.4.4 и теперь удален. (Внесено А. Джесси Джирю Дэвисом в bpo-23464).

Перенос на Python 3.5

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

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

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

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

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

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

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

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

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

  • Атрибут __name__ генераторов теперь устанавливается по имени функции, а не по кодовому имени. Для получения кодового имени используйте gen.gi_code.co_name. Генераторы также имеют новый атрибут __qualname__, квалифицированное имя, которое теперь используется для представления генератора (repr(gen)). (Внесено Виктором Стиннером в bpo-21205).

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

  • Хотя формально это не является частью API, для целей переноса (т.е. исправления тестов) стоит отметить, что сообщения об ошибках, которые раньше имели вид «„sometype“ не поддерживает протокол буфера», теперь имеют вид «требуется 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() появился параметр optimization, помогающий управлять тегом opt-. В связи с этим параметр debug_override функции теперь устарел. Файлы .pyo также больше не поддерживаются в качестве аргумента файла для интерпретатора Python и, таким образом, не служат никакой цели при самостоятельном распространении (т.е. распространение кода без источников). Из-за того, что магическое число для байткода изменилось в Python 3.5, все старые файлы .pyo из предыдущих версий Python являются недействительными независимо от этого PEP.

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

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

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

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

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

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

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

Изменения в 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. Новые типы, структуры и функции см. в Объекты Coroutine.

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

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

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

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

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

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

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

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

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

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

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

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

Вернуться на верх