Что нового в Python 3.3

В этой статье рассказывается о новых возможностях в Python 3.3 по сравнению с 3.2. Python 3.3 был выпущен 29 сентября 2012 года. Полную информацию см. в changelog.

См.также

PEP 398 - График выхода Python 3.3

Резюме - Основные моменты выпуска

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

  • Новое выражение yield from для generator delegation.

  • Синтаксис u'unicode' снова принят для объектов str.

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

  • faulthandler (помогает отлаживать низкоуровневые сбои)

  • ipaddress (высокоуровневые объекты, представляющие IP-адреса и маски)

  • lzma (сжатие данных с использованием алгоритма XZ / LZMA)

  • unittest.mock (замените части вашей тестируемой системы на объекты-макеты)

  • venv (Python virtual environments, как в популярном пакете virtualenv)

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

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

Значительно улучшенные библиотечные модули:

  • Ускоритель языка Си для модуля decimal.

  • Улучшена обработка юникода в модуле email (provisional).

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

  • Рандомизация хэша включена по умолчанию.

Полный список изменений, касающихся пользователей, читайте далее.

PEP 405: Виртуальные среды

Виртуальные среды позволяют создавать отдельные установки Python при совместном использовании общесистемной базовой установки для упрощения обслуживания. Виртуальные среды имеют свой собственный набор частных пакетов сайта (т.е. локально установленных библиотек) и по желанию отделяются от общесистемных пакетов сайта. Их концепция и реализация вдохновлены популярным сторонним пакетом virtualenv, но выигрывают от более тесной интеграции с ядром интерпретатора.

Этот PEP добавляет модуль venv для программного доступа и скрипт pyvenv для доступа к командной строке и администрирования. Интерпретатор Python проверяет наличие pyvenv.cfg, файла, существование которого сигнализирует об основании дерева каталогов виртуальной среды.

См.также

PEP 405 - Виртуальные среды Python

PEP написан Карлом Мейером; реализация Карлом Мейером и Винаем Саджипом

PEP 420: Неявные пакеты пространства имен

Встроенная поддержка каталогов пакетов, которые не требуют маркерных файлов __init__.py и могут автоматически охватывать несколько сегментов пути (вдохновленные различными сторонними подходами к пакетам пространств имен, как описано в PEP 420)

См.также

PEP 420 - Неявные пакеты пространства имен

PEP написан Эриком В. Смитом; реализация Эриком В. Смитом и Барри Варшавом

PEP 3118: Новая реализация просмотра памяти и документация по буферному протоколу

Реализация PEP 3118 была значительно улучшена.

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

Объект memoryview теперь имеет совместимую с PEP-3118 функцию getbufferproc(), которая проверяет тип запроса потребителя. Добавлено много новых функций, большинство из которых работает в полном объеме для несмежных массивов и массивов с подмножествами.

Обновлена документация, в которой четко прописаны обязанности как экспортеров, так и потребителей. Флаги запросов буфера сгруппированы в основные и составные флаги. Объясняется расположение в памяти несвязных и многомерных массивов в стиле NumPy.

Характеристики

  • Теперь поддерживаются все собственные односимвольные спецификаторы формата в синтаксисе модуля struct (опционально с префиксом „@“).

  • С некоторыми ограничениями метод cast() позволяет изменять формат и форму C-континуальных массивов.

  • Представления многомерных списков поддерживаются для любого типа массива.

  • Многомерные сравнения поддерживаются для любого типа массива.

  • Одномерные представления памяти хэшируемых (только для чтения) типов с форматами B, b или c теперь являются хэшируемыми. (Внесено Антуаном Питру в bpo-13411).

  • Поддерживается произвольная нарезка массивов любого типа 1-D. Например, теперь можно развернуть просмотр памяти за O(1), используя отрицательный шаг.

Изменения в API

  • Максимальное количество измерений официально ограничено 64.

  • Представлением пустой формы, страйдов и подмножеств теперь является пустой кортеж вместо None.

  • Доступ к элементу memoryview с форматом „B“ (беззнаковые байты) теперь возвращает целое число (в соответствии с синтаксисом модуля struct). Для возврата байтового объекта представление должно быть сначала приведено к „c“.

  • Сравнения с просмотром памяти теперь используют логическую структуру операндов и сравнивают все элементы массива по значению. Поддерживаются все форматные строки в синтаксисе модуля struct. Представления с нераспознанными форматными строками по-прежнему разрешены, но всегда будут сравниваться как неравные, независимо от содержимого представления.

  • О дальнейших изменениях смотрите Build and C API Changes и Porting C code.

(Внесено Стефаном Крахом из bpo-10181).

См.также

PEP 3118 - Пересмотр протокола буфера

PEP 393: Гибкое представление строк

Тип строки Unicode изменен для поддержки нескольких внутренних представлений в зависимости от символа с наибольшим порядковым номером Unicode (1, 2 или 4 байта) в представленной строке. Это позволяет экономить место в обычных случаях, но дает доступ к полному UCS-4 на всех системах. Для совместимости с существующими API несколько представлений могут существовать параллельно; со временем от такой совместимости следует постепенно отказаться.

С точки зрения Python, никаких отрицательных сторон у этого изменения быть не должно.

Со стороны C API, PEP 393 полностью обратно совместим. Унаследованный API должен оставаться доступным как минимум пять лет. Приложения, использующие унаследованный API, не смогут полностью воспользоваться преимуществами сокращения памяти или - что еще хуже - могут использовать немного больше памяти, поскольку Python, возможно, придется поддерживать две версии каждой строки (в унаследованном формате и в новом эффективном хранилище).

Функциональность

Изменения, внесенные PEP 393, следующие:

  • Python теперь всегда поддерживает полный диапазон кодовых точек Unicode, включая не-BMP (т.е. от U+0000 до U+10FFFF). Различия между узкими и широкими сборками больше не существует, и Python теперь ведет себя как широкая сборка, даже под Windows.

  • Со смертью узких билдов были устранены и проблемы, характерные для узких билдов, например:

    • len() теперь всегда возвращает 1 для не-BMP символов, поэтому len('\U0010FFFF') == 1;

    • Суррогатные пары не рекомбинируются в строковых литералах, поэтому '\uDBFF\uDFFF' != '\U0010FFFF';

    • индексирование или нарезка не-BMP символов возвращает ожидаемое значение, поэтому '\U0010FFFF'[0] теперь возвращает '\U0010FFFF', а не '\uDBFF';

    • все остальные функции стандартной библиотеки теперь корректно обрабатывают не-BMP кодовые точки.

  • Значение sys.maxunicode теперь всегда 1114111 (0x10FFFF в шестнадцатеричной системе). Функция PyUnicode_GetMax() по-прежнему возвращает либо 0xFFFF, либо 0x10FFFF для обратной совместимости, и ее не следует использовать с новым Unicode API (см. bpo-13054).

  • Флаг ./configure --with-wide-unicode был удален.

Производительность и использование ресурсов

Хранение строк Unicode теперь зависит от старшей кодовой точки в строке:

  • Чистые строки ASCII и Latin1 (U+0000-U+00FF) используют 1 байт на точку кода;

  • Строки BMP (U+0000-U+FFFF) используют 2 байта на одну кодовую точку;

  • Не-BMP строки (U+10000-U+10FFFF) используют 4 байта на кодовую точку.

Чистый эффект заключается в том, что для большинства приложений использование памяти для хранения строк должно значительно снизиться - особенно по сравнению с прежними широкими юникодными сборками - поскольку во многих случаях строки будут чистым ASCII даже в международном контексте (потому что многие строки хранят данные нечеловеческого языка, такие как фрагменты XML, заголовки HTTP, данные, закодированные в JSON, и т.д.). Мы также надеемся, что по тем же причинам это повысит эффективность кэша процессора в нетривиальных приложениях. Использование памяти Python 3.3 в два-три раза меньше, чем Python 3.2, и немного лучше, чем Python 2.7, на эталоне Django (подробности см. в PEP).

См.также

PEP 393 - Гибкое представление строк

PEP написан Мартином фон Лёвисом; реализация - Торстеном Беккером и Мартином фон Лёвисом.

PEP 397: Python Launcher для Windows

Программа установки Python 3.3 для Windows теперь включает приложение запуска py, которое можно использовать для запуска приложений Python независимо от версии.

Эта программа запуска вызывается неявно при двойном щелчке по файлам *.py. Если в системе установлена только одна версия Python, то для запуска файла будет использоваться эта версия. Если установлено несколько версий, по умолчанию будет использоваться самая последняя версия, но это можно отменить, включив в сценарий Python «строку shebang» в стиле Unix.

Программа запуска также может быть использована явно из командной строки как приложение py. Запуск py подчиняется тем же правилам выбора версии, что и неявный запуск скриптов, но более конкретная версия может быть выбрана путем передачи соответствующих аргументов (например, -3 для запроса Python 3, если установлен Python 2, или -2.6 для специального запроса более ранней версии Python, если установлена более новая версия).

В дополнение к программе запуска, программа установки Windows теперь включает опцию добавления только что установленного Python в системный PATH. (Внесено Брайаном Кертином из bpo-3561).

