Что нового в 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, сопрограммы с асинхронным синтаксисом и синтаксисом ожидания.

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

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

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

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

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

  • Новые методы bytes.hex(), bytearray.hex() и memoryview.hex(). (Автор - Арнон Яари в bpo-9951.)

  • memoryview теперь поддерживается индексация кортежей (в том числе многомерных). (Добавлено Антуаном Питру в bpo-23632.)

  • Генераторы имеют новый атрибут gi_yieldfrom, который возвращает объект, повторяемый с помощью выражений yield from. (Авторы - Бенно Лесли и Юрий Селиванов в статье bpo-24450.)

  • Новое исключение RecursionError теперь генерируется при достижении максимальной глубины рекурсии. (Добавлено Георгом Брандлом в bpo-19235.)

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

  • Если языковой стандарт LC_TYPE соответствует языковому стандарту POSIX (C), то sys.stdin и sys.stdout теперь используют обработчик ошибок surrogateescape вместо strict обработчик ошибок. (Автор: Виктор Стиннер в bpo-19977.)

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

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

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

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

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

  • Обработка HTTP-файлов cookie теперь более строгая, чтобы защитить от потенциальных атак путем внедрения. (Автор: Антуан Питру в bpo-22796.)

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

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

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

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

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

PEP 492 - Сопрограммы с асинхронным синтаксисом и ожиданием

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

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

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

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

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

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

import asyncio

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

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

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

    writer.close()

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(http_get('example.com'))
finally:
    loop.close()

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

import asyncio

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

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

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

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

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

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

Примечание

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

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

См.также

PEP 492 – Сопрограммы с асинхронным синтаксисом и ожиданием

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

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

PEP 465 добавляет инфиксный оператор @ для умножения матриц. В настоящее время ни один из встроенных типов Python не реализует оператор new, однако его можно реализовать, определив __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 расширены возможности использования оператора * итеративной распаковки и оператора ** распаковки по словарю. Теперь можно использовать произвольное количество распаковок в 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% для байтов и bytearray

PEP 461 добавлена поддержка % interpolation operator к bytes и bytearray.

Хотя интерполяция обычно рассматривается как строковая операция, бывают случаи, когда интерполяция на bytes или bytearrays имеет смысл, и работа, необходимая для восполнения этой недостающей функциональности, снижает общую читаемость кода. Эта проблема особенно важна при работе с протоколами wireformat, которые часто представляют собой смесь двоичного текста, совместимого с 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 – Добавление % форматирования в bytes и bytearray

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

ПОП-музыка и реализация написаны Шарлем-Франсуа Натали и Виктором Скиннером при содействии Антуана Питру (the French connection).

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

Взаимодействие генераторов и 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 – Изменить обработку остановки внутри генераторов

Сценарий написан Крисом Анджелико и Гвидо ван Россумом. Реализован Крисом Анджелико, Юрием Селивановым и Ником Когланом.

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

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

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

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

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

См.также

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

PEP написан Кристофером Баркером; реализован Крисом Баркером и Талом Эйнатом.

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

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

См.также

PEP 486 – Сделать так, чтобы программа запуска Python была осведомлена о виртуальных средах

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

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

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

См.также

PEP 488 – Удаление PYO-файлов

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

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

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

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

См.также

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

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

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

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

  • Добавлены обработчики ошибок "namereplace". Обработчики ошибок "backslashreplace" теперь работают с расшифровкой и переводом. (Добавлено Сергеем Сторчакой в bpo-19676 и bpo-22286.)

  • Параметр -b теперь влияет на сравнение bytes с int. (Добавлено Сергеем Сторчакой в bpo-23681.)

  • Новый казахский kz1048 и таджикский koi8_t codecs. (Автор Сергей Сторчака в bpo-22682 и bpo-22681).

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

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

Новые модули

печатание

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

zipapp

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

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

$ python -m zipapp myapp
$ python myapp.pyz

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

См.также

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

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

аргументированный анализ

Класс ArgumentParser теперь позволяет отключать abbreviated usage из длинных опций, установив для разрешить_аббрев значение False. (Авторы: Джонатан По, Стивен Бетхард, Пол Джей-3 и Даниэль Эрикссон в статье bpo-14910.)

асинхронный

