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

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

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

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

  • Ускоритель C для модуля 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 была значительно улучшена.

Новая реализация memoryview полностью исправляет все проблемы с владением и временем жизни динамически выделяемых полей в структуре 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, никаких отрицательных моментов в этом изменении быть не должно.

Что касается API на языке C, то 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 launcher, которое можно использовать для запуска приложений 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 написан Марком Хаммондом и Мартином в. Лёвисом; реализация - Винаем Саджипом.

Документация по лаунчеру: Python Launcher для Windows

Модификация 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 - Переработка иерархии исключений ОС и ввода-вывода

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 409 - Подавление контекста исключения

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

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

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

См.также

PEP 414 - Явные литералы Юникода

Автор сценария 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. Это изменение имеет множество преимуществ. Во-первых, это позволило раскрыть больше механизмов, обеспечивающих импорт, вместо того чтобы они были неявными и скрытыми в коде C. Кроме того, это обеспечивает единую реализацию для всех ВМ 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(), ljust() и center() из bytes и bytearray теперь принимают bytearray для аргумента fill. (Внесено Петри Лехтиненом в bpo-12380).

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

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

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

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

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

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

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

Более тонкая блокировка импорта

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

В 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

Строки Юникода только 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 теперь реализует все io.BufferedIOBase API, за исключением методов 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 теперь обеспечивает прочную основу для программного манипулирования менеджерами контекста и подобной функциональности очистки. В отличие от предыдущего contextlib.nested API (который был устаревшим и удален), новый API предназначен для корректной работы независимо от того, получают ли менеджеры контекста свои ресурсы в своем __init__ методе (например, файловые объекты) или в своем __enter__ методе (например, объекты синхронизации из модуля threading).

(bpo-13585)

крипта

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

(bpo-10924)

проклятия

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

  • Используйте кодировку локали вместо utf-8 для кодирования строк Юникода.

  • У curses.window появился новый атрибут curses.window.encoding.

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

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

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

datetime

  • Сравнение равенства между наивными и осведомленными экземплярами 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

_decimal

ускорение

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() устарел.

e-mail

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

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

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

max_line_length

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

lineep

Символ, используемый для разделения отдельных строк при сериализации 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 для заголовков

Хотя фреймворк политик достоин сам по себе, основная мотивация его введения заключается в том, чтобы позволить создавать новые политики, реализующие новые возможности почтового пакета, таким образом, чтобы сохранить обратную совместимость для тех, кто не использует новые политики. Поскольку новые политики вводят новый API, мы выпускаем их в Python 3.3 в виде 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, используя локальное 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).

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

imaplib

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

(Предоставлено Sijin Joseph в bpo-8808).

осмотреть

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

(При участии Меадора Инге и Ника Коглана в bpo-13062).

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

(Предоставлено Meador Inge в 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')
>>>

(Предоставлено Giampaolo Rodolà в 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(), но распространяясь на все процессы, а не только на текущий.

    (Патч прислал Джампаоло Родола в 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.

(Предоставлено Serhiy Storchaka в bpo-3665).

расписание

  • run() теперь принимает параметр blocking, который при установке значения 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() правильно экранирует все символы в строке, которым оболочка может придать особое значение.

ШУТИЛ

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

    • 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).

сокетсервер

У 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“.

(Предоставлено Giampaolo Rodolà в 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 при передаче отрицательного значения сна. Ранее это было ошибкой на 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 позволяет отличить правильно сформированный сжатый поток от неполного или усеченного. (Внесено Надимом Вавдой в bpo-12646).

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

Оптимизации

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

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

    • объем памяти делится на 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).

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

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

Утратившие актуальность

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

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

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

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

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

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

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

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

Функции и макросы для работы со строками Py_UNICODE*:

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

Утраченные функции

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

Переход на 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 теперь вызывается, если функции C 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, если вы очищаете записи в словаре путей, у которых нет finder, вам нужно будет удалить ключи, сопряженные со значениями 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().

  • Давняя ошибка (bpo-1079) в разборе, выполняемом email.header.decode_header() в соответствии с RFC, была исправлена. Код, использующий стандартную идиому для преобразования кодированных заголовков в юникод (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 использовал фабричные функции, подклассифицируя приватные классы, должен будет измениться, чтобы подклассифицировать теперь публичные классы.

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

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

  • В ходе изменений в 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, предоставлено Карлом Мейером и отредактировано Эриком Араужо).