См.также

PEP 397 - Python Launcher для Windows

PEP написан Марком Хаммондом и Мартином в. Лёвисом; реализация - Винаем Саджипом.

PEP написан Марком Хаммондом и Мартином в. Лёвисом; реализация - Винаем Саджипом.

Модификация PATH программы установки: Поиск исполняемого файла Python

PEP 3151: Переработка иерархии исключений ОС и ввода-вывода

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

Вам больше не нужно беспокоиться о выборе подходящего типа исключения между OSError, IOError, EnvironmentError, WindowsError, mmap.error, socket.error или select.error. Все эти типы исключений теперь только один: OSError. Остальные имена оставлены в качестве псевдонимов из соображений совместимости.

Вам больше не нужно беспокоиться о выборе подходящего типа исключения между errno, args[0], errno, OSError, , или . Все эти типы исключений теперь только один: . Остальные имена оставлены в качестве псевдонимов по соображениям совместимости.

А сам ConnectionError имеет более тонкие подклассы:

Благодаря новым исключениям теперь можно избежать частого использования errno. Например, следующий код, написанный для Python 3.2:

from errno import ENOENT, EACCES, EPERM

try:
    with open("document.txt") as f:
        content = f.read()
except IOError as err:
    if err.errno == ENOENT:
        print("document.txt file is missing")
    elif err.errno in (EACCES, EPERM):
        print("You are not allowed to read document.txt")
    else:
        raise

теперь можно писать без импорта errno и без ручной проверки атрибутов исключений:

try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("document.txt file is missing")
except PermissionError:
    print("You are not allowed to read document.txt")

См.также

PEP 3151 - Переработка иерархии исключений ОС и IO

PEP написан и реализован Антуаном Питру

PEP 380: Синтаксис для делегирования полномочий субгенератору

PEP 380 добавляет выражение yield from, позволяющее generator делегировать часть своих операций другому генератору. Это позволяет вычленить участок кода, содержащий yield, и поместить его в другой генератор. Кроме того, подгенератор может возвращаться со значением, и это значение становится доступным для делегирующего генератора.

Хотя выражение yield from предназначено в первую очередь для делегирования подгенератору, на самом деле оно позволяет делегировать произвольным подгенераторам.

Для простых итераторов yield from iterable по сути является просто сокращенной формой for item in iterable: yield item:

>>> def g(x):
...     yield from range(x, 0, -1)
...     yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]

Однако, в отличие от обычного цикла, yield from позволяет подгенераторам получать отправленные и брошенные значения непосредственно из вызывающей области видимости и возвращать окончательное значение внешнему генератору:

>>> def accumulate():
...     tally = 0
...     while 1:
...         next = yield
...         if next is None:
...             return tally
...         tally += next
...
>>> def gather_tallies(tallies):
...     while 1:
...         tally = yield from accumulate()
...         tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc)  # Ensure the accumulator is ready to accept values
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the first tally
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # Finish the second tally
>>> tallies
[6, 10]

Основной принцип этого изменения - позволить даже генераторам, которые предназначены для использования с методами send и throw, быть разбитыми на несколько подгенераторов так же легко, как одна большая функция может быть разбита на несколько подфункций.

См.также

PEP 380 - Синтаксис для делегирования полномочий субгенератору

PEP написан Грегом Юингом; реализация Грегом Юингом, интегрирована в 3.3 Рено Бланшем, Райаном Келли и Ником Когланом; документация Збигневом Енджеевским-Шмеком и Ником Когланом.

PEP 409: Подавление контекста исключения

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

>>> class D:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x

Без суффикса from None для подавления причины, исходное исключение будет отображаться по умолчанию:

>>> class C:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
  File "<stdin>", line 6, in __getattr__
KeyError: 'x'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in __getattr__
AttributeError: x

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

>>> try:
...     D({}).x
... except AttributeError as exc:
...     print(repr(exc.__context__))
...
KeyError('x',)

См.также

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

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

PEP 414: Явные литералы Unicode

Чтобы облегчить переход от Python 2 к приложениям Python с поддержкой Unicode, которые активно используют литералы Unicode, Python 3.3 снова поддерживает префикс «u» для строковых литералов. Этот префикс не имеет семантического значения в Python 3, он предоставляется исключительно для того, чтобы уменьшить количество чисто механических изменений при переходе на Python 3, облегчая разработчикам сосредоточение на более значимых семантических изменениях (таких как более строгое разделение двоичных и текстовых данных по умолчанию).

См.также

PEP 414 - Явные литералы Unicode

PEP написан Армином Ронахером.

PEP 3155: Квалифицированные имена для классов и функций

Объекты функций и классов имеют новый атрибут __qualname__, представляющий «путь» от верхнего уровня модуля до их определения. Для глобальных функций и классов это то же самое, что __name__. Для других функций и классов он предоставляет более точную информацию о том, где они были определены, и как они могут быть доступны из глобальной области видимости.

Пример с (несвязанными) методами:

>>> class C:
...     def meth(self):
...         pass
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'

Пример с вложенными классами:

>>> class C:
...     class D:
...         def meth(self):
...             pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'

Пример с вложенными функциями:

>>> def outer():
...     def inner():
...         pass
...     return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'

Строковое представление этих объектов также изменяется, чтобы включить новую, более точную информацию:

>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'

См.также

PEP 3155 - Квалифицированное имя для классов и функций

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

PEP 412: Словарь совместного использования ключей

Словари, используемые для хранения атрибутов объектов, теперь могут разделять часть своей внутренней памяти между собой (а именно, часть, в которой хранятся ключи и соответствующие им хэши). Это уменьшает потребление памяти программами, создающими множество экземпляров не встроенных типов.

См.также

PEP 412 - Словарь совместного использования ключей

PEP написан и реализован Марком Шенноном.

PEP 362: Объект сигнатуры функции

Новая функция inspect.signature() делает интроспекцию вызываемых объектов python простой и понятной. Поддерживается широкий спектр вызываемых объектов: функции python, декорированные или нет, классы и объекты functools.partial(). Новые классы inspect.Signature, inspect.Parameter и inspect.BoundArguments хранят информацию о сигнатурах вызовов, такую как аннотации, значения по умолчанию, типы параметров и связанные аргументы, что значительно упрощает написание декораторов и любого кода, который проверяет или изменяет сигнатуры вызовов или аргументы.

См.также

PEP 362: - Объект сигнатуры функции

PEP написан Бреттом Кэнноном, Юрием Селивановым, Ларри Хастингсом, Дживоном Сео; реализован Юрием Селивановым.

PEP 421: Добавление sys.implementation

Новый атрибут модуля sys раскрывает детали, специфичные для реализации текущего запущенного интерпретатора. Начальный набор атрибутов на sys.implementation - это name, version, hexversion и cache_tag.

Цель sys.implementation - объединить в одном пространстве имен специфичные для реализации данные, используемые стандартной библиотекой. Это позволяет различным реализациям Python легче использовать единую базу кода стандартной библиотеки. В своем начальном состоянии sys.implementation содержит лишь небольшую часть данных, специфичных для реализации. Со временем это соотношение будет меняться, чтобы сделать стандартную библиотеку более переносимой.

Одним из примеров улучшенной переносимости стандартной библиотеки является cache_tag. Начиная с Python 3.3, sys.implementation.cache_tag использует importlib для поддержки соответствия PEP 3147. Любая реализация Python, использующая importlib для своей встроенной системы импорта, может использовать cache_tag для управления поведением кэширования модулей.

SimpleNamespace

Реализация sys.implementation также вводит в Python новый тип: types.SimpleNamespace. В отличие от пространства имен на основе отображения, как dict, SimpleNamespace основано на атрибутах, как object. Однако, в отличие от object, экземпляры SimpleNamespace можно записывать. Это означает, что вы можете добавлять, удалять и изменять пространство имен через обычный доступ к атрибутам.

См.также

PEP 421 - Добавление sys.implementation

PEP написан и реализован Эриком Сноу.

Использование importlib в качестве реализации импорта

bpo-2377 - Заменить __import__ на importlib.__import__ bpo-13959 - Реализовать части imp в чистом Python bpo-14605 - Сделать механизм импорта явным bpo-14646 - Требовать, чтобы загрузчики устанавливали __loader__ и __package__.

Функция __import__() теперь работает от importlib.__import__(). Эта работа ведет к завершению «фазы 2» PEP 302. Это изменение имеет множество преимуществ. Во-первых, это позволило раскрыть больше механизмов, обеспечивающих импорт, вместо того, чтобы они были неявными и скрытыми в коде на языке Си. Это также обеспечивает единую реализацию для всех виртуальных машин Python, поддерживающих Python 3.3, что помогает покончить с любыми специфическими для виртуальных машин отклонениями в семантике импорта. И, наконец, она облегчает сопровождение импорта, позволяя развивать его в будущем.

Для обычного пользователя не должно быть никаких видимых изменений в семантике. Для тех, чей код в настоящее время манипулирует импортом или вызывает импорт программно, изменения кода, которые, возможно, потребуются, описаны в разделе Porting Python code этого документа.

Новые API

