Содержание страницы
Что нового в Python 3.5¶What’s New In Python 3.5
- Редакторы:
Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>
В этой статье описаны новые возможности Python 3.5 по сравнению с версией 3.4. Python 3.5 был выпущен 13 сентября 2015 года. Полный список изменений см. в списке изменений.
См. также
PEP 478 - Python 3.5 Release Schedule
Краткое содержание – Основные моменты выпуска¶Summary – Release highlights
Новые возможности синтаксиса:
PEP 492, корутины с синтаксисом async и await.
PEP 465, новый оператор умножения матриц:
a @ b.PEP 448, дополнительные обобщения распаковки.
Новые модули библиотеки:
Новые встроенные возможности:
bytes % args,bytearray % args: PEP 461 – Добавление форматирования%для bytes и bytearray.Новые методы
bytes.hex(),bytearray.hex()иmemoryview.hex(). (Автор: Arnon Yaari в bpo-9951.)memoryviewтеперь поддерживает индексацию кортежей (включая многомерную). (Автор: Antoine Pitrou в bpo-23632.)У генераторов появился новый атрибут
gi_yieldfrom, который возвращает объект, итерируемый выражениямиyield from. (Авторы: Benno Leslie и Yury Selivanov в bpo-24450.)Теперь при достижении максимальной глубины рекурсии возбуждается новое исключение
RecursionError. (Автор: Georg Brandl в bpo-19235.)
Улучшения реализации CPython:
Когда
LC_TYPEлокаль является локалью POSIX (Cлокаль),sys.stdinиsys.stdoutтеперь используют обработчик ошибокsurrogateescape, вместо обработчика ошибокstrict. (Автор: Victor Stinner в bpo-19977.)Файлы
.pyoбольше не используются; вместо них используется более гибкая схема, которая явно включает уровень оптимизации в имя.pyc. (См. обзор PEP 488.)Встроенные модули и модули расширений теперь инициализируются в многофазном процессе, аналогичном загрузке модулей Python. (См. обзор PEP 489.)
Значительные улучшения в стандартной библиотеке:
collections.OrderedDictis now implemented in C, which makes it 4 to 100 times faster.The
sslmodule gained support for Memory BIO, which decouples SSL protocol handling from network IO.The new
os.scandir()function provides a better and significantly faster way of directory traversal.functools.lru_cache()has been mostly reimplemented in C, yielding much better performance.The new
subprocess.run()function provides a streamlined way to run subprocesses.The
tracebackmodule has been significantly enhanced for improved performance and developer convenience.
Улучшения безопасности:
SSLv3 теперь отключён во всей стандартной библиотеке. Его можно включить, вручную создав экземпляр
ssl.SSLContext. (Подробнее см. bpo-22638; это изменение было перенесено в CPython 3.4 и 2.7.)Разбор HTTP-куки теперь выполняется более строго для защиты от потенциальных атак внедрения. (Предложено Антуаном Питу в bpo-22796.)
Улучшения в Windows:
A new installer for Windows has replaced the old MSI. See Using Python on Windows for more information.
Сборки для Windows теперь используют Microsoft Visual C++ 14.0, и модули расширения должны использовать ту же версию.
Читайте далее полный список изменений, влияющих на пользователей, включая множество других небольших улучшений, оптимизаций CPython, устаревших возможностей и потенциальных проблем при переносе.
Новые возможности¶New Features
PEP 492 – Корутины с синтаксисом async и await¶PEP 492 - Coroutines with async and await syntax
PEP 492 greatly improves support for asynchronous programming in Python by adding awaitable objects, coroutine functions, asynchronous iteration, and asynchronous context managers.
Корутинные функции объявляются с помощью нового синтаксиса async def:
>>> async def coro():
... return 'spam'
Inside a coroutine function, the new await expression can be used
to suspend coroutine execution until the result is available. Any object
can be awaited, as long as it implements the awaitable protocol by
defining the __await__() method.
PEP 492 также добавляет оператор async for для удобной итерации
по асинхронным итерируемым объектам.
Пример простейшего HTTP-клиента, написанного с использованием нового синтаксиса:
import asyncio
async def http_get(domain):
reader, writer = await asyncio.open_connection(domain, 80)
writer.write(b'\r\n'.join([
b'GET / HTTP/1.1',
b'Host: %b' % domain.encode('latin-1'),
b'Connection: close',
b'', b''
]))
async for line in reader:
print('>>>', line)
writer.close()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(http_get('example.com'))
finally:
loop.close()
По аналогии с асинхронной итерацией существует новый синтаксис для асинхронных контекстных менеджеров. Следующий скрипт:
import asyncio
async def coro(name, lock):
print('coro {}: waiting for lock'.format(name))
async with lock:
print('coro {}: holding the lock'.format(name))
await asyncio.sleep(1)
print('coro {}: releasing the lock'.format(name))
loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
loop.run_until_complete(coros)
finally:
loop.close()
выведет:
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
Обратите внимание, что и async for, и async with можно использовать
только внутри корутинной функции, объявленной с async def.
Coroutine functions are intended to be run inside a compatible event loop, such as the asyncio loop.
Примечание
Changed in version 3.5.2: Starting with CPython 3.5.2, __aiter__ can directly return
asynchronous iterators. Returning
an awaitable object will result in a
PendingDeprecationWarning.
See more details in the Asynchronous Iterators documentation section.
См. также
- PEP 492 – Coroutines with async and await syntax
PEP написан и реализован Юрием Селивановым.
PEP 465 – Выделенный инфиксный оператор для умножения матриц¶PEP 465 - A dedicated infix operator for matrix multiplication
PEP 465 adds the @ infix operator for matrix multiplication.
Currently, no builtin Python types implement the new operator, however, it
can be implemented by defining __matmul__(),
__rmatmul__(), and __imatmul__() for regular,
reflected, and in-place matrix multiplication.
The semantics of these methods is similar to that of
methods defining other infix arithmetic operators.
Умножение матриц – особенно распространённая операция во многих
областях математики, науки и техники, и добавление @ позволяет
писать более чистый код:
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
вместо:
S = dot((dot(H, beta) - r).T,
dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
NumPy 1.10 поддерживает новый оператор:
>>> import numpy
>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])
>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> x @ m
array([ 1., 1., 1.])
См. также
- PEP 465 – Специализированный инфиксный оператор для матричного умножения
PEP написан Натаниэлем Дж. Смитом; реализован Бенджамином Петерсоном.
PEP 448 – Дополнительные обобщения распаковки¶PEP 448 - Additional Unpacking Generalizations
PEP 448 расширяет допустимые способы применения * оператора распаковки итерируемых объектов
и ** оператора распаковки словарей. Теперь можно
использовать произвольное количество распаковок в вызовах функций:
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5
>>> def fn(a, b, c, d):
... print(a, b, c, d)
...
>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4
Аналогично, литералы кортежей, списков, множеств и словарей допускают множественную распаковку (см. Списки выражений и Литералы словарей):
>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
См. также
- PEP 448 – Дополнительные обобщения распаковки
PEP написан Джошуа Ландау; реализован Нилом Гирдхаром, Томасом Воутерсом и Джошуа Ландау.
PEP 461 – поддержка процентного форматирования для bytes и bytearray¶PEP 461 - percent formatting support for bytes and bytearray
PEP 461 добавляет поддержку %
оператора интерполяции для bytes
и bytearray.
Хотя интерполяция обычно считается строковой операцией, существуют
случаи, когда интерполяция для bytes или bytearrays имеет смысл, и
работа, необходимая для восполнения отсутствующей функциональности, снижает
общую читаемость кода. Эта проблема особенно актуальна при
работе с протоколами формата передачи данных, которые часто представляют собой смесь двоичных
и ASCII-совместимых текстов.
Примеры:
>>> b'Hello %b!' % b'World'
b'Hello World!'
>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
Unicode не допускается для %b, но принимается %a (эквивалент
repr(obj).encode('ascii', 'backslashreplace')):
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'
>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
Обратите внимание, что типы преобразования %s и %r, хотя и поддерживаются, должны
использоваться только в кодовых базах, которым требуется совместимость с Python 2.
См. также
- PEP 461 – Добавление % форматирования для bytes и bytearray
PEP написан Итаном Фурманом; реализован Нилом Шеменауэром и Итаном Фурманом.
PEP 484 – Подсказки типов¶PEP 484 - Type Hints
Синтаксис аннотаций функций является возможностью Python начиная с версии 3.0 (PEP 3107), однако семантика аннотаций оставалась неопределённой.
Опыт показал, что большинство случаев использования аннотаций функций сводилось к предоставлению подсказок типов для параметров функций и возвращаемых значений. Стало очевидно, что для пользователей Python было бы полезно, если бы стандартная библиотека включала базовые определения и инструменты для аннотаций типов.
PEP 484 вводит временный модуль для предоставления этих стандартных определений и инструментов, а также некоторые соглашения для ситуаций, когда аннотации недоступны.
Например, вот простая функция, тип аргумента и возвращаемое значение которой объявлены в аннотациях:
def greeting(name: str) -> str:
return 'Hello ' + name
Хотя эти аннотации доступны во время выполнения через обычный
атрибут __annotations__, автоматическая проверка типов не происходит
во время выполнения. Вместо этого предполагается, что отдельный внешний анализатор типов
(например, mypy) будет использоваться для анализа исходного кода по требованию.
Система типов поддерживает объединения, обобщённые типы и специальный тип
с именем Any, который совместим (т.е. может быть присвоен любому типу и любой тип может быть присвоен ему) со всеми типами.
PEP 471 – функция os.scandir() – лучший и более быстрый итератор каталогов¶PEP 471 - os.scandir() function – a better and faster directory iterator
PEP 471 добавляет новую функцию итерации по каталогам, os.scandir(),
в стандартную библиотеку. Кроме того, os.walk() теперь
реализована с помощью scandir, что делает её в 3-5 раз быстрее
в системах POSIX и в 7-20 раз быстрее в системах Windows. Это
достигается в основном за счёт значительного сокращения количества вызовов os.stat(),
необходимых для обхода дерева каталогов.
Кроме того, scandir возвращает итератор, а не
список имён файлов, что повышает эффективность использования памяти при итерации
по очень большим каталогам.
Следующий пример показывает простое использование os.scandir() для отображения всех
файлов (за исключением каталогов) в заданном пути, которые не начинаются с
'.'. Вызов entry.is_file() обычно
не выполняет дополнительного системного вызова:
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
См. также
- PEP 471 – функция os.scandir() – более качественный и быстрый итератор каталогов
PEP написан и реализован Беном Хойтом (Ben Hoyt) при содействии Виктора Стиннера (Victor Stinner).
PEP 475: Повтор системных вызовов, завершающихся с EINTR¶PEP 475: Retry system calls failing with EINTR
Код ошибки errno.EINTR возвращается всякий раз, когда системный вызов, ожидающий ввода-вывода, прерывается сигналом. Ранее в таких случаях Python возбуждал InterruptedError. Это означало, что при написании приложения на Python у разработчика было два варианта:
Игнорировать
InterruptedError.Обрабатывать
InterruptedErrorи пытаться перезапустить прерванный системный вызов в каждом месте вызова.
Первый вариант приводит к перемежающимся сбоям приложения. Второй вариант добавляет большое количество шаблонного кода, делающего код почти нечитаемым. Сравните:
print("Hello World")
и:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475 реализует автоматический повтор системных вызовов при EINTR. Это снимает необходимость обработки EINTR или InterruptedError в пользовательском коде в большинстве ситуаций и делает программы Python, включая стандартную библиотеку, более надёжными. Обратите внимание, что системный вызов повторяется, только если обработчик сигнала не возбуждает исключение.
Ниже приведён список функций, которые теперь повторяются при прерывании сигналом:
функции модуля
faulthandler;функции
os:fchdir(),fchmod(),fchown(),fdatasync(),fstat(),fstatvfs(),fsync(),ftruncate(),mkfifo(),mknod(),open(),posix_fadvise(),posix_fallocate(),pread(),pwrite(),read(),readv(),sendfile(),wait3(),wait4(),wait(),waitid(),waitpid(),write(),writev();особые случаи:
os.close()иos.dup2()теперь игнорируют ошибкиEINTR; системный вызов не повторяется (за обоснованием обратитесь к PEP);функции
select:devpoll.poll(),epoll.poll(),kqueue.control(),poll.poll(),select();методы класса
socket:accept(),connect()(кроме неблокирующих сокетов),recv(),recvfrom(),recvmsg(),send(),sendall(),sendmsg(),sendto();
См. также
- PEP 475 – Повтор системных вызовов, завершающихся с EINTR
PEP и реализация написаны Шарлем-Франсуа Натали (Charles-François Natali) и Виктором Стиннером (Victor Stinner) при содействии Антуана Питру (Antoine Pitrou) (французское звено).
PEP 479: Изменение обработки StopIteration внутри генераторов¶PEP 479: Change StopIteration handling inside generators
Взаимодействие генераторов и StopIteration в Python 3.4 и более ранних версиях иногда было неожиданным и могло скрывать трудноуловимые ошибки. Ранее StopIteration, случайно возбуждённое внутри генераторной функции, интерпретировалось конструкцией цикла, управляющего генератором, как окончание итерации.
PEP 479 изменяет поведение генераторов: когда внутри генератора возбуждается исключение StopIteration, оно заменяется на RuntimeError перед выходом из фрейма генератора. Основная цель этого изменения – упростить отладку в ситуации, когда незащищённый вызов next() возбуждает StopIteration и приводит к молчаливому завершению итерации, управляемой генератором. Это особенно опасно в сочетании с конструкцией yield from.
Это обратно несовместимое изменение, поэтому для включения нового поведения необходим импорт __future__:
>>> from __future__ import generator_stop
>>> def gen():
... next(iter([]))
... yield
...
>>> next(gen())
Traceback (most recent call last):
File "<stdin>", line 2, in gen
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
Без импорта __future__ будет возбуждаться PendingDeprecationWarning всякий раз, когда внутри генератора возбуждается исключение StopIteration.
См. также
- PEP 479 – Изменение обработки StopIteration внутри генераторов
PEP написан Крисом Анжелико (Chris Angelico) и Гвидо ван Россумом (Guido van Rossum). Реализован Крисом Анжелико, Юрием Селивановым и Ником Когланом (Nick Coghlan).
PEP 485: Функция для проверки приблизительного равенства¶PEP 485: A function for testing approximate equality
PEP 485 добавляет функции math.isclose() и cmath.isclose(), которые определяют, являются ли два значения приблизительно равными или «близкими» друг к другу. Решение о том, считаются ли два значения близкими, принимается на основе заданных абсолютного и относительного допусков. Относительный допуск – это максимально допустимая разница между аргументами isclose, относительно большего абсолютного значения:
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
Также можно сравнивать два значения с использованием абсолютного допуска, который должен быть неотрицательным:
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
См. также
- PEP 485 – Функция для проверки приблизительного равенства
PEP написан Кристофером Баркером (Christopher Barker); реализован Крисом Баркером (Chris Barker) и Талем Эйнатом (Tal Einat).
PEP 486: Обучить средство запуска Python работе с виртуальными окружениями¶PEP 486: Make the Python Launcher aware of virtual environments
PEP 486 обучает средство запуска Windows (см. PEP 397) распознавать активное виртуальное окружение. Когда используется интерпретатор по умолчанию и установлена переменная окружения VIRTUAL_ENV, будет использоваться интерпретатор из виртуального окружения.
См. также
- PEP 486 – Обучить средство запуска Python работе с виртуальными окружениями
PEP написан и реализован Полом Муром.
PEP 488: Устранение PYO файлов¶PEP 488: Elimination of PYO files
PEP 488 отменяет понятие файлов .pyo. Это означает, что файлы .pyc теперь представляют как неоптимизированный, так и оптимизированный байткод. Чтобы избежать необходимости постоянно перегенерировать файлы байткода, файлы .pyc теперь имеют необязательную метку opt- в имени, когда байткод оптимизирован. Побочным эффектом является отсутствие конфликтов имен файлов байткода при запуске под -O или -OO. Следовательно, файлы байткода, сгенерированные из -O и -OO, теперь могут существовать одновременно. importlib.util.cache_from_source() имеет обновлённый API для поддержки этого изменения.
См. также
- PEP 488 – Устранение PYO файлов
PEP написан и реализован Бреттом Кэнноном.
PEP 489: Многофазная инициализация модулей расширения¶PEP 489: Multi-phase extension module initialization
PEP 489 обновляет инициализацию модулей расширения, чтобы использовать двухэтапный механизм загрузки модулей, введённый PEP 451 в Python 3.4.
Это изменение делает семантику импорта модулей расширения, которые opt-in используют новый механизм, гораздо ближе к семантике модулей исходного кода и байткода Python, включая возможность использовать любой допустимый идентификатор в качестве имени модуля, а не ограничиваться ASCII.
См. также
- PEP 489 – Многофазная инициализация модуля расширения
PEP написан Петром Викториным, Стефаном Бенелем и Ником Когленом; реализован Петром Викториным.
Другие изменения языка¶Other Language Changes
Некоторые более мелкие изменения, внесённые в ядро языка Python:
Добавлены обработчики ошибок
"namereplace". Обработчики ошибок"backslashreplace"теперь работают с декодированием и трансляцией. (Предоставлено Серхием Сторчакой в bpo-19676 и bpo-22286.)Опция
-bтеперь влияет на сравненияbytesсint. (Предоставлено Серхием Сторчакой в bpo-23681.)Новые казахские
kz1048и таджикскиеkoi8_tкодеки. (Предоставлено Серхием Сторчакой в bpo-22682 и bpo-22681.)Докстринги свойств теперь доступны для записи. Это особенно полезно для докстрингов
collections.namedtuple(). (Предоставлено Беркером Пексагом в bpo-24064.)Теперь поддерживаются циклические импорты, включающие относительные импорты. (Предоставлено Бреттом Кэнноном и Антуаном Питру в bpo-17636.)
Новые модули¶New Modules
typing¶
Новый typing временный модуль предоставляет стандартные определения и инструменты для аннотаций типов функций. См. Type Hints для получения дополнительной информации.
zipapp¶
Новый модуль zipapp (указанный в PEP 441) предоставляет API и инструмент командной строки для создания исполняемых Python Zip-приложений, которые были введены в Python 2.6 в bpo-1739468, но не были широко известны ни тогда, ни после.
С новым модулем упаковка приложения сводится к помещению всех файлов, включая файл __main__.py, в каталог myapp и запуску:
$ python -m zipapp myapp
$ python myapp.pyz
Реализация модуля предоставлена Полом Муром в bpo-23491.
См. также
PEP 441 – Улучшение поддержки Python ZIP-приложений
Улучшенные модули¶Improved Modules
argparse¶
Класс ArgumentParser теперь позволяет отключать сокращённое использование длинных опций, установив allow_abbrev в False. (Предоставлено Джонатаном Пофом, Стивеном Бетардом, paul j3 и Даниэлем Эрикссоном в bpo-14910.)
asyncio¶
Поскольку модуль asyncio является временным, все изменения, введённые в Python 3.5, также были перенесены в Python 3.4.x.
Заметные изменения в модуле asyncio начиная с Python 3.4.0:
Новые API для отладки: методы
loop.set_debug()иloop.get_debug(). (Предоставлено Виктором Стиннером.)Proactor-цикл событий теперь поддерживает SSL. (Предоставлено Антуаном Питру и Виктором Стиннером в bpo-22560.)
Новый метод
loop.is_closed()для проверки, закрыт ли цикл событий. (Предоставлено Виктором Стиннером в bpo-21326.)Новый
loop.create_task()для удобного создания и планирования новогоTaskдля корутины. Методcreate_taskтакже используется всеми функциями asyncio, которые оборачивают корутины в задачи, такими какasyncio.wait(),asyncio.gather()и т.д. (Предоставлено Виктором Стиннером.)Новый
transport.get_write_buffer_limits()метод для запроса верхнего и нижнего порогов управления потоком. (Предложено Виктором Стиннером.)Функция
async()устарела в пользуensure_future(). (Предложено Юрием Селивановым.)Новые методы
loop.set_task_factory()иloop.get_task_factory()для настройки фабрики задач, используемой методомloop.create_task(). (Предложено Юрием Селивановым.)Новые
Queue.join()иQueue.task_done()методы очереди. (Предложено Виктором Стиннером.)Класс
JoinableQueueбыл удалён в пользу классаasyncio.Queue. (Предложено Виктором Стиннером.)
Обновления в версии 3.5.1:
Функция
ensure_future()и все функции, которые её используют, такие какloop.run_until_complete(), теперь принимают все виды ожидаемых объектов. (Предложено Юрием Селивановым.)Новая функция
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 теперь поддерживает менеджера контекста
протокол. (Предложено Беркером Пексагом в bpo-20289.)
cmath¶
Новая функция isclose() предоставляет способ проверки на приблизительное
равенство. (Предложено Крисом Баркером и Талем Эйнатом в bpo-24270.)
code¶
Метод InteractiveInterpreter.showtraceback()
теперь выводит полную цепочку трассировки, как и интерактивный
интерпретатор. (Предложено Клавдиу Попа в bpo-17442.)
collections¶
Класс OrderedDict теперь реализован на C, что
делает его в 4–100 раз быстрее. (Предложено Эриком Сноу в bpo-16991.)
Представления OrderedDict.items(), OrderedDict.keys()
и OrderedDict.values() теперь поддерживают итерацию reversed().
(Предложено Сергеем Сторчакой в bpo-19505.)
Класс deque теперь определяет index(), insert() и copy(), а также поддерживает операторы + и *. Это позволяет распознавать объекты deque как MutableSequence и улучшает их взаимозаменяемость со списками. (Предложено Рэймондом Хеттингером в bpo-23704.)
Докстринги, созданные namedtuple(), теперь можно обновлять:
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
(Предложено Беркером Пексагом в bpo-24064.)
Класс UserString теперь реализует методы
__getnewargs__(), __rmod__(), casefold(),
format_map(), isprintable() и maketrans(),
соответствующие методам str.
(Предложено Джо Джевником в bpo-22189.)
collections.abc¶
Метод Sequence.index() теперь принимает аргументы start и stop, чтобы соответствовать аналогичным методам tuple, list и т. д. (Автор: Devin Jeanpierre в bpo-23086.)
Новый абстрактный базовый класс Generator. (Автор: Stefan Behnel в bpo-24018.)
Новые абстрактные базовые классы Awaitable, Coroutine, AsyncIterator и AsyncIterable. (Автор: Yury Selivanov в bpo-24184.)
Для более ранних версий Python обратный порт новых ABC доступен во внешнем пакете PyPI.
compileall¶
Новая опция compileall, -j N, позволяет запускать N рабочих процессов одновременно для параллельной компиляции байт-кода. Функция compile_dir() имеет соответствующий параметр workers. (Автор: Claudiu Popa в bpo-16104.)
Ещё одна новая опция, -r, позволяет управлять максимальной глубиной рекурсии для подкаталогов. (Автор: Claudiu Popa в bpo-19628.)
Опцию командной строки -q теперь можно указывать несколько раз – в этом случае весь вывод, включая ошибки, будет подавляться. Соответствующий параметр quiet в compile_dir(), compile_file() и compile_path() теперь может принимать целочисленное значение, указывающее уровень подавления вывода. (Автор: Thomas Kluyver в bpo-21338.)
concurrent.futures¶
Метод Executor.map() теперь принимает аргумент chunksize для группировки задач с целью повышения производительности при использовании ProcessPoolExecutor(). (Автор: Dan O’Reilly в bpo-11271.)
Количество рабочих процессов в конструкторе ThreadPoolExecutor теперь необязательно. Значение по умолчанию – 5 * количество CPU. (Автор: Claudiu Popa в bpo-21527.)
configparser¶
configparser теперь предоставляет способ настройки преобразования значений: можно указать словарь конвертеров в конструкторе ConfigParser или определить их как методы в подклассах ConfigParser. Конвертеры, определённые в экземпляре парсера, наследуются его прокси-объектами разделов.
Пример:
>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
(Автор: Łukasz Langa в bpo-18159.)
contextlib¶
Новый redirect_stderr() менеджер контекста (аналогичный redirect_stdout()) упрощает для вспомогательных скриптов работу с негибкими API, которые пишут свой вывод в sys.stderr и не предоставляют возможности его перенаправить:
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
... logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
(Автор: Berker Peksag в bpo-22389.)
csv¶
Метод writerow() теперь поддерживает произвольные итерируемые объекты, а не только последовательности. (Автор: Serhiy Storchaka в bpo-23171.)
curses¶
Новая функция update_lines_cols() обновляет переменные модуля LINES и COLS. Это полезно для обнаружения ручного изменения размера экрана. (Автор: Arnon Yaari в bpo-4254.)
dbm¶
dumb.open всегда создаёт новую базу данных, когда флаг имеет значение "n". (Автор: Claudiu Popa в bpo-18039.)
difflib¶
Кодировку HTML-документов, создаваемых HtmlDiff.make_file(), теперь можно настроить с помощью нового именованного аргумента charset. Кодировка по умолчанию изменилась с "ISO-8859-1" на "utf-8". (Автор: Berker Peksag в bpo-2052.)
Функция diff_bytes() теперь может сравнивать списки байтовых строк. Это исправляет регрессию из Python 2. (Авторы: Terry J. Reedy и Greg Ward в bpo-17445.)
distutils¶
Обе команды build и build_ext теперь принимают опцию -j для включения параллельной сборки модулей расширения. (Автор: Antoine Pitrou в bpo-5309.)
Модуль distutils теперь поддерживает сжатие xz, которое можно включить, передав xztar в качестве аргумента в bdist --format. (Автор: Serhiy Storchaka в bpo-16314.)
doctest¶
Функция DocTestSuite() возвращает пустой unittest.TestSuite, если модуль не содержит строк документации, вместо того чтобы возбуждать ValueError. (Автор: Glenn Jones в bpo-15916.)
email¶
Новая опция политики Policy.mangle_from_ управляет, добавляют ли генераторы префикс с символом ">" к строкам, начинающимся с "From ", в телах электронных писем. По умолчанию True для compat32 и False для всех остальных политик.
(Автор: Milan Oberkirch в bpo-20098.)
Новый метод Message.get_content_disposition() предоставляет простой доступ к каноническому значению для заголовка Content-Disposition.
(Автор: Abhilash Raj в bpo-21083.)
Новую опцию политики EmailPolicy.utf8 можно установить в True для кодирования заголовков электронных писем с использованием кодировки UTF-8 вместо кодированных слов. Это позволяет форматировать Messages в соответствии с RFC 6532 и использовать с SMTP-сервером, поддерживающим расширение RFC 6531 SMTPUTF8.
(Автор: R. David Murray в bpo-24211.)
Конструктор mime.text.MIMEText теперь принимает экземпляр charset.Charset.
(Авторы: Claude Paroz и Berker Peksag в bpo-16324.)
enum¶
Вызываемый объект Enum получил новый параметр start, задающий начальное количество значений перечисления, если указаны только names:
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
(Автор: Ethan Furman в bpo-21706.)
faulthandler¶
Функции enable(), register(), dump_traceback() и dump_traceback_later() теперь принимают файловые дескрипторы в дополнение к объектам, похожим на файлы.
(Автор: Wei Wu в bpo-23566.)
functools¶
Большая часть механизма lru_cache() теперь реализована на C, что делает его значительно быстрее.
(Авторы: Matt Joiner, Alexey Kachayev и Serhiy Storchaka в bpo-14373.)
glob¶
Функции iglob() и glob() теперь поддерживают рекурсивный поиск в подкаталогах, используя шаблон "**".
(Автор: Serhiy Storchaka в bpo-13968.)
gzip¶
Аргумент mode конструктора GzipFile теперь принимает "x" для запроса эксклюзивного создания.
(Автор: Tim Heaney в bpo-19222.)
heapq¶
Сравнение элементов в merge() теперь можно настраивать, передавая функцию ключа в новом необязательном именованном аргументе key, а новый необязательный именованный аргумент reverse можно использовать для обращения порядка сравнения элементов:
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
(Автор: Raymond Hettinger в bpo-13742.)
http¶
Новое перечисление HTTPStatus, определяющее набор HTTP-кодов состояния, фраз причины и подробных описаний на английском языке.
(Автор: Demian Brecht в bpo-21793.)
http.client¶
HTTPConnection.getresponse() теперь вызывает исключение RemoteDisconnected, когда соединение с удаленным сервером неожиданно закрывается. Кроме того, если возникает ConnectionError (подклассом которого является RemoteDisconnected), клиентский сокет теперь автоматически закрывается и будет переподключаться при следующем запросе:
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
try:
conn.request('GET', '/')
resp = conn.getresponse()
except http.client.RemoteDisconnected:
pass
(Автор: Martin Panter в bpo-3566.)
idlelib и IDLE¶idlelib and IDLE
Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для импорта другими программами, он получает улучшения с каждым релизом. Смотрите Lib/idlelib/NEWS.txt для полного списка изменений начиная с 3.4.0, а также изменений, внесенных в будущих версиях 3.5.x. Этот файл также доступен из диалога IDLE .
imaplib¶
Класс IMAP4 теперь поддерживает протокол менеджера контекста. При использовании в операторе with команда IMAP4 LOGOUT будет автоматически вызвана в конце блока.
(Авторы: Tarek Ziadé и Serhiy Storchaka в bpo-4972.)
Модуль imaplib теперь поддерживает RFC 5161 (ENABLE Extension) и RFC 6855 (UTF-8 Support) через метод IMAP4.enable(). Новый атрибут IMAP4.utf8_enabled отслеживает, включена ли поддержка RFC 6855.
(Авторы: Milan Oberkirch, R. David Murray и Maciej Szulik в bpo-21800.)
Модуль imaplib теперь автоматически кодирует не-ASCII строки имен пользователей и паролей с использованием UTF-8, как рекомендуется в RFC.
(Автор: Milan Oberkirch в bpo-21800.)
imghdr¶
Функция what() теперь распознает формат OpenEXR (предложен Martin Vignali и Claudiu Popa в bpo-20295) и формат WebP (предложен Fabrice Aneche и Claudiu Popa в bpo-20197).
importlib¶
Класс util.LazyLoader позволяет отложенную загрузку модулей в приложениях, где время запуска критично. (Предложено Бреттом Кэнноном в bpo-17621.)
Метод abc.InspectLoader.source_to_code() теперь является статическим. Это упрощает инициализацию объекта модуля кодом, скомпилированным из строки, через вызов exec(code, module.__dict__). (Предложено Бреттом Кэнноном в bpo-21156.)
Новая функция util.module_from_spec() теперь является предпочтительным способом создания модуля. В отличие от прямого создания экземпляра types.ModuleType, эта функция устанавливает различные атрибуты, управляемые импортом, на основе переданного объекта спецификации. (Предложено Бреттом Кэнноном в bpo-20383.)
inspect¶
Оба класса – Signature и Parameter – теперь поддерживают сериализацию и хеширование. (Предложено Юрием Селивановым в bpo-20726 и bpo-20334.)
Новый метод BoundArguments.apply_defaults() позволяет задавать значения по умолчанию для отсутствующих аргументов:
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
(Предложено Юрием Селивановым в bpo-24190.)
Новый метод класса Signature.from_callable() упрощает создание подклассов Signature. (Предложено Юрием Селивановым и Эриком Сноу в bpo-17373.)
Функция signature() теперь принимает необязательный именованный аргумент follow_wrapped, который при установке в False отключает автоматическое следование по ссылкам __wrapped__. (Предложено Юрием Селивановым в bpo-20691.)
Добавлен набор новых функций для интроспекции корутинных функций и объектов корутин: iscoroutine(), iscoroutinefunction(), isawaitable(), getcoroutinelocals() и getcoroutinestate(). (Предложено Юрием Селивановым в bpo-24017 и bpo-24400.)
Функции stack(), trace(), getouterframes() и getinnerframes() теперь возвращают список именованных кортежей. (Предложено Дэниэлом Шахафом в bpo-16808.)
io¶
Новый метод BufferedIOBase.readinto1(), который использует не более одного вызова методов RawIOBase.read() или RawIOBase.readinto() базового необработанного потока. (Предложено Николаусом Ратом в bpo-20578.)
ipaddress¶
Оба класса – IPv4Network и IPv6Network – теперь принимают аргумент-кортеж (address, netmask), что позволяет легко создавать сетевые объекты из существующих адресов:
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
(Предложено Питером Муди и Антуаном Питру в bpo-16531.)
Новый атрибут reverse_pointer для классов IPv4Address и IPv6Address возвращает имя обратной DNS-записи PTR:
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
(Предложено Леоном Вебером в bpo-20480.)
json¶
Интерфейс командной строки json.tool теперь сохраняет порядок ключей в JSON-объектах, переданных на вход. Новая опция --sort-keys позволяет сортировать ключи по алфавиту. (Предложено Беркером Пексагом в bpo-21650.)
Декодер JSON теперь вызывает JSONDecodeError вместо ValueError, чтобы предоставить больше контекстной информации об ошибке. (Предложено Серхием Сторчакой в bpo-19361.)
linecache¶
Новую функцию lazycache() можно использовать для захвата информации о модуле, не основанном на файле, чтобы позже получать его строки через getline(). Это позволяет избежать операций ввода-вывода до тех пор, пока строка действительно не понадобится, и не требует бесконечного хранения глобальных переменных модуля. (Предложено Робертом Коллинзом в bpo-17911.)
locale¶
Новая функция delocalize() позволяет преобразовать строку в нормализованное строковое представление числа с учётом настроек LC_NUMERIC:
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
(Предложено Седриком Криером в bpo-13918.)
logging¶
Все методы логирования (Logger log(), exception(), critical(), debug() и т.д.) теперь принимают экземпляры исключений в качестве аргумента exc_info в дополнение к логическим значениям и кортежам исключений:
>>> import logging
>>> try:
... 1/0
... except ZeroDivisionError as ex:
... logging.error('exception', exc_info=ex)
ERROR:root:exception
(Предложено Юрием Селивановым в bpo-20537.)
Класс handlers.HTTPHandler теперь принимает необязательный экземпляр ssl.SSLContext для настройки параметров SSL, используемых в HTTP-соединении. (Предложено Алексом Гейнором в bpo-22788.)
Класс handlers.QueueListener теперь принимает именованный аргумент respect_handler_level, который при установке в True будет передавать сообщения обработчикам с учётом их уровней. (Предложено Винаем Саджипом.)
lzma¶
Метод LZMADecompressor.decompress()
теперь принимает необязательный аргумент max_length для ограничения максимального
размера распакованных данных.
(Предложено Martin Panter в bpo-15955.)
math¶
В модуль math добавлены две новые константы: inf
и nan. (Предложено Mark Dickinson в bpo-23185.)
Новая функция isclose() предоставляет способ проверки приблизительного
равенства. (Предложено Chris Barker и Tal Einat в bpo-24270.)
Добавлена новая функция gcd(). Функция fractions.gcd()
теперь устарела. (Предложено Mark Dickinson и Serhiy Storchaka в bpo-22486.)
multiprocessing¶
Объекты sharedctypes.synchronized()
теперь поддерживают протокол менеджера контекста.
(Предложено Charles-François Natali в bpo-21565.)
operator¶
Объекты attrgetter(), itemgetter()
и methodcaller() теперь поддерживают упаковку (pickling).
(Предложено Josh Rosenberg и Serhiy Storchaka в bpo-22955.)
Новые функции matmul() и imatmul()
для выполнения матричного умножения.
(Предложено Benjamin Peterson в bpo-21176.)
os¶
Добавлена новая функция scandir(), возвращающая итератор объектов
DirEntry. Если возможно, scandir()
извлекает атрибуты файлов при сканировании каталога, что устраняет необходимость
выполнять последующие системные вызовы для определения типа или атрибутов файла, что может
значительно повысить производительность. (Предложено Ben Hoyt с помощью
Victor Stinner в bpo-22524.)
В Windows теперь доступен новый атрибут
stat_result.st_file_attributes. Он соответствует элементу dwFileAttributes
структуры BY_HANDLE_FILE_INFORMATION, возвращаемой функцией
GetFileInformationByHandle(). (Предложено Ben Hoyt в bpo-21719.)
Функция urandom() теперь использует системный вызов getrandom() в Linux 3.17
или новее и getentropy() в OpenBSD 5.6 и новее, что устраняет необходимость
использовать /dev/urandom и позволяет избежать ошибок из-за возможного исчерпания
файловых дескрипторов. (Предложено Victor Stinner в bpo-22181.)
Новые функции get_blocking() и set_blocking() позволяют
получить и установить блокирующий режим файлового дескриптора (O_NONBLOCK.)
(Предложено Victor Stinner в bpo-22054.)
Функции truncate() и ftruncate() теперь поддерживаются
в Windows. (Предложено Steve Dower в bpo-23668.)
Появилась новая функция os.path.commonpath(), возвращающая самый длинный
общий подпуть каждого переданного имени пути. В отличие от функции
os.path.commonprefix(), она всегда возвращает корректный путь:
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
(Предложено Rafik Draoui и Serhiy Storchaka в bpo-10395.)
pathlib¶
Новый метод Path.samefile() можно использовать
для проверки, указывает ли путь на тот же файл, что и другой путь, который может
быть как объектом Path, так и строкой:
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
(Предложено Vajrasky Kok и Antoine Pitrou в bpo-19775.)
Метод Path.mkdir() теперь принимает новый необязательный аргумент
exist_ok для соответствия функциональности mkdir -p и os.makedirs().
(Предложено Berker Peksag в bpo-21539.)
Появился новый метод Path.expanduser() для
разворачивания префиксов ~ и ~user. (Предложено Serhiy Storchaka и
Claudiu Popa в bpo-19776.)
Новый классовый метод Path.home() можно использовать для получения
экземпляра Path, представляющего домашний каталог пользователя.
(Предложено Victor Salgado и Mayank Tripathi в bpo-19777.)
Новые методы Path.write_text(),
Path.read_text(),
Path.write_bytes(),
Path.read_bytes() для упрощения
операций чтения/записи файлов.
Следующий фрагмент кода создаст или перезапишет существующий файл
~/spam42:
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
(Предложено Christopher Welborn в bpo-20218.)
pickle¶
Вложенные объекты, такие как несвязанные методы или вложенные классы, теперь могут быть упакованы (pickled) с использованием протоколов pickle старше версии 4. Версия 4 протокола уже поддерживает эти случаи. (Предложено Serhiy Storchaka в bpo-23611.)
poplib¶
Новая команда POP3.utf8() включает поддержку RFC 6856
(Интернационализированная электронная почта), если POP-сервер это поддерживает.
(Предложено Milan OberKirch в bpo-21804.)
re¶
В ретроспективных проверках (lookbehind assertions) теперь разрешены ссылки и условные ссылки на группы фиксированной длины:
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
(Автор: Serhiy Storchaka в bpo-9179.)
Количество групп захвата в регулярных выражениях больше не ограничено 100. (Автор: Serhiy Storchaka в bpo-22437.)
Функции sub() и subn() теперь заменяют несовпавшие группы пустыми строками вместо возбуждения исключения. (Автор: Serhiy Storchaka в bpo-1519638.)
Исключения re.error получили новые атрибуты: msg, pattern, pos, lineno и colno, которые предоставляют более подробную контекстную информацию об ошибке:
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(Автор: Serhiy Storchaka в bpo-22578.)
readline¶
Новая функция append_history_file() может использоваться для добавления указанного количества последних элементов истории в заданный файл. (Автор: Bruno Cauet в bpo-22940.)
selectors¶
Новый DevpollSelector обеспечивает эффективный опрос /dev/poll в Solaris. (Автор: Giampaolo Rodola’ в bpo-18931.)
shutil¶
Функция move() теперь принимает аргумент copy_function, позволяющий, например, использовать функцию copy() вместо стандартной copy2(), если необходимо игнорировать метаданные файлов при перемещении. (Автор: Claudiu Popa в bpo-19840.)
Функция make_archive() теперь поддерживает формат xztar. (Автор: Serhiy Storchaka в bpo-5411.)
signal¶
В Windows функция set_wakeup_fd() теперь также поддерживает дескрипторы сокетов. (Автор: Victor Stinner в bpo-22018.)
Различные константы SIG* в модуле signal были преобразованы в Enums. Это позволяет выводить осмысленные имена при отладке вместо целочисленных «магических чисел». (Автор: Giampaolo Rodola’ в bpo-21076.)
smtpd¶
Оба класса SMTPServer и SMTPChannel теперь принимают именованный аргумент decode_data, определяющий, будет ли часть DATA SMTP-транзакции декодироваться с использованием кодека "utf-8" или передаваться методу SMTPServer.process_message() в виде байтовой строки. По умолчанию True для обратной совместимости, но в Python 3.6 будет изменено на False. Если decode_data установлен в False, метод process_message должен быть готов принимать именованные аргументы. (Автор: Maciej Szulik в bpo-19662.)
Класс SMTPServer теперь анонсирует расширение 8BITMIME (RFC 6152), если decode_data установлен в True. Если клиент указывает BODY=8BITMIME в команде MAIL, оно передаётся в SMTPServer.process_message() через именованный аргумент mail_options. (Авторы: Milan Oberkirch и R. David Murray в bpo-21795.)
Класс SMTPServer теперь также поддерживает расширение SMTPUTF8 (RFC 6531: Internationalized Email). Если клиент указал SMTPUTF8 BODY=8BITMIME в команде MAIL, они передаются в SMTPServer.process_message() через именованный аргумент mail_options. Метод process_message отвечает за корректную обработку данных SMTPUTF8. (Автор: Milan Oberkirch в bpo-21725.)
Теперь можно указывать IPv6-адреса в конструкторе SMTPServer напрямую или через разрешение имён, и он будет успешно подключаться. (Автор: Milan Oberkirch в bpo-14758.)
smtplib¶
Новый метод SMTP.auth() предоставляет удобный способ реализации пользовательских механизмов аутентификации. (Автор: Milan Oberkirch в bpo-15014.)
Метод SMTP.set_debuglevel() теперь принимает дополнительный уровень отладки (2), который включает временные метки в отладочных сообщениях. (Авторы: Gavin Chappell и Maciej Szulik в bpo-16914.)
Оба метода SMTP.sendmail() и SMTP.send_message() теперь поддерживают RFC 6531 (SMTPUTF8). (Авторы: Milan Oberkirch и R. David Murray в bpo-22027.)
sndhdr¶
Функции what() и whathdr() теперь возвращают namedtuple(). (Автор: Claudiu Popa в bpo-18615.)
socket¶
Функции с тайм-аутами теперь используют монотонные часы вместо системных. (Автор: Victor Stinner в bpo-22043.)
Новый метод socket.sendfile() позволяет отправлять файл через сокет, используя высокопроизводительную функцию os.sendfile() в UNIX, что делает загрузку в 2–3 раза быстрее, чем при использовании обычного socket.send(). (Автор: Giampaolo Rodola’ в bpo-17552.)
Метод socket.sendall() больше не сбрасывает тайм-аут сокета при каждом получении или отправке байтов. Тайм-аут сокета теперь представляет собой максимальную общую продолжительность отправки всех данных. (Автор: Victor Stinner в bpo-23853.)
Аргумент backlog метода socket.listen() теперь необязателен. По умолчанию он устанавливается в SOMAXCONN или 128, в зависимости от того, что меньше. (Автор: Charles-François Natali в bpo-21455.)
ssl¶
Поддержка Memory BIO¶Memory BIO Support
(Предложено Geert Jansen в bpo-21965.)
Добавлен новый класс SSLObject для обеспечения поддержки протокола SSL в тех случаях, когда возможности сетевого ввода-вывода SSLSocket не нужны или неоптимальны. SSLObject представляет собой экземпляр протокола SSL, но не реализует методы сетевого ввода-вывода, а вместо этого предоставляет интерфейс с буфером в памяти. Новый класс MemoryBIO можно использовать для передачи данных между Python и экземпляром протокола SSL.
Поддержка SSL через память BIO предназначена в первую очередь для фреймворков, реализующих асинхронный ввод-вывод, для которых модель готовности SSLSocket («select/poll») неэффективна.
Новый метод SSLContext.wrap_bio() можно использовать для создания нового экземпляра SSLObject.
Поддержка согласования протокола прикладного уровня¶Application-Layer Protocol Negotiation Support
(Предложено Benjamin Peterson в bpo-20188.)
Если OpenSSL поддерживается, модуль ssl теперь реализует расширение TLS Согласование протокола прикладного уровня, как описано в RFC 7301.
Новый SSLContext.set_alpn_protocols() можно использовать для указания того, какие протоколы сокет должен объявлять во время рукопожатия TLS.
Новый SSLSocket.selected_alpn_protocol() возвращает протокол, выбранный во время рукопожатия TLS. Флаг HAS_ALPN указывает, присутствует ли поддержка ALPN.
Прочие изменения¶Other Changes
Добавлен новый метод SSLSocket.version() для запроса фактической используемой версии протокола. (Предложено Antoine Pitrou в bpo-20421.)
Класс SSLSocket теперь реализует метод SSLSocket.sendfile(). (Предложено Giampaolo Rodola’ в bpo-17552.)
Метод SSLSocket.send() теперь вызывает исключение ssl.SSLWantReadError или ssl.SSLWantWriteError для неблокирующего сокета, если операция заблокировалась. Ранее он возвращал 0. (Предложено Nikolaus Rath в bpo-20951.)
The cert_time_to_seconds() function now interprets the input time
as UTC and not as local time, per RFC 5280. Additionally, the return
value is always an int. (Contributed by Akira Li in bpo-19940.)
Новые методы SSLObject.shared_ciphers() и SSLSocket.shared_ciphers() возвращают список шифров, отправленных клиентом во время рукопожатия. (Предложено Benjamin Peterson в bpo-23186.)
Методы SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown() и SSLSocket.write() класса SSLSocket больше не сбрасывают тайм-аут сокета при каждом получении или отправке байтов. Теперь тайм-аут сокета – это максимальная общая продолжительность работы метода. (Предложено Victor Stinner в bpo-23853.)
Функция match_hostname() теперь поддерживает сопоставление IP-адресов. (Предложено Antoine Pitrou в bpo-23239.)
sqlite3¶
Класс Row теперь полностью поддерживает протокол последовательности, в частности итерацию reversed() и индексацию по срезам. (Предложено Claudiu Popa в bpo-10203; Lucas Sinclair, Jessica McKellar и Serhiy Storchaka в bpo-13583.)
подпроцесс¶subprocess
Добавлена новая функция run(). Она запускает указанную команду и возвращает объект CompletedProcess, описывающий завершённый процесс. Новый API более согласован и является рекомендуемым способом вызова подпроцессов в коде Python, который не требует совместимости с более ранними версиями Python. (Предложено Thomas Kluyver в bpo-23342.)
Примеры:
>>> subprocess.run(["ls", "-l"]) # не захватывает вывод
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
sys¶
A new set_coroutine_wrapper() function allows setting a global
hook that will be called whenever a coroutine object
is created by an async def function. A corresponding
get_coroutine_wrapper() can be used to obtain a currently set
wrapper. Both functions are provisional,
and are intended for debugging purposes only. (Contributed by Yury Selivanov
in bpo-24017.)
A new is_finalizing() function can be used to check if the Python
interpreter is shutting down.
(Contributed by Antoine Pitrou in bpo-22696.)
sysconfig¶
Имя каталога сценариев пользователя в Windows теперь включает первые два компонента версии Python. (Предложено Paul Moore в bpo-23437.)
tarfile¶
Аргумент mode функции open() теперь принимает "x" для запроса эксклюзивного создания. (Предложено Berker Peksag в bpo-21717.)
Методы TarFile.extractall() и TarFile.extract() теперь принимают именованный аргумент numeric_owner. Если он установлен в True, извлечённые файлы и каталоги будут принадлежать числовому uid и gid из tar-файла. Если установлен в False (значение по умолчанию, и поведение в версиях до 3.5), они будут принадлежать указанным по имени пользователю и группе из tar-файла. (Предложено Michael Vogt и Eric Smith в bpo-23193.)
TarFile.list() теперь принимает необязательный именованный аргумент members, который можно установить на подмножество списка, возвращаемого TarFile.getmembers(). (Предложено Serhiy Storchaka в bpo-21549.)
threading¶
Оба метода Lock.acquire() и
RLock.acquire() теперь используют монотонные часы для управления тайм-аутом.
(Предложено Виктором Стиннером в bpo-22043.)
time¶
Функция monotonic() теперь всегда доступна.
(Предложено Виктором Стиннером в bpo-22043.)
timeit¶
Новый параметр командной строки -u или --unit=U позволяет указать единицу
времени для вывода таймера. Поддерживаемые варианты: usec, msec
или sec. (Предложено Джулианом Гинди в bpo-18983.)
Функция timeit() получила новый параметр globals для
указания пространства имён, в котором будет выполняться код.
(Предложено Беном Робертсом в bpo-2527.)
tkinter¶
Модуль tkinter._fix, использовавшийся для настройки окружения Tcl/Tk
в Windows, был заменён на приватную функцию в модуле _tkinter,
которая не вносит постоянных изменений в переменные окружения.
(Предложено Закари Уэром в bpo-20035.)
traceback¶
Новые функции walk_stack() и walk_tb()
для удобного обхода объектов фреймов и
объектов traceback.
(Предложено Робертом Коллинзом в bpo-17911.)
Новые облегчённые классы: TracebackException,
StackSummary и FrameSummary.
(Предложено Робертом Коллинзом в bpo-17911.)
Обе функции print_tb() и print_stack() теперь поддерживают отрицательные значения для аргумента limit.
(Предложено Дмитрием Казаковым в bpo-22619.)
types¶
Новая функция coroutine() для преобразования
генераторов и
объектов generator-like в
ожидаемые объекты.
(Предложено Юрием Селивановым в bpo-24017.)
Новый тип с именем CoroutineType, который используется для
объектов корутин, создаваемых функциями async def.
(Предложено Юрием Селивановым в bpo-24400.)
unicodedata¶
Модуль unicodedata теперь использует данные из Unicode 8.0.0.
unittest¶
Метод TestLoader.loadTestsFromModule()
теперь принимает ключевой аргумент pattern, который передаётся в
load_tests в качестве третьего аргумента. Найденные пакеты теперь проверяются на наличие
load_tests независимо от того, совпадает ли их путь с pattern, потому что
имя пакета не может совпадать с шаблоном по умолчанию.
(Предложено Робертом Коллинзом и Барри А. Варшавой в bpo-16662.)
Ошибки обнаружения тестов теперь доступны в атрибуте
TestLoader.errors экземпляра
TestLoader.
(Предложено Робертом Коллинзом в bpo-19746.)
Новый параметр командной строки --locals для отображения локальных переменных в
трассировках. (Предложено Робертом Коллинзом в bpo-22936.)
unittest.mock¶
Класс Mock имеет следующие улучшения:
Конструктор класса получил новый параметр unsafe, который заставляет объекты mock вызывать
AttributeErrorдля имён атрибутов, начинающихся с"assert". (Предложено Кушалом Дасом в bpo-21238.)Новый метод
Mock.assert_not_called()для проверки, был ли вызван объект mock. (Предложено Кушалом Дасом в bpo-21262.)
Класс MagicMock теперь поддерживает
операторы __truediv__(), __divmod__()
и __matmul__().
(Предложено Йоханнесом Байтером в bpo-20968, и Хоканом Лёвдалем
в bpo-23581 и bpo-23568.)
Больше нет необходимости явно передавать create=True функции
patch() при подмене встроенных имён.
(Предложено Кушалом Дасом в bpo-17660.)
urllib¶
Новый класс
request.HTTPPasswordMgrWithPriorAuth
позволяет управлять учётными данными HTTP Basic Authentication, чтобы
исключить ненужную обработку ответа 401 или безусловно отправлять
учётные данные в первом запросе для взаимодействия с серверами, которые
возвращают ответ 404 вместо 401, если заголовок Authorization
не отправлен. (Предложено Матеем Цеплом в bpo-19494 и Акшитом Кхураной в
bpo-7159.)
Новый аргумент quote_via для функции
parse.urlencode()
предоставляет способ управлять кодировкой частей запроса при необходимости.
(Предложено Samwyse и Арноном Яари в bpo-13866.)
Функция request.urlopen() принимает объект
ssl.SSLContext в качестве аргумента context, который будет использоваться для
HTTPS-соединения. (Предложено Алексом Гейнором в bpo-22366.)
The parse.urljoin() was updated to use the
RFC 3986 semantics for the resolution of relative URLs, rather than
RFC 1808 and RFC 2396.
(Contributed by Demian Brecht and Senthil Kumaran in bpo-22118.)
wsgiref¶
Аргумент headers конструктора класса headers.Headers теперь необязателен.
(Авторы: Pablo Torres Navarrete и SilentGhost в bpo-5800.)
xmlrpc¶
Класс client.ServerProxy теперь поддерживает протокол контекстного менеджера.
(Автор: Claudiu Popa в bpo-20627.)
Конструктор client.ServerProxy теперь принимает необязательный экземпляр ssl.SSLContext.
(Автор: Alex Gaynor в bpo-22960.)
xml.sax¶
SAX-парсеры теперь поддерживают символьный поток объекта xmlreader.InputSource.
(Автор: Serhiy Storchaka в bpo-2175.)
parseString() теперь принимает экземпляр str.
(Автор: Serhiy Storchaka в bpo-10590.)
zipfile¶
Вывод ZIP теперь можно записывать в непозиционируемые потоки. (Автор: Serhiy Storchaka в bpo-23252.)
Аргумент mode метода ZipFile.open() теперь принимает "x" для запроса эксклюзивного создания.
(Автор: Serhiy Storchaka в bpo-21717.)
Прочие изменения на уровне модулей¶Other module-level changes
Многие функции в модулях mmap, ossaudiodev, socket, ssl и codecs теперь принимают записываемые байтоподобные объекты.
(Автор: Serhiy Storchaka в bpo-23001.)
Оптимизации¶Optimizations
Функция os.walk() ускорена в 3–5 раз на POSIX-системах и в 7–20 раз на Windows. Это было сделано с помощью новой функции os.scandir(), которая предоставляет информацию о файлах из системных вызовов readdir или FindFirstFile/FindNextFile. (Автор: Ben Hoyt при содействии Victor Stinner в bpo-23605.)
Создание bytes(int) (заполненного нулевыми байтами) стало быстрее и использует меньше памяти для больших объектов. Для выделения памяти под эти объекты применяется calloc() вместо malloc().
(Автор: Victor Stinner в bpo-21233.)
Некоторые операции над ipaddress, IPv4Network и IPv6Network значительно ускорены, например subnets(), supernet(), summarize_address_range(), collapse_addresses(). Ускорение может составлять от 3 до 15 раз.
(Авторы: Antoine Pitrou, Michel Albert и Markus в bpo-21486, bpo-21487, bpo-20826, bpo-23266.)
Сериализация объектов ipaddress оптимизирована для получения значительно меньшего вывода. (Автор: Serhiy Storchaka в bpo-23133.)
Многие операции над io.BytesIO теперь выполняются на 50–100% быстрее.
(Авторы: Serhiy Storchaka в bpo-15381 и David Wilson в bpo-22003.)
Функция marshal.dumps() теперь работает быстрее: на 65–85% для версий 3 и 4, на 20–25% для версий 0–2 на типичных данных и до 5 раз в лучших случаях.
(Автор: Serhiy Storchaka в bpo-20416 и bpo-23344.)
Кодировщик UTF-32 теперь работает в 3–7 раз быстрее. (Автор: Serhiy Storchaka в bpo-15027.)
Регулярные выражения теперь разбираются до 10% быстрее. (Автор: Serhiy Storchaka в bpo-19380.)
Функция json.dumps() оптимизирована так, что работает с ensure_ascii=False так же быстро, как с ensure_ascii=True.
(Автор: Naoki Inada в bpo-23206.)
Функции PyObject_IsInstance() и PyObject_IsSubclass() ускорены в типичном случае, когда второй аргумент имеет type в качестве метакласса.
(Автор: Georg Brandl в bpo-22540.)
Кеширование методов было немного улучшено, что дало до 5% прироста производительности в некоторых тестах. (Автор: Antoine Pitrou в bpo-22847.)
Объекты из модуля random теперь используют на 50% меньше памяти в 64-битных сборках. (Автор: Serhiy Storchaka в bpo-23488.)
Вызовы геттера property() стали до 25% быстрее.
(Автор: Joe Jevnik в bpo-23910.)
Создание экземпляра fractions.Fraction теперь до 30% быстрее.
(Автор: Stefan Behnel в bpo-22464.)
Строковые методы find(), rfind(), split(), partition() и оператор in теперь значительно быстрее при поиске подстрок из одного символа.
(Автор: Serhiy Storchaka в bpo-23573.)
Изменения в сборке и C API¶Build and C API Changes
Добавлены новые функции calloc:
(Автор: Victor Stinner в bpo-21233.)
Новые вспомогательные функции кодирования/декодирования:
Py_DecodeLocale()(заменён_Py_char2wchar()),Py_EncodeLocale()(заменён_Py_wchar2char()).
(Предложено Victor Stinner в bpo-18395.)
Новая функция PyCodec_NameReplaceErrors() для замены ошибки кодирования unicode
на управляющие последовательности \N{...}.
(Предложено Serhiy Storchaka в bpo-19676.)
Новая функция PyErr_FormatV(), аналогичная PyErr_Format(),
но принимающая аргумент va_list.
(Предложено Antoine Pitrou в bpo-18711.)
Новое исключение PyExc_RecursionError.
(Предложено Georg Brandl в bpo-19235.)
Новые функции PyModule_FromDefAndSpec(), PyModule_FromDefAndSpec2()
и PyModule_ExecDef(), введённые PEP 489 –
многофазная инициализация модулей расширения.
(Предложено Petr Viktorin в bpo-24268.)
Новые функции PyNumber_MatrixMultiply() и
PyNumber_InPlaceMatrixMultiply() для умножения матриц.
(Предложено Benjamin Peterson в bpo-21176. См. также PEP 465
для подробностей.)
Слот PyTypeObject.tp_finalize теперь является частью стабильного ABI.
Сборки для Windows теперь требуют Microsoft Visual C++ 14.0, который доступен в составе Visual Studio 2015.
Модули расширения теперь включают метку информации о платформе в своё имя файла на некоторых платформах (метка необязательна, и CPython будет импортировать расширения без неё, хотя если метка присутствует и не совпадает, расширение не будет загружено):
На Linux имена файлов модулей расширения заканчиваются на
.cpython-<major><minor>m-<architecture>-<os>.pyd:<major>– это старший номер версии Python; для Python 3.5 это3.<minor>– это младший номер версии Python; для Python 3.5 это5.<architecture>– это аппаратная архитектура, для которой был собран модуль расширения. Чаще всего этоi386для 32-битных Intel платформ илиx86_64для 64-битных Intel (и AMD) платформ.<os>всегда равенlinux-gnu, за исключением расширений, собранных для работы с 32-битным ABI на 64-битных платформах; в этом случае он равенlinux-gnu32(и<architecture>будетx86_64).
На Windows имена файлов модулей расширения заканчиваются на
<debug>.cp<major><minor>-<platform>.pyd:<major>– это старший номер версии Python; для Python 3.5 это3.<minor>– это младший номер версии Python; для Python 3.5 это5.<platform>– это платформа, для которой был собран модуль расширения:win32для Win32,win_amd64для Win64,win_ia64для Windows Itanium 64 иwin_armдля Windows на ARM.Если собрано в режиме отладки,
<debug>будет_d, иначе он будет пустым.
На платформах OS X имена файлов модулей расширения теперь заканчиваются на
-darwin.so.На всех остальных платформах имена файлов модулей расширения такие же, как в Python 3.4.
Устарело¶Deprecated
Новые ключевые слова¶New Keywords
async и await не рекомендуется использовать в качестве имён переменных, классов,
функций или модулей. Введённые PEP 492 в Python 3.5, они станут
полноценными ключевыми словами в Python 3.7.
Устаревшее поведение Python¶Deprecated Python Behavior
Возбуждение исключения StopIteration внутри генератора теперь будет вызывать скрытое
PendingDeprecationWarning, которое станет явным предупреждением об устаревании
в Python 3.6 и вызовет RuntimeError в Python 3.7.
См. PEP 479: Change StopIteration handling inside generators
для подробностей.
Неподдерживаемые операционные системы¶Unsupported Operating Systems
Windows XP больше не поддерживается Microsoft, поэтому в соответствии с PEP 11 CPython 3.5 официально больше не поддерживается на этой ОС.
Устаревшие модули, функции и методы Python¶Deprecated Python modules, functions and methods
Модуль formatter теперь полностью устарел и по-прежнему
планируется к удалению в Python 3.6.
Функция asyncio.async() устарела; вместо неё следует использовать
ensure_future().
Модуль smtpd в прошлом всегда декодировал часть DATA сообщений электронной почты с помощью кодеков utf-8. Теперь это можно контролировать с помощью нового ключевого слова decode_data в функции SMTPServer. Значение по умолчанию – True, но это значение по умолчанию устарело. Укажите ключевое слово decode_data с подходящим значением, чтобы избежать предупреждения об устаревании.
Прямое присваивание значений атрибутам key, value и coded_value объектов http.cookies.Morsel устарело. Вместо этого используйте метод set(). Кроме того, недокументированный параметр LegalChars функции set() устарел и теперь игнорируется.
Передача строки формата в качестве ключевого аргумента format_string методу format() класса string.Formatter устарела. (Предложено Сергеем Сторчакой в bpo-23671.)
Функции platform.dist() и platform.linux_distribution() теперь устарели. Дистрибутивы Linux используют слишком много разных способов описания себя, поэтому функциональность оставлена на усмотрение пакета. (Предложено Vajrasky Kok и Berker Peksag в bpo-1322.)
Ранее недокументированные методы from_function и from_builtin класса inspect.Signature устарели. Вместо них используйте новый метод Signature.from_callable(). (Предложено Юрием Селивановым в bpo-24248.)
Функция inspect.getargspec() устарела и запланирована к удалению в Python 3.6. (Подробнее см. bpo-20438.)
Функции inspect getfullargspec(), getcallargs() и formatargspec() устарели; вместо них следует использовать inspect.signature() API. (Предложено Юрием Селивановым в bpo-20438.)
Функции getargvalues() и formatargvalues() были случайно помечены как устаревшие в выпуске Python 3.5.0.
Использование флага re.LOCALE с шаблонами str или re.ASCII теперь устарело. (Предложено Сергеем Сторчакой в bpo-22407.)
Использование нераспознаваемых специальных последовательностей, состоящих из '\' и буквы ASCII, в шаблонах регулярных выражений и шаблонах замены теперь вызывает предупреждение об устаревании и будет запрещено в Python 3.6. (Предложено Сергеем Сторчакой в bpo-23622.)
Недокументированный и неофициальный аргумент по умолчанию use_load_tests метода unittest.TestLoader.loadTestsFromModule() теперь устарел и игнорируется. (Предложено Robert Collins и Barry A. Warsaw в bpo-16662.)
Удалено¶Removed
Удаление API и функций¶API and Feature Removals
Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:
Атрибут
__version__был удалён из пакета email. Код email уже давно не поставлялся отдельно от стандартной библиотеки, а строка__version__не обновлялась в последних нескольких выпусках.Внутренний класс
Netrcв модулеftplibбыл объявлен устаревшим в версии 3.4 и теперь удалён. (Предложено Matt Chaput в bpo-6623.)Концепция файлов
.pyoбыла удалена.Класс JoinableQueue в экспериментальном модуле
asyncioбыл объявлен устаревшим в версии 3.4.4 и теперь удалён. (Предложено A. Jesse Jiryu Davis в bpo-23464.)
Переход на Python 3.5¶Porting to Python 3.5
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в поведении Python¶Changes in Python behavior
Из-за ошибки предыдущие версии Python ошибочно принимали следующий синтаксис:
f(1 for x in [1], *args) f(1 for x in [1], **kwargs)
Python 3.5 теперь корректно вызывает исключение
SyntaxError, так как выражения-генераторы должны быть заключены в круглые скобки, если они не являются единственным аргументом функции.
Изменения в Python API¶Changes in the Python API
PEP 475: Системные вызовы теперь повторяются при прерывании сигналом вместо возбуждения
InterruptedError, если обработчик сигнала Python не возбуждает исключение.До Python 3.5 объект
datetime.timeсчитался ложным, если он представлял полночь по UTC. Такое поведение считалось неочевидным и подверженным ошибкам и было удалено в Python 3.5. Подробнее см. bpo-13936.Метод
ssl.SSLSocket.send()теперь возбуждает либоssl.SSLWantReadError, либоssl.SSLWantWriteErrorна неблокирующем сокете, если операция заблокируется. Ранее он возвращал0. (Предложено Nikolaus Rath в bpo-20951.)Атрибут
__name__генераторов теперь берётся из имени функции, а не из имени кода. Используйтеgen.gi_code.co_nameдля получения имени кода. У генераторов также появился новый атрибут__qualname__– уточнённое имя, которое теперь используется для представления генератора (repr(gen)). (Предложено Victor Stinner в bpo-21205.)Устаревший режим «strict» и аргумент функций
HTMLParser,HTMLParser.error()и исключенияHTMLParserErrorбыли удалены. (Предложено Ezio Melotti в bpo-15114.) Аргумент convert_charrefs функцииHTMLParserтеперь по умолчанию равенTrue. (Предложено Berker Peksag в bpo-21047.)Хотя это формально не является частью API, для целей переноса (например, исправления тестов) стоит отметить, что сообщения об ошибках, которые ранее имели вид «'sometype' не поддерживает буферный протокол», теперь имеют вид «a байтоподобный объект is required, not 'sometype'». (Предложено Ezio Melotti в bpo-16518.)
Если текущая директория установлена на директорию, которой больше не существует, то
FileNotFoundErrorбольше не будет возбуждаться, аfind_spec()вернётNoneбез кэшированияNoneвsys.path_importer_cache, что отличается от типичного случая (bpo-22834).Коды состояния HTTP и сообщения из
http.clientиhttp.serverбыли реорганизованы в общее перечислениеHTTPStatus. Значения вhttp.clientиhttp.serverостаются доступными для обратной совместимости. (Автор: Demian Brecht, bpo-21793.)Если загрузчик импорта определяет
exec_module(), то ожидается, что он также определяетcreate_module()(сейчас это вызываетDeprecationWarning, а в Python 3.6 станет ошибкой). Если загрузчик наследует отimportlib.abc.Loader, то ничего делать не нужно; в противном случае просто определитеcreate_module()так, чтобы он возвращалNone. (Автор: Brett Cannon, bpo-23014.)Функция
re.split()всегда игнорировала пустые совпадения с шаблоном, поэтому шаблон"x*"работал так же, как"x+", а шаблон"\b"никогда не работал. Теперьre.split()выдаёт предупреждение, если шаблон может совпадать с пустой строкой. Для совместимости используйте шаблоны, которые никогда не совпадают с пустой строкой (например,"x+"вместо"x*"). Шаблоны, которые могут совпадать только с пустой строкой (такие как"\b"), теперь вызывают ошибку. (Автор: Serhiy Storchaka, bpo-22818.)Интерфейс, подобный словарю, для
http.cookies.Morselстал самосогласованным: сравнение morsel теперь учитываетkeyиvalue,copy()теперь возвращает экземплярMorsel, а неdict, аupdate()теперь будет вызывать исключение, если какой-либо из ключей в обновляемом словаре недействителен. Кроме того, недокументированный параметр LegalChars функцииset()устарел и теперь игнорируется. (Автор: Demian Brecht, bpo-2211.)PEP 488 удалил файлы
.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. (Автор: Akira Li, bpo-19940.)Инструмент
pygettext.pyтеперь использует стандартный формат +NNNN для часовых поясов в заголовке POT-Creation-Date.Модуль
smtplibтеперь используетsys.stderrвместо предыдущей модульной переменнойstderrдля отладочного вывода. Если ваша (тестовая) программа зависит от подмены модульной переменной для захвата отладочного вывода, вам нужно обновить её, чтобы захватывать sys.stderr вместо этого.Методы
str.startswith()иstr.endswith()больше не возвращаютTrueпри поиске пустой строки, если индексы полностью выходят за диапазон. (Автор: Serhiy Storchaka, bpo-24284.)Функция
inspect.getdoc()теперь возвращает строки документации, унаследованные от базовых классов. Строки документации больше не нужно дублировать, если унаследованная документация подходит. Чтобы подавить унаследованную строку, необходимо указать пустую строку (или документация может быть заполнена). Это изменение влияет на вывод модуляpydocи функцииhelp(). (Автор: Serhiy Storchaka, bpo-15582.)Вложенные вызовы
functools.partial()теперь уплощаются. Если предыдущее поведение использовалось, теперь можно добавить атрибут к объектуfunctools.partial()или создать подклассfunctools.partial(). (Автор: Alexander Belopolsky, bpo-7830.)
Изменения в C API¶Changes in the C API
Недокументированный член
format(непубличной) структурыPyMemoryViewObjectбыл удалён. Все расширения, полагающиеся на соответствующие части вmemoryobject.h, должны быть пересобраны.Структура
PyMemAllocatorбыла переименована вPyMemAllocatorEx, и добавлено новое полеcalloc.Удалён недокументированный макрос
PyObject_REPR(), который приводил к утечке ссылок. Используйте символ формата%Rв функциях, подобныхPyUnicode_FromFormat(), для форматированияrepr()объекта. (Автор: Serhiy Storchaka, bpo-22453.)Поскольку отсутствие атрибута
__module__нарушает сериализацию (pickling) и интроспекцию, теперь для встроенных типов без атрибута__module__выдаётся предупреждение об устаревании. В будущем это станетAttributeError. (Автор: Serhiy Storchaka, bpo-20204.)В рамках реализации PEP 492 слот
tp_reservedструктурыPyTypeObjectбыл заменён на слотtp_as_async. См. Объекты корутин для новых типов, структур и функций.
Примечательные изменения в Python 3.5.4¶Notable changes in Python 3.5.4
Новая make regen-all цель сборки¶New make regen-all build target
Чтобы упростить кросс-компиляцию и гарантировать, что CPython можно надежно\nсобрать без необходимости уже иметь установленную версию Python,\nсистема сборки на основе autotools больше не пытается неявно\nперекомпилировать сгенерированные файлы, ориентируясь на время их изменения.
Вместо этого была добавлена новая команда make regen-all для принудительной\nперегенерации этих файлов при необходимости (например, после того, как начальная версия Python уже\nбыла собрана на основе предварительно сгенерированных версий).
Также определены более выборочные цели регенерации – подробнее см.\nMakefile.pre.in.
(Предложено Victor Stinner в bpo-23404.)
Добавлено в версии 3.5.4.
Удаление make touch цели сборки¶Removal of make touch build target
Цель сборки make touch, ранее использовавшаяся для запроса неявной перегенерации\nсгенерированных файлов путем обновления времени их изменения, была удалена.
Она заменена новой целью make regen-all.
(Предложено Victor Stinner в bpo-23404.)
Изменено в версии 3.5.4.