Поскольку модулем 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 для сопрограммы. Метод 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(), теперь принимают все виды awaitable objects. (Автор - Юрий Селиванов.)

  • Новая функция run_coroutine_threadsafe() для отправки сопрограмм в циклы обработки событий из других потоков. ((Автор - Винсент Мишель.)

  • Новый Transport.is_closing() способ проверить, закрывается ли транспорт. (Автор - Юрий Селиванов.)

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

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

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

компьютерная графика

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

смат

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

код

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

коллекции

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

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

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

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

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

(Автор: Беркер Пексаг в статье bpo-24064.)

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

сборники.abc

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

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

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

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

компилировать все

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

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

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

параллельные фьючерсы

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

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

анализатор конфигурации

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

Пример:

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

(Contributed by Lukasz Langa in 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.)

дбм

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

диффлиб

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

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

дистрибутивы

Обе команды build и build_ext теперь поддерживают опцию -j, позволяющую параллельно создавать модули расширения. (Добавлено Антуаном Питру в bpo-5309.)

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

самый проверенный

Функция DocTestSuite() возвращает пустой unittest.TestSuite, если module не содержит строк документации, вместо того, чтобы выводить 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 имеет новый параметр start для указания начального количества значений перечисления, если указаны только имена:

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

(Автор: Итан Фурман в bpo-21706.)

исправитель ошибок

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

функциональные средства

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

глобус

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

gzip-файл

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

куча q

Сравнение элементов в 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.клиент

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 и ХОЛОСТОЙ ход

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

imaplib

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

Модуль imaplib теперь поддерживает RFC 5161 (ВКЛЮЧИТЬ расширение) и RFC 6855 (поддержка UTF-8) с помощью метода IMAP4.enable(). Новый атрибут IMAP4.utf8_enabled отслеживает, включена ли поддержка RFC 6855. (Авторы Милан Оберкирх, Р. Дэвид Мюррей и Мацей Шулик в статье bpo-21800).

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

imghdr (изображение)

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

импортный файл

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

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

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

проверить

Оба класса 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.)

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

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

ио

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

ip-адрес

Оба класса 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.)

линейный кэш

Новая функция 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, будет передавать сообщения обработчикам с учетом уровней обработчиков. (Автор: Винай Саджип).

лзма

Метод 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() объекты теперь поддерживают маринование. (Материалы предоставлены Джошем Розенбергом и Сергеем Сторчакой в bpo-22955.)

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

ос

Добавлена новая функция 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.)

файл пути

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

поплиб

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

ре

Ссылки и условные ссылки на группы с фиксированной длиной теперь разрешены в утверждениях 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.)

строка чтения

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

селекторы

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

выключил

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

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

сигнал

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

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

smtpd - полиция

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

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

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

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

smtplib (ссылка)

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

Метод SMTP.set_debuglevel() теперь принимает дополнительный уровень 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

Биологическая поддержка памяти

(Автор: Герт Янсен в статье bpo-21965.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sqlite3

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

подпроцесс

Добавлена новая функция 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.)

системная настройка

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

архивный файл

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

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

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

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

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

время

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

время это

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

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

ткинтер

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

обратная связь

Новые функции walk_stack() и walk_tb() для удобного перемещения по кадру и traceback objects. (Автор Роберт Коллинз в bpo-17911).

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

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

типы

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

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

данные в юникоде

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

единичный тест

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

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

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

единичный тест.имитация

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

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

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

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

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

urllib

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

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

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

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

wsgiref (пожар)

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

xmlrpc

Класс client.ServerProxy теперь поддерживает протокол context manager. (Добавлено Клаудиу Попой в bpo-20627.)

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

xml.sax

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

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

почтовый файл

Выходные данные 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.)

Методы String find(), rfind(), split(), partition() и оператор in string теперь значительно ускоряют поиск подстрок длиной в 1 символ. (Автор - Сергей Сторчака в bpo-23573.)

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

Добавлены новые функции 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.)

Новые функции : c:func: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 на РУКЕ.

    • При сборке в режиме отладки <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 всегда декодировал часть данных в сообщениях электронной почты, используя кодек utf-8. Теперь это можно контролировать с помощью нового ключевого слова decode_data, которое преобразуется в SMTPServer. Значением по умолчанию является True, но это значение по умолчанию является устаревшим. Укажите ключевое слово decode_data с соответствующим значением, чтобы избежать предупреждения об устаревании.

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

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

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

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

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

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

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

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

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

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

Удаленный

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

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

  • Атрибут __version__ был удален из пакета электронной почты. Код электронной почты долгое время не отправлялся отдельно от стандартного файла, а строка __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, поскольку выражения генератора должны быть заключены в круглые скобки, если они не являются единственным аргументом функции.

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

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

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

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

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

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

  • Хотя формально это не является частью API, стоит отметить для целей переноса (например, для исправления тестов), что сообщения об ошибках, которые ранее имели вид «„sometype“ не поддерживает протокол buffer», теперь имеют вид «требуется bytes-like object, не «какой-то тип»». (Автор - Эцио Мелотти в статье bpo-16518.)

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

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

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

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

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

  • PEP 488 удалил .pyo файлов из Python и ввел необязательный тег opt- в .pyc именах файлов. Тег importlib.util.cache_from_source() получил параметр оптимизации, который помогает управлять тегом opt-. Из-за этого параметр debug_override функции теперь устарел. .pyo файлы также больше не поддерживаются в качестве файлового аргумента интерпретатора Python и, следовательно, не служат никакой цели при самостоятельном распространении (т.е. при распространении кода без исходного кода). Из-за того, что магическое число для байт-кода изменилось в Python 3.5, все старые файлы .pyo из предыдущих версий Python недействительны независимо от этого PEP.

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

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

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

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

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

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

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

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

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

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

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

  • Поскольку отсутствие атрибута __module__ нарушает обработку и самоанализ, для встроенных типов без атрибута __module__ теперь выдается предупреждение об устаревании. В будущем это может привести к ошибке атрибута. (Автор - Сергей Сторчака в bpo-20204.)

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

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

Новая цель построения make regen-all

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

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

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

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

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

Удаление make touch целевого объекта сборки

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

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

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

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

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