Одним из главных преимуществ этой работы является раскрытие того, что делает оператор импорта работоспособным. Это означает, что различные импортеры, которые раньше были неявными, теперь полностью раскрыты как часть пакета importlib.

Абстрактные базовые классы, определенные в importlib.abc, были расширены для правильного разграничения между meta path finders и path entry finders путем введения importlib.abc.MetaPathFinder и importlib.abc.PathEntryFinder соответственно. Старый ABC importlib.abc.Finder теперь предоставляется только для обратной совместимости и не налагает никаких требований к методам.

Что касается искателей, importlib.machinery.FileFinder раскрывает механизм, используемый для поиска файлов исходного текста и байткода модуля. Ранее этот класс был неявным членом sys.path_hooks.

Для загрузчиков новый абстрактный базовый класс importlib.abc.FileLoader помогает написать загрузчик, который использует файловую систему в качестве механизма хранения кода модуля. Загрузчик для исходных файлов (importlib.machinery.SourceFileLoader), файлов байткода без источников (importlib.machinery.SourcelessFileLoader) и модулей расширения (importlib.machinery.ExtensionFileLoader) теперь доступны для прямого использования.

ImportError теперь имеет атрибуты name и path, которые устанавливаются при наличии соответствующих данных. Сообщение о неудачном импорте теперь будет содержать полное имя модуля, а не только конец имени модуля.

Функция importlib.invalidate_caches() теперь будет вызывать одноименный метод на всех искателях, кэшированных в sys.path_importer_cache, чтобы помочь очистить любое сохраненное состояние по мере необходимости.

Видимые изменения

О возможных необходимых изменениях в коде см. раздел Porting Python code.

Помимо расширения возможностей, которые теперь открывает importlib, есть и другие заметные изменения в импорте. Самым большим является то, что sys.meta_path и sys.path_hooks теперь хранят все мета-поисковики путей и крючки входа в путь, используемые импортом. Ранее искатели были неявными и скрывались в Си-коде импорта вместо того, чтобы быть непосредственно открытыми. Это означает, что теперь можно легко удалить или изменить порядок различных искателей в соответствии со своими потребностями.

Еще одно изменение заключается в том, что все модули имеют атрибут __loader__, хранящий загрузчик, использованный для создания модуля. PEP 302 был обновлен, чтобы сделать этот атрибут обязательным для реализации загрузчиками, так что в будущем, после обновления сторонних загрузчиков, люди смогут полагаться на существование этого атрибута. До тех пор, однако, импорт устанавливает модуль после загрузки.

Загрузчики также должны теперь устанавливать атрибут __package__ от PEP 366. Опять же, сам импорт уже устанавливает это для всех загрузчиков из importlib и сам импорт устанавливает атрибут после загрузки.

None теперь вставляется в sys.path_importer_cache, когда в sys.path_hooks не найден искатель. Так как imp.NullImporter не выводится непосредственно на sys.path_hooks, то теперь нельзя полагаться на то, что оно всегда будет доступно для использования в качестве значения, представляющего отсутствие найденного искателя.

Все остальные изменения относятся к семантическим изменениям, которые следует учитывать при обновлении кода для Python 3.3, и поэтому о них следует читать в разделе Porting Python code этого документа.

(Выполнение Бретт Кэннон)

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

Некоторые более мелкие изменения, внесенные в основной язык Python, следующие:

  • Добавлена поддержка псевдонимов имен Unicode и именованных последовательностей. Теперь и unicodedata.lookup(), и '\N{...}' разрешают псевдонимы имен, а unicodedata.lookup() разрешает и именованные последовательности.

    (Внесено Эцио Мелотти из bpo-12753).

  • База данных Unicode обновлена до версии UCD 6.1.0

  • Сравнение равенства объектов range() теперь возвращает результат, отражающий равенство базовых последовательностей, порожденных этими объектами диапазона. (bpo-13201)

  • Методы count(), find(), rfind(), index() и rindex() объектов bytes и bytearray теперь принимают в качестве первого аргумента целое число от 0 до 255.

    (Внесено Петри Лехтиненом из bpo-12170).

  • (Внесено Петри Лехтиненом из rjust()).

  • Добавлены новые методы в list и bytearray: copy() и clear() (bpo-10516). Следовательно, MutableSequence теперь также определяет метод clear() (bpo-11388).

  • Необработанные байтовые литералы теперь могут быть записаны как rb"...", так и br"...".

    (Внесено Антуаном Питру из bpo-13748).

  • dict.setdefault() теперь выполняет только один поиск для заданного ключа, что делает его атомарным при использовании со встроенными типами.

    (Внесено Филипом Грущиньским из bpo-13521).

  • Значительно улучшены сообщения об ошибках, выдаваемые при несоответствии вызова функции сигнатуре функции.

    (При участии Бенджамина Петерсона.)

(При участии Бенджамина Петерсона.)

Предыдущие версии CPython всегда полагались на глобальную блокировку импорта. Это приводило к неожиданным неприятностям, таким как тупики, когда импорт модуля вызывал выполнение кода в другом потоке в качестве побочного эффекта. Иногда использовались неуклюжие обходные пути, например, функция API C PyImport_ImportModuleNoBlock().

В Python 3.3 при импорте модуля происходит блокировка каждого модуля. Это корректно сериализует импорт данного модуля из нескольких потоков (предотвращая воздействие не полностью инициализированных модулей), устраняя при этом вышеупомянутые неудобства.

(Внесено Антуаном Питру из bpo-9260).

Встроенные функции и типы

  • open() получает новый параметр opener: базовый дескриптор файла для объекта файла затем получается вызовом opener с (file, flags). Это может быть использовано для использования пользовательских флагов, таких как os.O_CLOEXEC, например. Был добавлен режим 'x': открытие для эксклюзивного создания, отказ, если файл уже существует.

  • print(): добавлен аргумент с ключевым словом flush. Если аргумент ключевого слова flush равен true, поток принудительно очищается.

  • hash(): рандомизация хэша включена по умолчанию, см. object.__hash__() и PYTHONHASHSEED.

  • Тип str получает новый метод casefold(): возвращает свернутую в регистр копию строки, свернутые в регистр строки могут использоваться для бесказеозного сопоставления. Например, 'ß'.casefold() возвращает 'ss'.

  • Документация по последовательностям была существенно переписана, чтобы лучше объяснить различие между двоичными и текстовыми последовательностями и предоставить специальные разделы документации для отдельных встроенных типов последовательностей (bpo-4966).

Новые модули

faulthandler

Этот новый отладочный модуль faulthandler содержит функции для явного сброса трассировки Python, при ошибке (сбое, например, ошибке сегментации), после тайм-аута или по сигналу пользователя. Вызовите faulthandler.enable(), чтобы установить обработчики ошибок для сигналов SIGSEGV, SIGFPE, SIGABRT, SIGBUS и SIGILL. Вы также можете включить их при запуске, установив переменную окружения PYTHONFAULTHANDLER или используя опцию командной строки -X faulthandler.

Пример ошибки сегментации в Linux:

$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault

Current thread 0x00007fb899f39700:
  File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
  File "<stdin>", line 1 in <module>
Segmentation fault

ipaddress

Новый модуль ipaddress предоставляет инструменты для создания и манипулирования объектами, представляющими адреса IPv4 и IPv6, сети и интерфейсы (т.е. IP-адрес, связанный с определенной IP-подсетью).

(Предоставлено компанией Google и Питером Муди в PEP 3144).

lzma

Недавно добавленный модуль lzma обеспечивает сжатие и распаковку данных с использованием алгоритма LZMA, включая поддержку форматов файлов .xz и .lzma.

(При участии Надима Вавды и Пера Эйвинда Карлсена в bpo-6715).

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

abc

Улучшена поддержка абстрактных базовых классов, содержащих дескрипторы, состоящие из абстрактных методов. Рекомендуемый подход к объявлению абстрактных дескрипторов теперь заключается в предоставлении __isabstractmethod__ в качестве динамически обновляемого свойства. Встроенные дескрипторы были обновлены соответствующим образом.

(Внесено Дарреном Дейлом из bpo-11610).

abc.ABCMeta.register() теперь возвращает зарегистрированный подкласс, что означает, что теперь его можно использовать в качестве декоратора класса (bpo-10868).

массив

Модуль array поддерживает тип long long, используя коды типов q и Q.

(Внесено Ореном Тирошем и Хироказу Ямамото в bpo-1172711).

base64

Строки Unicode только в формате ASCII теперь принимаются функциями декодирования современного интерфейса base64. Например, base64.b64decode('YWJj') возвращает b'abc'. (Внесено Каталином Якобом в bpo-13641).

binascii

В дополнение к двоичным объектам, которые они обычно принимают, функции a2b_ теперь принимают на вход только ASCII-строки. (Внесено Антуаном Питру в bpo-13637).

bz2

