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

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

См.также

PEP 398 — Расписание релиза Python 3.3

Резюме. Основные моменты релиза

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

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

  • faulthandler (помогает отлаживать низкоуровневые сбои)
  • ipaddress (высокоуровневые объекты, представляющие IP-адреса и маски)
  • lzma (сжимать данные по алгоритму XZ/LZMA)
  • unittest.mock (замена части тестируемой системы мок объектами)
  • venv (Python виртуальные среды, как в популярном пакете virtualenv)

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

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

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

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

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

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

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: новая реализация memoryview и документация по протоколу буфера

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

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

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

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

Возможности

  • Теперь поддерживаются все собственные спецификаторы односимвольного формата в синтаксисе модуля struct (необязательно с префиксом «@»).
  • С некоторыми ограничениями метод cast() позволяет изменять формат и форму C-непрерывных массивов.
  • Представления многомерного списка поддерживаются для любого типа массива.
  • Многомерные сравнения поддерживаются для любого типа массива.
  • Одномерные представления памяти хешируемых (только для чтения) типов с форматами B, b или c теперь хэшируются. (Предоставлено Антуаном Питру в bpo-13411.)
  • Поддерживается произвольная нарезка любого типа одномерных массивов. Например, теперь можно перевернуть memoryview за O(1), используя отрицательный шаг.

Изменения API

  • Максимальное количество измерений официально ограничено 64.
  • Представление пустой формы, шагов и подсмещений теперь представляет собой пустой кортеж вместо None.
  • Доступ к элементу memoryview в формате «B» (беззнаковые байты) теперь возвращает целое число (в соответствии с синтаксисом модуля struct). Для возврата объекта bytes представление должно быть сначала приведено к «c».
  • сравнения memoryview теперь используют логическую структуру операндов и сравнивают все элементы массива по значению. Поддерживаются все строки формата в синтаксисе модуля struct. Представления с нераспознанными строками формата по-прежнему разрешены, но всегда будут сравниваться как неравные, независимо от содержимого представления.
  • Дополнительные сведения об изменениях см. в статьях Изменения сборки и C API и Портирование C-кода.

(Предоставлено Стефаном Крахом в bpo-10181.)

См.также

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

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

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

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

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

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

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

  • Теперь Python всегда поддерживает весь диапазон кодовых точек Юникод, в том числе не-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 для обратной совместимости, и её не следует использовать с новым Юникод API (см. bpo-13054).
  • Флаг ./configure --with-wide-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 для 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 для Windows
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 отсутствует")
    elif err.errno in (EACCES, EPERM):
        print("Вам не разрешено читать document.txt")
    else:
        raise

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

try:
    with open("document.txt") as f:
        content = f.read()
except FileNotFoundError:
    print("Файл document.txt отсутствует")
except PermissionError:
    print("Вам не разрешено читать document.txt")

См.также

PEP 3151 — Переработка иерархии исключений ОС и ввода-вывода
PEP написан и реализован Антуаном Питру

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

PEP 380 добавляет выражение yield from, позволяя генератору делегировать часть своих операций другому генератору. Это позволяет выделить часть кода, содержащую 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)  # Убедитесь, что аккумулятор готов к приёму значений
>>> for i in range(4):
...     acc.send(i)
...
>>> acc.send(None)  # Закончить первый подсчёт
>>> for i in range(5):
...     acc.send(i)
...
>>> acc.send(None)  # Закончить второй подсчёт
>>> 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'

Во время обработки вышеупомянутого исключения произошло другое исключение:

Traceback (последний последний вызов):
  Файл «<stdin>», строка 1, в <module>
  Файл «<stdin>», строка 8, в __getattr__
  Ошибка атрибута: x

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

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

См.также

PEP 409 — Подавление контекста исключения
PEP, написанный Итаном Фурманом; реализован Итаном Фурманом и Ником Когланом.

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

Чтобы упростить переход с 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 в качестве реализации Import

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

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

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

Новые API

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

Абстрактные базовые классы, определённые в importlib.abc, были расширены для правильного разграничения между поисковиком мета-пути и поисковиком пути входа путём введения 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, чтобы при необходимости очистить любое сохраненное состояние.

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

Возможные необходимые изменения кода см. в разделе Портирование Python кода.

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

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

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

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

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

