Что нового в 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).
Значительные улучшения в стандартной библиотеке:
collections.OrderedDict
теперь равно implemented in C, что ускоряет процесс от 4 до 100 раз.Модуль
ssl
получил support for Memory BIO, который отделяет обработку протокола SSL от сетевого ввода-вывода.Новая функция
os.scandir()
обеспечивает better and significantly faster way обход каталога.functools.lru_cache()
в основном было reimplemented in C, что значительно улучшило производительность.Новая функция
subprocess.run()
предоставляет значение streamlined way to run subprocesses.Модуль
traceback
был значительно переработан enhanced для повышения производительности и удобства разработчиков.
Улучшения в области безопасности:
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
, который совместим со всеми типами (т.е. может назначаться всем типам и из них).
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 у разработчика было два варианта:
Игнорируйте
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()
теперь игнорируйте :ошибки py:const:~errno.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
ПОП-музыка и реализация написаны Шарлем-Франсуа Натали и Виктором Скиннером при содействии Антуана Питру (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 .
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.)
Новые вспомогательные функции кодирования/декодирования:
Py_DecodeLocale()
(заменено на_Py_char2wchar()
),Py_EncodeLocale()
(заменено на_Py_wchar2char()
).
(Автор: Виктор Стиннер в 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.