Модуль bz2 был переписан с нуля. В процессе работы было добавлено несколько новых функций:

  • Новая функция bz2.open(): открытие bzip2-сжатого файла в двоичном или текстовом режиме.

  • bz2.BZ2File теперь может читать из и записывать в произвольные файлоподобные объекты, используя аргумент fileobj своего конструктора.

    (Предоставлено Nadeem Vawda в bpo-5863.)

  • bz2.BZ2File и bz2.decompress() теперь могут распаковывать многопотоковые входные данные (например, созданные инструментом pbzip2). bz2.BZ2File теперь также можно использовать для создания файлов этого типа, используя режим 'a' (append).

    (Внесено Ниром Эйдесом в bpo-1625).

  • bz2.BZ2File теперь реализует все API io.BufferedIOBase, за исключением методов detach() и truncate().

кодеки

Кодек mbcs был переписан для корректной обработки обработчиков ошибок replace и ignore во всех версиях Windows. Кодек mbcs теперь поддерживает все обработчики ошибок, вместо только replace для кодирования и ignore для декодирования.

Добавлен новый кодек только для Windows: cp65001 (bpo-13216). Это кодовая страница Windows 65001 (Windows UTF-8, CP_UTF8). Например, он используется командой sys.stdout, если кодовая страница вывода консоли установлена на cp65001 (например, с помощью команды chcp 65001).

Многобайтовые декодеры CJK теперь синхронизируются быстрее. Они игнорируют только первый байт недопустимой последовательности байтов. Например, b'\xff\n'.decode('gb2312', 'replace') теперь возвращает \n после символа замены.

(bpo-12016)

Инкрементные кодеки CJK больше не сбрасываются при каждом вызове их методов encode(). Например:

>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'

Этот пример дает b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.' при использовании старых версий Python.

(bpo-12100)

Кодек unicode_internal был устаревшим.

коллекции

Добавление нового класса ChainMap, позволяющего рассматривать несколько отображений как единое целое. (Написан Раймондом Хеттингером для bpo-11089, обнародован в bpo-11297).

Абстрактные базовые классы были перенесены в новый модуль collections.abc, чтобы лучше различать абстрактные и конкретные классы коллекций. Псевдонимы для ABC по-прежнему присутствуют в модуле collections, чтобы сохранить существующий импорт. (bpo-11085)

Класс Counter теперь поддерживает унарные операторы + и -, а также операторы in-place +=, -=, |= и &=. (Внесено Раймондом Хеттингером в bpo-13121).

contextlib

ExitStack теперь обеспечивает прочную основу для программного манипулирования менеджерами контекста и аналогичной функциональности очистки. В отличие от предыдущего API contextlib.nested (который был устаревшим и удален), новый API предназначен для корректной работы независимо от того, получают ли менеджеры контекста свои ресурсы в своем методе __init__ (например, объекты файлов) или в своем методе __enter__ (например, объекты синхронизации из модуля threading).

(bpo-13585)

крипта

Добавление соли и модульного криптоформата (метод хэширования) и функции mksalt() в модуль crypt.

(bpo-10924)

проклятия

  • Если модуль curses связан с библиотекой ncursesw, используйте функции Unicode, когда передаются строки или символы Unicode (например, waddwstr()), и байтовые функции в противном случае (например, waddstr()).

  • Если модуль utf-8 связан с библиотекой ncursesw, используйте функции Unicode, когда передаются строки или символы Unicode (например, :c ), и байтовые функции в противном случае (например, :c ).

  • curses.window имеет новый атрибут curses.window.encoding.

  • Класс curses.window имеет новый метод get_wch() для получения широкого символа

  • В модуле curses появилась новая функция unget_wch() для вставки широкого символа, чтобы следующий get_wch() вернул его обратно

(Предоставлено Иньиго Серна в bpo-6755).

дататайм

  • Сравнения равенства между наивными и осознанными экземплярами datetime теперь возвращают False вместо того, чтобы поднимать TypeError (bpo-15006).

  • Новый метод datetime.datetime.timestamp(): Возвращает временную метку POSIX, соответствующую экземпляру datetime.

  • Метод datetime.datetime.strftime() поддерживает форматирование лет старше 1000.

  • Метод datetime.datetime.astimezone() теперь может быть вызван без аргументов для преобразования экземпляра datetime в системный часовой пояс.

десятичная дробь

bpo-7652 - интеграция быстрой встроенной десятичной арифметики.

C-модуль и libmpdec написаны Стефаном Крахом.

В новую версию модуля decimal на языке C интегрирована высокоскоростная библиотека libmpdec для произвольной точности правильно округленной десятичной арифметики с плавающей запятой. libmpdec соответствует спецификации IBM General Decimal Arithmetic Specification.

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

Следующая таблица приведена в качестве иллюстрации. Бенчмарки доступны на сайте https://www.bytereef.org/mpdecimal/quickstart.html.

decimal.py

десятичный

ускорение

pi

42.02s

0.345s

120x

телеком

172.19s

5.68s

30x

psycopg

3.57s

0.29s

12x

Характеристики

  • Сигнал FloatOperation опционально включает более строгую семантику для смешивания плавающих и десятичных чисел.

  • Если Python скомпилирован без потоков, версия C автоматически отключает дорогостоящий механизм локального контекста потоков. В этом случае переменная HAVE_THREADS устанавливается в False.

Изменения в API

  • Модуль C имеет следующие контекстные ограничения, зависящие от архитектуры машины:

    32-бит

    64-бит

    MAX_PREC

    425000000

    999999999999999999

    MAX_EMAX

    425000000

    999999999999999999

    MIN_EMIN

    -425000000

    -999999999999999999

  • В контекстных шаблонах (DefaultContext, BasicContext и ExtendedContext) величина Emax и Emin изменилась на 999999.

  • Конструктор Decimal в decimal.py не соблюдает контекстные ограничения и точно преобразует значения с произвольными экспонентами или точностью. Поскольку версия на языке C имеет внутренние ограничения, используется следующая схема: Если возможно, значения преобразуются точно, в противном случае выдается InvalidOperation и результатом является NaN. В последнем случае всегда можно использовать create_decimal(), чтобы получить округленное или неточное значение.

  • Функция power в decimal.py всегда округляется правильно. В версии на C она определяется в терминах правильно округленных функций exp() и ln(), но конечный результат только «почти всегда правильно округлен».

  • В версии на языке C словарь контекста, содержащий сигналы, представляет собой MutableMapping. По соображениям скорости, flags и traps всегда ссылаются на тот же MutableMapping, которым был инициализирован контекст. Если назначается новый словарь сигналов, flags и traps обновляются новыми значениями, но они не ссылаются на словарь RHS.

  • Пиклинг Context производит другой вывод, чтобы иметь общий формат обмена для версий Python и C.

  • Порядок аргументов в конструкторе Context был изменен, чтобы соответствовать порядку, отображаемому repr().

  • Параметр watchexp в методе quantize() устарел.

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

Основы политики

Теперь пакет email имеет структуру policy. Policy - это объект с несколькими методами и свойствами, которые управляют поведением пакета электронной почты. Основной политикой для Python 3.3 является политика Compat32, которая обеспечивает обратную совместимость с почтовым пакетом в Python 3.2. Политика policy может быть указана, когда сообщение электронной почты разбирается с помощью parser, или когда создается объект Message, или когда письмо сериализуется с помощью generator. Если политика, переданная в parser, не переопределена, она наследуется всеми объектами Message и подобъектами, созданными parser. По умолчанию generator будет использовать политику объекта Message, который он сериализует. По умолчанию используется политика compat32.

Минимальный набор элементов управления, реализуемый всеми объектами policy, является минимальным:

максимальная_длина_строки

Максимальная длина, исключая символ(ы) linesep, которую могут иметь отдельные строки при сериализации Message. По умолчанию равно 78.

linesep

Символ, используемый для разделения отдельных строк при сериализации Message. По умолчанию используется \n.

cte_type

7bit или 8bit. 8bit применяется только к Bytes generator и означает, что не-ASCII может быть использован там, где это разрешено протоколом (или где он существует в исходном вводе).

повышение_на_дефект

Заставляет parser вызывать ошибку при возникновении дефектов, а не добавлять их в список Message объекта defects.

Новый экземпляр политики с новыми настройками создается с помощью метода clone() объектов политики. clone принимает любой из перечисленных выше элементов управления в качестве аргумента ключевого слова. Любой элемент управления, не указанный в вызове, сохраняет свое значение по умолчанию. Таким образом, вы можете создать политику, использующую символы строк \r\n следующим образом:

mypolicy = compat32.clone(linesep='\r\n')

Политики можно использовать для упрощения генерации сообщений в формате, необходимом вашему приложению. Вместо того чтобы не забывать указывать linesep='\r\n' во всех местах, где вы вызываете generator, вы можете указать его один раз, когда задаете политику, используемую parser или Message, в зависимости от того, что ваша программа использует для создания объектов Message. С другой стороны, если вам нужно генерировать сообщения в нескольких формах, вы все равно можете указать параметры в соответствующем вызове generator. Или вы можете иметь пользовательские экземпляры политики для различных случаев и передавать их при создании generator.

Временная политика с API нового заголовка