(Реализация Бретта Кэннона)

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

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

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

    (Предоставлено Эцио Мелотти в bpo-12753.)

  • База данных Юникод обновлена до версии 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 истинен, поток принудительно сбрасывается.
  • 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

Модуль 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 своего конструктора.

    (Предоставлено Надимом Вавдой в bpo-5863.)

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

    (Предоставлено Ниром Эйдесом в bpo-1625.)

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

codecs

Кодек 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 устарел.

collections

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

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

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

contextlib

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

(bpo-13585)

crypt

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

(bpo-10924)

curses

  • Если модуль curses связан с библиотекой ncursesw, используйте функции Юникод, когда передаются строки или символы Юникод (например, waddwstr()), и байтовые функции в противном случае (например, 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 в системный часовой пояс.

decimal

bpo-7652 — интеграция быстрой десятичной арифметики.
C-модуль и libmpdec написаны Стефан Кра.

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

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

Следующая таблица предназначена для иллюстрации. Контрольные показатели доступны по адресу.

  decimal.py _decimal speedup
pi 42.02s 0.345s 120x
telco 172.19s 5.68s 30x
psycopg 3.57s 0.29s 12x

Возможности

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

Изменения API

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

      32-bit 64-bit
    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(), чтобы получить округленное или неточное значение.

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

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

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

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

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

email

Фреймворк Политики

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

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

max_line_length Максимальная длина, за исключением символа (символов) переноса строки. У отдельных строк может быть, когда Message сериализуемый. По умолчанию 78.
linesep Символ, используемый для разделения отдельных строк, когда Message сериализуемый. По умолчанию \n.
cte_type 7bit или 8bit. 8bit применяется только к Bytes generator и означает, что не-ASCII может использоваться там, где это разрешено протоколом (или там, где он существует в исходном вводе).
raise_on_defect Заставляет parser вызывать ошибку, когда есть дефекты встречаются вместо добавления их в Message список объектов defects.

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

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

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

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

Хотя структура политик полезна сама по себе, основная причина её внедрения — разрешить создание новых политик, которые реализуют новые функции для пакета email таким образом, чтобы поддерживать обратную совместимость для тех, кто не использует новые политики. Поскольку новые политики вводят новый API, мы выпускаем их в Python 3.3 как предварительный пакет. Обратно несовместимые изменения (вплоть до удаления кода) могут быть внесены, если основные разработчики сочтут это необходимым.

Новые политики являются экземплярами 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 <[email protected]>'
>>> m['to']
'Éric <[email protected]>'
>>> 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?= <[email protected]>
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='[email protected]')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <[email protected]>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <[email protected]>, Sally <[email protected]>;, Bonzo <[email protected]>

Декодирование в Юникода выполняется автоматически:

>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <[email protected]>'

При парсинге сообщения можно использовать атрибуты 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'),))

Таким образом, если вы используете одну из новых политик, манипулирование заголовками работает так, как должно: ваше приложение работает с Юникод строками, а пакет email прозрачно кодирует и декодирует Юникод в RFC стандартные кодировки передачи контента и обратно.

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

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

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

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