Политики можно использовать для упрощения генерации сообщений в формате, необходимом вашему приложению. Вместо того чтобы не забывать указывать provisional policy во всех местах, где вы вызываете , вы можете указать его один раз, когда задаете политику, используемую или , в зависимости от того, что ваша программа использует для создания объектов . С другой стороны, если вам нужно генерировать сообщения в нескольких формах, вы все равно можете указать параметры в соответствующем вызове . Или вы можете иметь пользовательские экземпляры политики для различных случаев и передавать их при создании .

Новые политики являются экземплярами EmailPolicy и добавляют следующие дополнительные элементы управления:

refold_source

Управляет тем, будут ли заголовки, разобранные parser, разворачиваться generator. Это может быть none, long или all. По умолчанию используется long, что означает, что исходные заголовки со строкой длиннее, чем max_line_length, будут перевернуты. none означает, что ни одна строка не будет перевернута, а all означает, что все строки будут перевернуты.

header_factory

Вызываемый объект, который принимает name и value и создает объект пользовательского заголовка.

header_factory является ключом к новым возможностям, предоставляемым новыми политиками. Когда используется одна из новых политик, любой заголовок, полученный из объекта Message, является объектом, произведенным header_factory, и каждый раз, когда вы устанавливаете заголовок на Message, он становится объектом, произведенным header_factory. Все такие объекты заголовков имеют атрибут name, равный имени заголовка. Заголовки Address и Date имеют дополнительные атрибуты, которые дают вам доступ к разобранным данным заголовка. Это означает, что теперь вы можете делать такие вещи, как:

>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400

Вы заметите, что при сериализации сообщения отображаемое в юникоде имя автоматически кодируется как utf-8, но при прямом обращении к заголовку вы получаете версию в юникоде. Это устраняет необходимость работать с функциями email.header decode_header() или make_header().

Вы также можете создавать адреса из частей:

>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
...                           Address('Sally', 'sally', 'example.com')]),
...            Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>

Декодирование в юникод происходит автоматически:

>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'

Когда вы разбираете сообщение, вы можете использовать атрибуты addresses и groups объектов заголовка для доступа к группам и индивидуальным адресам:

>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))

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

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

Новый BytesHeaderParser, добавленный в модуль parser, дополняет HeaderParser и завершает API байтов.

Новые функции полезности:

  • format_datetime(): учитывая datetime, выдает строку, отформатированную для использования в заголовке электронной почты.

  • parsedate_to_datetime(): учитывая строку даты из заголовка электронной почты, преобразуйте ее в осознанную datetime или наивную datetime, если смещение равно -0000.

  • localtime(): При отсутствии аргумента возвращает текущее местное время в виде aware datetime, используя local timezone. При значении aware datetime преобразует его в aware datetime, используя local timezone.

ftplib

  • ftplib.FTP теперь принимает аргумент с ключевым словом source_address, чтобы указать (host, port) для использования в качестве адреса источника в вызове bind при создании исходящего сокета. (Внесено Джампаоло Родола в bpo-8594).

  • Класс FTP_TLS теперь предоставляет новую функцию ccc() для возврата канала управления обратно в открытый текст. Это может быть полезно для использования преимуществ брандмауэров, которые умеют обрабатывать NAT с незащищенным FTP без открытия фиксированных портов. (Внесено Джампаоло Родола в bpo-12139).

  • Добавлен метод ftplib.FTP.mlsd(), который предоставляет разбираемый формат листинга каталогов, и отменены ftplib.FTP.nlst() и ftplib.FTP.dir(). (Внесено Джампаоло Родола в bpo-11072).

functools

Декоратор functools.lru_cache() теперь принимает аргумент с ключевым словом typed (по умолчанию False), чтобы гарантировать, что он кэширует значения разных типов, которые сравниваются одинаково, в отдельных слотах кэша. (Внесено Раймондом Хеттингером в bpo-13227).

gc

Теперь можно регистрировать обратные вызовы, вызываемые сборщиком мусора до и после сборки, используя новый список callbacks.

hmac

Добавлена новая функция compare_digest() для предотвращения атак через побочный канал на дайджесты посредством анализа времени. (Вклад Ника Коглана и Кристиана Хаймса в bpo-15061).

http

http.server.BaseHTTPRequestHandler теперь буферизирует заголовки и записывает их все сразу при вызове end_headers(). Новый метод flush_headers() можно использовать для прямого управления моментом отправки накопленных заголовков. (Внесено Эндрю Шаафом в bpo-3709).

http.server теперь производит корректный вывод HTML 4.01 strict. (Внесено Эцио Мелотти в bpo-13295).

http.client.HTTPResponse теперь имеет метод readinto(), что означает, что его можно использовать как класс io.RawIOBase. (Внесено Джоном Куном в bpo-13464).

html

html.parser.HTMLParser теперь может разбирать нарушенную разметку без возникновения ошибок, поэтому аргумент strict конструктора и исключение HTMLParseError теперь устарели. Возможность разбора неполной разметки является результатом ряда исправлений, которые также доступны в последних выпусках Python 2.7/3.2. (Вклад Эцио Мелотти в bpo-15114, и bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311).

В модуль html5 был добавлен новый словарь html5['gt;'] == '>', который отображает ссылки на именованные символы HTML5 на эквивалентные символы Unicode (например, html.entities). Словарь теперь также используется модулем HTMLParser. (Внесено Эцио Мелотти в bpo-11113 и bpo-15156).

imaplib

Конструктор IMAP4_SSL теперь принимает параметр SSLContext для управления параметрами защищенного канала.

(Внесено Сиджином Джозефом из bpo-8808).

проверять

Добавлена новая функция getclosurevars(). Эта функция сообщает текущую привязку всех имен, на которые ссылается тело функции, и где эти имена были разрешены, что облегчает проверку правильности внутреннего состояния при тестировании кода, который полагается на закрытия с состоянием.

(Вклад внесли Меадор Инге и Ник Коглан из bpo-13062).

Добавлена новая функция getgeneratorlocals(). Эта функция сообщает о текущей привязке локальных переменных в стековом фрейме генератора, что облегчает проверку правильности внутреннего состояния при тестировании генераторов.

(Внесено Меадором Инге в bpo-15153).

io

Функция open() имеет новый режим 'x', который может использоваться исключительно для создания нового файла и вызывать ошибку FileExistsError, если файл уже существует. Он основан на режиме C11 „x“ для функции fopen().

(Внесено Дэвидом Тауншендом из bpo-12760).

Конструктор класса TextIOWrapper имеет новый необязательный аргумент write_through. Если write_through равен True, вызовы write() гарантированно не буферизируются: любые данные, записанные на объект TextIOWrapper, немедленно обрабатываются в его базовый двоичный буфер.

itertools

accumulate() теперь принимает необязательный аргумент func для предоставления пользовательской двоичной функции.

ведение журнала

Функция basicConfig() теперь поддерживает дополнительный аргумент handlers, принимающий итерацию обработчиков для добавления в корневой логгер.

Атрибут уровня класса append_nul был добавлен к SysLogHandler, чтобы позволить контролировать добавление байта NUL (\000) в записи syslog, поскольку для некоторых демонов он необходим, а для других передается в журнал.

математика

В модуле math появилась новая функция log2(), которая возвращает логарифм по основанию 2 от x.

(Написано Марком Дикинсоном в bpo-11888).

mmap

Метод read() теперь более совместим с другими файлоподобными объектами: если аргумент опущен или указан как None, он возвращает байты от текущей позиции файла до конца отображения. (Внесено Петри Лехтиненом в bpo-12021).

многопроцессорная обработка

Новая функция multiprocessing.connection.wait() позволяет опрашивать несколько объектов (таких как соединения, сокеты и трубы) с таймаутом. (Внесено Ричардом Оудкерком в bpo-12328).

Объекты multiprocessing.Connection теперь можно передавать по многопроцессорным соединениям. (Внесено Ричардом Оудкерком в bpo-4892).

multiprocessing.Process теперь принимает аргумент с ключевым словом daemon, чтобы отменить поведение по умолчанию - наследование флага daemon от родительского процесса (bpo-6064).

Новый атрибут multiprocessing.Process.sentinel позволяет программе ожидать несколько объектов Process одновременно, используя соответствующие примитивы ОС (например, select в posix системах).

Новые методы multiprocessing.pool.Pool.starmap() и starmap_async() предоставляют itertools.starmap() эквиваленты существующих функций multiprocessing.pool.Pool.map() и map_async(). (Внесено Хинеком Шлаваком в bpo-12708).

nntplib

Класс nntplib.NNTP теперь поддерживает протокол управления контекстом для безусловного потребления исключений socket.error и закрытия NNTP-соединения по завершении работы:

>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
...     n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>

(Внесено Джампаоло Родола в bpo-9795).

os

  • В модуле os появилась новая функция pipe2(), позволяющая атомарно создавать трубу с установленными флагами O_CLOEXEC или O_NONBLOCK. Это особенно полезно для предотвращения условий гонки в многопоточных программах.

  • Модуль os содержит новую функцию sendfile(), которая обеспечивает эффективный способ «нулевого копирования» для копирования данных из одного дескриптора файла (или сокета) в другой. Фраза «zero-copy» относится к тому факту, что все копирование данных между двумя дескрипторами выполняется полностью ядром, без копирования данных в буферы пользовательского пространства. sendfile() можно использовать для эффективного копирования данных из файла на диске в сетевой сокет, например, для загрузки файла.

    (Патч предоставлен Россом Лагерволлом и Джампаоло Родола в bpo-10882).

  • Чтобы избежать условий гонки, таких как атаки симлинков и проблемы с временными файлами и каталогами, надежнее (а также быстрее) работать с дескрипторами файлов, а не с именами файлов. В Python 3.3 улучшены существующие функции и введены новые функции для работы с дескрипторами файлов (bpo-4761, bpo-10755 и bpo-14626).

  • access() принимает аргумент с ключевым словом effective_ids, чтобы включить использование эффективного uid/gid, а не реального uid/gid при проверке доступа. Поддержка платформы может быть проверена с помощью набора supports_effective_ids.

  • Модуль os имеет две новые функции: getpriority() и setpriority(). Они могут быть использованы для получения или установки ниш/приоритета процесса аналогично os.nice(), но распространяются на все процессы, а не только на текущий.

    (Патч представлен Giampaolo Rodolà в bpo-10784).

  • Новая функция os.replace() позволяет кроссплатформенное переименование файла с перезаписью целевого файла. С помощью os.rename() существующий файл назначения перезаписывается под POSIX, но вызывает ошибку под Windows. (Вклад Антуана Питру в bpo-8828).

  • Семейство функций stat (stat(), fstat() и lstat()) теперь поддерживает чтение временных меток файла с наносекундной точностью. Симметрично, utime() теперь может записывать временные метки файла с наносекундной точностью. (Внесено Ларри Хастингсом в bpo-14127).

  • Новая функция os.get_terminal_size() запрашивает размер терминала, присоединенного к дескриптору файла. См. также shutil.get_terminal_size(). (Внесено Збигневом Енджеевским-Шмеком в bpo-13609).

  • Новые функции для поддержки расширенных атрибутов Linux (bpo-12720): getxattr(), listxattr(), removexattr(), setxattr().

  • Новый интерфейс для планировщика. Эти функции управляют тем, как операционная система выделяет процессу процессорное время. Новые функции: sched_get_priority_max(), sched_get_priority_min(), sched_getaffinity(), sched_getparam(), sched_getscheduler(), sched_rr_get_interval(), sched_setaffinity(), sched_setparam(), sched_setscheduler(), sched_yield(),

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

    • posix_fadvise(): Объявляет о намерении получить доступ к данным по определенной схеме, позволяя ядру произвести оптимизацию.

    • posix_fallocate(): Убедитесь, что для файла выделено достаточно места на диске.

    • sync(): Принудительная запись всего на диск.

  • Дополнительные новые функции posix:

    • lockf(): Наложение, проверка или снятие POSIX-блокировки на открытый дескриптор файла.

    • pread(): Чтение из дескриптора файла по смещению, смещение файла остается неизменным.

    • pwrite(): Запись в дескриптор файла со смещения, оставляя смещение файла неизменным.

    • readv(): Чтение из дескриптора файла в несколько записываемых буферов.

    • truncate(): Усечь файл, соответствующий path, так, чтобы его размер был не более length байт.

    • waitid(): Дождитесь завершения одного или нескольких дочерних процессов.

    • writev(): Записать содержимое buffers в дескриптор файла, где buffers - произвольная последовательность буферов.

    • getgrouplist() (bpo-9344): Возвращает список идентификаторов групп, к которым принадлежит указанный пользователь.

  • times() и uname(): Тип возврата изменен с кортежа на кортежеподобный объект с именованными атрибутами.

  • Некоторые платформы теперь поддерживают дополнительные константы для функции lseek(), такие как os.SEEK_HOLE и os.SEEK_DATA.

  • Новые константы RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD и RTLD_DEEPBIND доступны на платформах, которые их поддерживают. Они предназначены для использования с функцией sys.setdlopenflags() и заменяют аналогичные константы, определенные в ctypes и DLFCN. (Внесено Виктором Стиннером в bpo-13226).

  • os.symlink() теперь принимает (и игнорирует) аргумент ключевого слова target_is_directory на платформах, отличных от Windows, для облегчения кросс-платформенной поддержки.

pdb

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

(Внесено Георгом Брандлом в bpo-14210)

маринованный огурец

Объекты pickle.Pickler теперь имеют необязательный атрибут dispatch_table, позволяющий задавать функции сокращения для каждого пиклера.

(Внесено Ричардом Оудкерком из bpo-14166).

pydoc

Графический интерфейс Tk и функция serve() были удалены из модуля pydoc: pydoc -g и serve() были устаревшими в Python 3.2.

re

Регулярные выражения str теперь поддерживают экранирование \u и \U.

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

расписание

  • run() теперь принимает блокирующий параметр, который при установке в false заставляет метод выполнять запланированные события, которые должны истечь раньше всего (если таковые имеются), а затем немедленно возвращаться. Это полезно в том случае, если вы хотите использовать scheduler в неблокирующих приложениях. (Внесено Джампаоло Родола в bpo-13449).

  • Класс scheduler теперь можно безопасно использовать в многопоточных средах. (Вклад Джосайи Карлсона и Джампаоло Родола в bpo-8684).

  • Параметры timefunc и delayfunct конструктора класса scheduler теперь необязательны и по умолчанию имеют значения time.time() и time.sleep() соответственно. (Внесено Крисом Кларком в bpo-13245).

  • enter() и enterabs() параметр argument теперь необязателен. (Внесено Крисом Кларком в bpo-13245).

  • enter() и enterabs() теперь принимают параметр kwargs. (Внесено Крисом Кларком в bpo-13245).

выберите

В Solaris и производных платформах появился новый класс select.devpoll для высокопроизводительных асинхронных сокетов через /dev/poll. (Внесено Хесусом Сеа Авионом в bpo-6397).

shlex

Ранее недокументированная вспомогательная функция quote из модулей pipes была перенесена в модуль shlex и документирована. quote() правильно экранирует все символы в строке, которым оболочка может придать специальное значение.

shutil

  • Новые функции:

    • disk_usage(): предоставляет статистику общего, используемого и свободного дискового пространства. (Внесено Джампаоло Родола в bpo-12442).

    • chown(): позволяет изменить пользователя и/или группу заданного пути, указывая также имена пользователей/групп, а не только их числовые идентификаторы. (Внесено Сандро Този в bpo-12191).

    • shutil.get_terminal_size(): возвращает размер окна терминала, к которому прикреплен интерпретатор. (Внесено Збигневом Енджеевским-Шмеком в bpo-13609).

  • copy2() и copystat() теперь сохраняют временные метки файлов с наносекундной точностью на платформах, которые это поддерживают. Они также сохраняют «расширенные атрибуты» файлов в Linux. (Вклад Ларри Хастингса в bpo-14127 и bpo-15238).

  • Некоторые функции теперь принимают необязательный аргумент symlinks: когда этот параметр равен true, симлинки не разыменовываются, и операция вместо этого действует на саму симлинку (или создает ее, если это уместно). (Внесено Хинеком Шлаваком в bpo-12715).

  • При копировании файлов в другую файловую систему команда move() теперь обрабатывает симлинки так, как это делает команда posix mv, воссоздавая симлинку вместо копирования содержимого целевого файла. (Внесено Джонатаном Нихофом в bpo-9993.) move() теперь также возвращает аргумент dst в качестве результата.

  • rmtree() теперь устойчив к атакам симлинков на платформах, поддерживающих новый параметр dir_fd в os.open() и os.unlink(). (Вклад Мартина фон Лёвиса и Хинека Шлавака в bpo-4489).

сигнал

  • Модуль signal имеет новые функции:

    • pthread_sigmask(): получение и/или изменение маски сигнала вызывающего потока (Внесено Жан-Полем Кальдероном в bpo-8407);

    • pthread_kill(): послать сигнал потоку;

    • sigpending(): изучить ожидающие функции;

    • sigwait(): ожидание сигнала;

    • sigwaitinfo(): ожидание сигнала, возвращая подробную информацию о нем;

    • sigtimedwait(): как sigwaitinfo(), но с тайм-аутом.

  • Обработчик сигналов записывает номер сигнала в виде одного байта вместо байта nul в дескриптор файла пробуждения. Таким образом, можно ожидать более одного сигнала и знать, какие сигналы были вызваны.

  • signal.signal() и signal.siginterrupt() вызывают OSError, а не RuntimeError: OSError имеет атрибут errno.

smtpd

Модуль smtpd теперь поддерживает RFC 5321 (расширенный SMTP) и RFC 1870 (расширение размера). Согласно стандарту, эти расширения включаются тогда и только тогда, когда клиент инициирует сессию командой EHLO.

(Первоначальная ELHO поддержка Альберто Тревино. Расширение размера - Юхана Яухиайнен. Существенный дополнительный вклад в работу над патчем внесли Микеле Орру и Дэн Босвелл. bpo-8739)

smtplib

Классы SMTP, SMTP_SSL и LMTP теперь принимают аргумент source_address с ключевым словом, чтобы указать (host, port) для использования в качестве адреса источника в вызове bind при создании исходящего сокета. (Внесено Пауло Скардином в bpo-11281).