ftplib

  • ftplib.FTP теперь принимает ключевой аргумент source_address, чтобы указать (host, port) для использования в качестве исходного адреса в вызове привязки при создании исходящего сокета. (Предоставлено Джампаоло Родола в 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 с эквивалентными Юникод символами (например, html5['gt;'] == '>'). Словарь теперь также используется HTMLParser. (Предоставлено Эцио Мелотти в bpo-11113 и bpo-15156.)

imaplib

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

(Предоставлено Сидзином Джозефом в bpo-8808.)

inspect

Добавлена новая функция 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 для предоставления пользовательской двоичной функции.

logging

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

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

math

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

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

mmap

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

multiprocessing

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

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

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

pickle

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

(Предоставлено Ричардом Оудкерком в bpo-14166.)

pydoc

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

re

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

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

sched

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

select

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: когда данный параметр имеет значение истина, символические ссылки не разыменовываются, а вместо этого операция воздействует на саму символическую ссылку (или создаёт её, если необходимо). (Предоставлено Хайнеком Шлаваком в bpo-12715.)
  • При копировании файлов в другую файловую систему move() теперь обрабатывает символические ссылки так же, как это делает posix команда mv, воссоздавая символическую ссылку, а не копируя содержимое целевого файла. (Предоставлено Джонатаном Нихофом в bpo-9993.) move() теперь также возвращает аргумент dst в качестве результата.
  • rmtree() теперь устойчив к атакам по символическим ссылкам на платформах, поддерживающих новый параметр dir_fd в os.open() и os.unlink(). (Предоставлено Мартином фон Лёвисом и Хайнеком Шлаваком в bpo-4489.)

signal

  • Модуль signal имеет новые функции:
    • pthread_sigmask(): выборка и/или изменение маски сигнала вызывающего потока (предоставил Жан-Поль Кальдероне в bpo-8407);
    • pthread_kill(): отправить сигнал потоку;
    • sigpending(): проверить ожидающие выполнения функции;
    • sigwait(): ждать сигнала;
    • sigwaitinfo(): ждать сигнала, возвращая подробную информацию о нем;
    • sigtimedwait(): как sigwaitinfo(), но с тайм-аутом.
  • Обработчик сигнала записывает номер сигнала в виде одного байта вместо нулевого байта в дескриптор файла пробуждения. Таким образом, можно дождаться более одного сигнала и узнать, какие сигналы были вызваны.
  • 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) для использования в качестве исходного адреса в вызове привязки при создании исходящего сокета. (Предоставлено Пауло Скардином в bpo-11281.)

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

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

socket

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

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

  • Класс socket теперь поддерживает семейство протоколов PF_CAN в Linux <https://lwn.net/Articles/253425>.

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

  • Класс socket теперь поддерживает семейство протоколов PF_RDS и 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() теперь принимает аргумент password, который следует использовать, если закрытый ключ зашифрован. (Предоставлено Адамом Симпкинсом в 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).

stat

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

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

struct

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

subprocess

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

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

sys

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

tarfile

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

tempfile

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

textwrap

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

threading

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

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

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

time

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

  • get_clock_info(): получить информацию о часах.
  • monotonic(): монотонные часы (не могут идти назад), на них не влияют обновления системных часов.
  • perf_counter(): счётчик производительности с самым высоким доступным разрешением для кратковременного измерения.
  • process_time(): сумма системного и пользовательского процессорного времени текущего процесса.

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

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

types

Добавлен новый класс 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://digitology.tech', method='HEAD'))

(bpo-1673007)

webbrowser

Модуль webbrowser поддерживает больше «браузеров»: Google Chrome (с именами chrome, chromium, chrome-browser или chromium-browser в зависимости от версии и операционной системы), а также общие средства запуска xdg-open из проекта FreeDesktop и gvfs-open, который является URI по умолчанию обработчиком для GNOME 1. (Первый предоставлен Арно Кальметтесом в 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

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

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

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

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

Кодировщики:

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

Код формата 'u' модуля array теперь устарел и будет удалён в 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, если вы очищаете записи в словаре путей, у которых нет поисковика, вам нужно удалить ключи в паре со значениями None а также imp.NullImporter для обеспечения обратной совместимости. Это приведёт к дополнительным накладным расходам в более старых версиях Python, которые повторно вставляют None в sys.path_importer_cache, где это представляет использование неявных средств поиска, но семантически это ничего не должно изменить.
  • importlib.abc.Finder больше не указывает абстрактный метод find_module(), который должен быть реализован. Если вы полагались на подклассы для реализации этого метода, обязательно сначала проверьте существование метода. Вы, вероятно, захотите сначала проверить 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 использовал фабричные функции путём создания подклассов частных классов, необходимо изменить на подкласс общедоступных классов.
  • Недокументированный механизм отладки в модуле threading был удалён, что упростило код. Это не должно влиять на производственный код, но упоминается здесь на случай, если с ним взаимодействовали какие-либо платформы отладки приложений (bpo-13550).

Портирование C-кода

  • В ходе изменений API-интерфейса буфера недокументированный элемент smalltable структуры Py_buffer был удалён, а макет PyMemoryViewObject был изменён.

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

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

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

  • PyImport_GetMagicNumber() теперь возвращает -1 при ошибке.

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

Сборка С расширений

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

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

Изменения опций командной строки

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

    (bpo-10998, предоставлено Эриком Араужо)

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

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