SMTP теперь поддерживает протокол управления контекстом, позволяя использовать экземпляр SMTP в операторе with. (Внесено Джампаоло Родола в bpo-11289).

Конструктор SMTP_SSL и метод starttls() теперь принимают параметр SSLContext для управления параметрами защищенного канала. (Внесено Касуном Хератом в bpo-8809).

розетка

  • Класс socket теперь раскрывает дополнительные методы для обработки вспомогательных данных, если это поддерживается базовой платформой:

    (Внесено Дэвидом Уотсоном в bpo-6560, основано на более раннем исправлении Хейко Вундрама)

  • Класс socket теперь поддерживает семейство протоколов PF_CAN (https://en.wikipedia.org/wiki/Socketcan), в Linux (https://lwn.net/Articles/253425).

    (Внесено Маттиасом Фуксом, обновлено Тиаго Гонсалвесом в bpo-10141).

  • Класс socket теперь поддерживает семейство протоколов PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets и https://oss.oracle.com/projects/rds/).

  • Класс socket теперь поддерживает семейство протоколов PF_SYSTEM на OS X. (Внесено Майклом Годербауэром в bpo-13777).

  • Новая функция sethostname() позволяет устанавливать имя хоста на unix-системах, если вызывающий процесс обладает достаточными привилегиями. (Внесено Россом Лагерволлом в bpo-10866).

socketserver

BaseServer теперь имеет переопределяемый метод service_actions(), который вызывается методом serve_forever() в цикле обслуживания. ForkingMixIn теперь использует его для очистки зомбированных дочерних процессов. (Внесено Джастином Варкентином из bpo-11109).

sqlite3

Новый метод sqlite3.Connection set_trace_callback() может быть использован для захвата трассировки всех sql-команд, обрабатываемых sqlite. (Внесено Торстеном Ландшоффом в bpo-11688).

ssl

  • Модуль ssl имеет две новые функции генерации случайных чисел:

    • RAND_bytes(): генерировать криптографически сильные псевдослучайные байты.

    • RAND_pseudo_bytes(): генерировать псевдослучайные байты.

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

  • Модуль ssl теперь раскрывает более тонкую иерархию исключений, чтобы облегчить проверку различных видов ошибок. (Внесено Антуаном Питру в bpo-11183).

  • load_cert_chain() теперь принимает аргумент пароль, который будет использоваться, если закрытый ключ зашифрован. (Внесено Адамом Симпкинсом в bpo-12803).

  • Обмен ключами Диффи-Хеллмана, как обычный, так и на основе эллиптической кривой, теперь поддерживается методами load_dh_params() и set_ecdh_curve(). (Вклад Антуана Питру в bpo-13626 и bpo-13627).

  • В сокетах SSL появился новый метод get_channel_binding(), позволяющий реализовать некоторые механизмы аутентификации, такие как SCRAM-SHA-1-PLUS. (Внесено Яцеком Конечны в bpo-12551).

  • Вы можете запросить алгоритм сжатия SSL, используемый сокетом SSL, благодаря новому методу compression(). Новый атрибут OP_NO_COMPRESSION может быть использован для отключения сжатия. (Внесено Антуаном Питру в bpo-13634).

  • Добавлена поддержка расширения Next Protocol Negotiation с использованием метода ssl.SSLContext.set_npn_protocols(). (Внесено Колином Марком в bpo-14204).

  • Ошибки SSL теперь легче интроспектировать благодаря атрибутам library и reason. (Внесено Антуаном Питру в bpo-14837.)

  • Функция get_server_certificate() теперь поддерживает IPv6. (Внесено Шарлем-Франсуа Натали в bpo-11811).

  • Новый атрибут OP_CIPHER_SERVER_PREFERENCE позволяет настроить серверные сокеты SSLv3 на использование предпочтения упорядочивания шифров сервера, а не клиента (bpo-13635).

статистика

Недокументированная функция tarfile.filemode была перемещена в stat.filemode(). Она может использоваться для преобразования режима файла в строку вида „-rwxrwxrwx“.

(Внесено Джампаоло Родола в bpo-14807).

struct

Модуль struct теперь поддерживает ssize_t и size_t с помощью новых кодов n и N соответственно. (Внесено Антуаном Питру в bpo-3163).

подпроцесс

Командные строки теперь могут быть объектами байтов на платформах posix. (Внесено Виктором Стиннером в bpo-8513).

Новая константа DEVNULL позволяет подавлять вывод в независимой от платформы манере. (Внесено Россом Лагерволлом в bpo-5870).

sys

Модуль sys имеет новый thread_info named tuple, содержащий информацию о реализации потока (bpo-11223).

tarfile

tarfile теперь поддерживает кодировку lzma через модуль lzma. (Внесено Ларсом Густебелем в bpo-5689).

tempfile

Метод tempfile.SpooledTemporaryFile's truncate() теперь принимает параметр size. (Внесено Райаном Келли в bpo-9957).

textwrap

Модуль textwrap имеет новый indent(), который позволяет добавлять общий префикс к выбранным строкам в блоке текста (bpo-13857).

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

threading.Condition, threading.Semaphore, threading.BoundedSemaphore, threading.Event и threading.Timer, которые раньше были фабричными функциями, возвращающими экземпляр класса, теперь являются классами и могут быть подклассами. (Внесено Éric Araujo в bpo-10968).

Конструктор threading.Thread теперь принимает аргумент с ключевым словом daemon, чтобы переопределить поведение по умолчанию - наследование значения флага daemon от родительского потока (bpo-6064).

Ранее частная функция _thread.get_ident теперь доступна как публичная функция threading.get_ident(). Это устраняет несколько случаев прямого доступа к модулю _thread в stdlib. Код сторонних разработчиков, использующий _thread.get_ident, должен быть также изменен для использования нового публичного интерфейса.

время

Модуль PEP 418 добавил новые функции в модуль time:

  • get_clock_info(): Получить информацию о часах.

  • monotonic(): Монотонные часы (не могут идти назад), на них не влияют обновления системных часов.

  • perf_counter(): Счетчик производительности с максимальным доступным разрешением для измерения короткой длительности.

  • process_time(): Сумма системного и пользовательского процессорного времени текущего процесса.

Другие новые функции:

Для улучшения межплатформенной совместимости sleep() теперь выдает ошибку ValueError при передаче отрицательного значения sleep. Ранее это было ошибкой на posix, но приводило к бесконечному сну на Windows.

типы

Добавьте новый класс types.MappingProxyType: Прокси отображения только для чтения. (bpo-14386)

Новые функции types.new_class() и types.prepare_class() обеспечивают поддержку PEP 3115 совместимого динамического создания типов. (bpo-14588)

unittest

assertRaises(), assertRaisesRegex(), assertWarns() и assertWarnsRegex() теперь принимают аргумент ключевого слова msg при использовании в качестве менеджеров контекста. (Вклад Эцио Мелотти и Уинстона Эверта в bpo-10775).

unittest.TestCase.run() теперь возвращает объект TestResult.

urllib

Класс Request теперь принимает аргумент method, используемый get_method() для определения того, какой метод HTTP должен быть использован. Например, это отправит 'HEAD' запрос:

>>> urlopen(Request('https://www.python.org', method='HEAD'))

(bpo-1673007)

веб-браузер

Модуль webbrowser поддерживает больше «браузеров»: Google Chrome (названный chrome, chromium, chrome-browser или chromium-browser в зависимости от версии и операционной системы), а также общие пусковые установки xdg-open из проекта FreeDesktop.org и gvfs-open, который является обработчиком URI по умолчанию в GNOME 3. (Первая была внесена Арно Кальметтом в bpo-13620, вторая - Маттиасом Клозе в bpo-14493).

xml.etree.ElementTree

Модуль xml.etree.ElementTree теперь по умолчанию импортирует свой C-ускоритель; больше нет необходимости явно импортировать xml.etree.cElementTree (этот модуль остался для обратной совместимости, но теперь устарел). Кроме того, семейство методов iter из Element было оптимизировано (переписано на C). Документация модуля также была значительно улучшена за счет добавления примеров и более подробного справочника.

zlib

Новый атрибут zlib.Decompress.eof позволяет отличить правильно сформированный сжатый поток от неполного или усеченного. (Внесено Nadeem Vawda в bpo-12646.)

Новый атрибут zlib.ZLIB_RUNTIME_VERSION сообщает строку версии основной библиотеки zlib, которая загружается во время выполнения. (Внесен Торстеном Ландшоффом в bpo-12306).

Оптимизации

Добавлены значительные улучшения производительности:

  • Благодаря PEP 393 были оптимизированы некоторые операции над строками Unicode:

    • объем памяти делится на 2 - 4 в зависимости от текста

    • кодировать строку ASCII в UTF-8 больше не нужно кодировать символы, представление UTF-8 используется совместно с представлением ASCII

    • оптимизирован кодировщик UTF-8

    • повторение одной буквы ASCII и получение подстроки строки ASCII в 4 раза быстрее

  • UTF-8 теперь работает в 2-4 раза быстрее. Кодирование UTF-16 теперь происходит в 10 раз быстрее.

    (При участии Сергея Сторчака, bpo-14624, bpo-14738 и bpo-15026).

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

Изменения в процессе сборки Python и в C API включают:

Утративший силу

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

OS/2 и VMS больше не поддерживаются из-за отсутствия сопровождающего.

Платформы Windows 2000 и Windows, установившие значение COMSPEC в command.com, больше не поддерживаются в связи с необходимостью технического обслуживания.

Поддержка OSF, которая была устаревшей в версии 3.2, была полностью удалена.

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

Устаревшие функции и типы API языка C

Тип Py_UNICODE был устаревшим PEP 393 и будет удален в Python 4. Все функции, использующие этот тип, устарели:

Функции и методы Unicode, использующие типы Py_UNICODE и Py_UNICODE*:

Функции и макросы, манипулирующие строками Py_UNICODE*:

Кодирующие устройства:

Устаревшие функции

Код формата array модуля 'u' теперь устарел и будет удален в Python 4 вместе с остальной частью API (Py_UNICODE).

Перенос на Python 3.3

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

Перенос кода Python

  • Рандомизация хэша включена по умолчанию. Установите переменную окружения PYTHONHASHSEED в значение 0, чтобы отключить рандомизацию хэша. См. также метод object.__hash__().

  • bpo-12326: В Linux sys.platform больше не содержит основную версию. Теперь это всегда „linux“, вместо „linux2“ или „linux3“ в зависимости от версии Linux, используемой для сборки Python. Замените sys.platform == „linux2“ на sys.platform.startswith(„linux“), или непосредственно sys.platform == „linux“, если вам не нужна поддержка старых версий Python.

  • bpo-13847, bpo-14180: time и datetime: OverflowError теперь выдается вместо ValueError, если временная метка выходит за пределы диапазона. OSError теперь выдается, если функции Си gmtime() или localtime() не сработали.

  • Поисковики по умолчанию, используемые при импорте, теперь используют кэш того, что содержится в определенном каталоге. Если вы создаете исходный файл Python или файл байткода без источников, обязательно вызовите importlib.invalidate_caches(), чтобы очистить кэш для того, чтобы программа поиска заметила новый файл.

  • ImportError теперь использует полное имя модуля, который пытались импортировать. Тесты, проверяющие сообщение ImportErrors, должны быть обновлены, чтобы использовать полное имя модуля, а не только хвост имени.

  • Аргумент index в __import__() теперь по умолчанию равен 0, а не -1, и больше не поддерживает отрицательные значения. По недосмотру при реализации PEP 328 значение по умолчанию оставалось равным -1. Если вам нужно продолжать выполнять относительный импорт, за которым следует абсолютный импорт, то выполните относительный импорт, используя индекс 1, а затем другой импорт, используя индекс 0. Предпочтительнее, однако, использовать importlib.import_module(), а не вызывать __import__() напрямую.

  • __import__() больше не позволяет использовать значение индекса, отличное от 0, для модулей верхнего уровня. Например, __import__('sys', level=1) теперь является ошибкой.

  • Поскольку sys.meta_path и sys.path_hooks теперь по умолчанию содержат искатели, вы, скорее всего, захотите использовать list.insert() вместо list.append() для добавления в эти списки.

  • Поскольку None теперь вставляется в sys.path_importer_cache, если вы удаляете записи в словаре путей, не имеющих искателя, вам нужно будет удалить ключи, сопряженные со значениями None и imp.NullImporter, чтобы обеспечить обратную совместимость. Это приведет к дополнительным накладным расходам в старых версиях Python, которые повторно вставляют None в sys.path_importer_cache, где это представляет использование неявных искателей, но семантически это ничего не должно изменить.

  • importlib.abc.Finder больше не указывает абстрактный метод find_module(), который должен быть реализован. Если вы полагались на то, что подклассы реализуют этот метод, убедитесь сначала в его существовании. Однако в случае работы с path entry finders вы, вероятно, захотите сначала проверить наличие find_loader().

  • pkgutil был преобразован для внутреннего использования importlib. Это устраняет множество крайних случаев, когда старое поведение эмуляции импорта PEP 302 не соответствовало поведению реальной системы импорта. Сама эмуляция импорта все еще присутствует, но уже устарела. Функции pkgutil.iter_importers() и pkgutil.walk_packages() являются специальным случаем стандартных крючков импорта, поэтому они все еще поддерживаются, даже если они не предоставляют нестандартный метод iter_modules().

  • Давняя ошибка в соответствии с RFC (bpo-1079) в разборе, выполняемом email.header.decode_header(), была исправлена. Код, использующий стандартную идиому для преобразования кодированных заголовков в юникод (str(make_header(decode_header(h))), не увидит никаких изменений, но код, просматривающий отдельные кортежи, возвращаемые decode_header, увидит, что пробельные символы, предшествующие или следующие за секциями ASCII, теперь включаются в секцию ASCII. Код, который строит заголовки, используя make_header, также должен продолжать работать без изменений, поскольку make_header продолжает добавлять пробельные символы между ASCII и не``ASCII`` секциями, если они еще не присутствуют во входных строках.

  • email.utils.formataddr() теперь правильно передает кодировку при передаче не``ASCII`` отображаемых имен. Любой код, зависящий от предыдущего ошибочного поведения, которое сохраняло не``ASCII`` юникод в форматированной выходной строке, должен быть изменен (bpo-1690608).

  • poplib.POP3.quit() теперь может вызывать ошибки протокола, как и все остальные методы poplib. Код, предполагающий, что quit не вызывает ошибок poplib.error_proto, может потребовать изменений, если ошибки quit встречаются в конкретном приложении (bpo-11291).

  • Аргумент strict в email.parser.Parser, устаревший с Python 2.4, наконец-то был удален.

  • Устаревший метод unittest.TestCase.assertSameElements был удален.

  • Устаревшая переменная time.accept2dyear была удалена.

  • Устаревший атрибут Context._clamp был удален из модуля decimal. Ранее он был заменен публичным атрибутом clamp. (См. bpo-8540.)

  • Недокументированный внутренний вспомогательный класс SSLFakeFile был удален из smtplib, поскольку его функциональность уже давно обеспечивается непосредственно socket.socket.makefile().

  • Передача отрицательного значения в time.sleep() в Windows теперь вызывает ошибку вместо вечного сна. На posix это всегда приводило к ошибке.

  • Константа ast.__version__ была удалена. Если вам необходимо принимать решения, на которые влияет версия AST, используйте sys.version_info для принятия решения.

  • Код, который раньше обходил тот факт, что модуль threading использует фабричные функции путем подклассификации частных классов, должен будет измениться, чтобы подклассифицировать теперь публичные классы.

  • Недокументированные механизмы отладки в модуле потоков были удалены, что упростило код. Это не должно повлиять на производственный код, но упомянуто здесь на случай, если с ним взаимодействовали отладочные механизмы приложений (bpo-13550).

Перенос кода на языке Си

  • В ходе изменений в API буфера был удален недокументированный член smalltable структуры Py_buffer и изменено расположение PyMemoryViewObject.

    Все расширения, полагающиеся на соответствующие части в memoryobject.h или object.h, должны быть перестроены.

  • В связи с PEP 393 тип Py_UNICODE и все функции, использующие этот тип, устарели (но останутся доступными по крайней мере в течение пяти лет). Если вы использовали низкоуровневые Unicode API для построения и доступа к объектам Юникода и хотите воспользоваться преимуществами сокращения объема памяти, обеспечиваемого PEP 393, вам необходимо преобразовать свой код в новый Unicode API.

    Однако если вы использовали только функции высокого уровня, такие как PyUnicode_Concat(), PyUnicode_Join() или PyUnicode_FromFormat(), ваш код будет автоматически использовать преимущества новых юникодовых представлений.

  • PyImport_GetMagicNumber() теперь возвращает -1 при неудаче.

  • Поскольку отрицательное значение для аргумента level в __import__() больше недействительно, то же самое теперь справедливо и для PyImport_ImportModuleLevel(). Это также означает, что значение level, используемое PyImport_ImportModuleEx(), теперь 0 вместо -1.

Пристройки здания C

  • Диапазон возможных имен файлов для расширений C был сужен. Очень редко используемые написания были подавлены: согласно POSIX, файлы с именами xxxmodule.so, xxxmodule.abi3.so и xxxmodule.cpython-*.so больше не распознаются как реализующие модуль xxx. Если вы генерировали такие файлы, вам необходимо перейти на другие написания (т.е. удалить строку module из имен файлов).

    (реализовано в bpo-14040).

Изменения в переключателях командной строки

  • Флаг командной строки -Q и связанные с ним артефакты были удалены. Код, проверяющий sys.flags.division_warning, потребует обновления.

    (bpo-10998, предоставлено Éric Araujo.)

  • Когда python запускается с -S, import site больше не будет добавлять пути, специфичные для сайта, в пути поиска модулей. В предыдущих версиях это происходило.

    (bpo-11591, предоставлено Карлом Мейером и отредактировано Эриком Араужо).

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