Документация Python неофициальный перевод
Содержание страницы

Что нового в Python 3.3What’s New In Python 3.3

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

См. также

PEP 398 – График выпуска Python 3.3

Итоги – основные измененияSummary – Release highlights

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

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

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

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

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

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

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

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

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

PEP 405: Виртуальные окруженияPEP 405: Virtual Environments

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

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

См. также

PEP 405 – Виртуальные окружения Python
PEP написан Carl Meyer; реализация Carl Meyer и Vinay Sajip

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

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

См. также

PEP 420 – Неявные пакеты пространства имён
PEP написан Eric V. Smith; реализация Eric V. Smith и Barry Warsaw

PEP 3118: Новая реализация memoryview и документация протокола буфераPEP 3118: New memoryview implementation and buffer protocol documentation

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

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

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

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

ВозможностиFeatures

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

Изменения APIAPI changes

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

(Автор: Stefan Krah в issue 10181.)

См. также

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

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

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

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

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

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

Изменения, введённые PEP 393, заключаются в следующем:

  • Python теперь всегда поддерживает полный диапазон кодовых точек Unicode, включая не-BMP (т.е. от U+0000 до U+10FFFF). Различие между узкой (narrow) и широкой (wide) сборками больше не существует, и 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 (см. issue 13054).
  • Флаг ./configure --with-wide-unicode был удалён.

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

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

  • строки из чистого ASCII и Latin1 (U+0000-U+00FF) используют 1 байт на кодовую точку;
  • строки BMP (U+0000-U+FFFF) используют 2 байта на кодовую точку;
  • не-BMP строки (U+10000-U+10FFFF) используют 4 байта на кодовую точку.

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

См. также

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

PEP 397: Средство запуска Python для WindowsPEP 397: Python Launcher for 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. (Автор: Brian Curtin в issue 3561.)

См. также

PEP 397 – Средство запуска Python для Windows
PEP написан Марком Хаммондом и Мартином в. Лёвисом; реализация – Винай Саджип.

Документация по средству запуска: Python Launcher for Windows

Изменение PATH установщиком: Finding the Python executable

PEP 3151: Переработка иерархии исключений ОС и ввода-выводаPEP 3151: Reworking the OS and IO exception hierarchy

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

Больше не нужно беспокоиться о выборе подходящего типа исключения между 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: Syntax for Delegating to a Subgenerator

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 - Syntax for Delegating to a Subgenerator
PEP написан Грегом Юингом; реализовано Грегом Юингом, включено в версию 3.3 Рено Бланшем, Райаном Келли и Ником Когланом; документация – Збигнев Енджеевски-Шмек и Ник Коглан

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

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: Явные литералы UnicodePEP 414: Explicit Unicode literals

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

См. также

PEP 414 – Явные литералы Unicode
PEP написан Армином Ронахером.

PEP 3155: Полное имя для классов и функцийPEP 3155: Qualified name for classes and functions

У функций и объектов классов появился новый атрибут __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 написан и реализован Antoine Pitrou.

PEP 412: Словарь с разделением ключейPEP 412: Key-Sharing Dictionary

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

См. также

PEP 412 – Словарь с разделением ключей
PEP написан и реализован Марком Шенноном.

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

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

См. также

PEP 362: – Объект сигнатуры функции
PEP написан Бреттом Кэнноном, Юрием Селивановым, Ларри Хастингсом, Дживон Со; реализован Юрием Селивановым.

PEP 421: Добавление sys.implementationPEP 421: Adding 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 в качестве реализации импортаUsing importlib as the Implementation of Import

issue 2377 - Replace __import__ w/ importlib.__import__ issue 13959 - Re-implement parts of imp in pure Python issue 14605 - Make import machinery explicit issue 14646 - Require loaders set __loader__ and __package__

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

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

Новые APINew APIs

Одно из главных преимуществ этой работы – раскрытие того, что требуется для работы оператора 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, чтобы помочь очистить любое сохранённое состояние по мере необходимости.

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

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

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

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

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

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

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

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

Прочие изменения языка Other Language Changes

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

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

    (Автор: Ezio Melotti, issue 12753.)

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

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

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

    (Автор: Petri Lehtinen, issue 12170.)

  • Методы rjust(), ljust() и center() объектов bytes и bytearray теперь принимают bytearray для аргумента fill. (Автор: Petri Lehtinen, issue 12380.)

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

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

    (Автор: Antoine Pitrou, issue 13748.)

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

    (Автор: Filip Gruszczyński, issue 13521.)

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

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

Более детальная блокировка импорта A Finer-Grained Import Lock

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

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

(Автор: Antoine Pitrou, issue 9260.)

Встроенные функции и типы Builtin functions and types

  • open() получает новый параметр opener: базовый файловый дескриптор для файлового объекта затем получается вызовом opener с (file, flags). Его можно использовать, например, для применения пользовательских флагов, таких как os.O_CLOEXEC. Был добавлен режим 'x': открытие для эксклюзивного создания, с ошибкой, если файл уже существует.
  • print(): добавлен именованный аргумент flush. Если flush равен true, поток принудительно сбрасывается.
  • hash(): рандомизация хеша включена по умолчанию; см. object.__hash__() и PYTHONHASHSEED.
  • Тип str получает новый метод casefold(): возвращает свернутую по регистру копию строки; свернутые строки могут использоваться для сравнения без учёта регистра. Например, 'ß'.casefold() возвращает 'ss'.
  • Документация по последовательностям была существенно переписана, чтобы лучше объяснить различие между двоичными и текстовыми последовательностями и предоставить отдельные разделы документации для каждого встроенного типа последовательностей (issue 4966).

Новые модулиNew Modules

faulthandler

Этот новый модуль отладки faulthandler содержит функции для явного дампа трассировок Python при ошибке (сбое, таком как segmentation fault), по тайм-ауту или по сигналу пользователя. Вызовите 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.

(Авторы: Nadeem Vawda и Per Øyvind Karlsen, issue 6715.)

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

abc

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

(Автор: Darren Dale в issue 11610.)

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

array

Модуль array поддерживает тип long long с помощью кодов типа q и Q.

(Авторы: Oren Tirosh и Hirokazu Yamamoto в issue 1172711.)

base64

Функции декодирования современного интерфейса модуля base64 теперь принимают строки Unicode, содержащие только ASCII. Например, base64.b64decode('YWJj') возвращает b'abc'. (Автор: Catalin Iacob в issue 13641.)

binascii

Помимо двоичных объектов, которые они обычно принимают, функции a2b_ теперь также принимают на вход строки, содержащие только ASCII. (Автор: Antoine Pitrou в issue 13637.)

bz2

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

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

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

    (Автор: Nadeem Vawda в issue 5863.)

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

    (Автор: Nir Aides в issue 1625.)

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

codecs

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

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

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

(issue 12016)

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

$ ./python -q
>>> 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.'

В более старых версиях Python этот пример даёт b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'.

(issue 12100)

Кодек unicode_internal устарел.

collections

Добавлен новый класс ChainMap, позволяющий рассматривать несколько отображений как единое целое. (Написан Raymond Hettinger для issue 11089, опубликован в issue 11297.)

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

Класс Counter теперь поддерживает унарные операторы + и -, а также операторы с присваиванием +=, -=, |= и &=. (Автор: Raymond Hettinger в issue 13121.)

contextlib

ExitStack now provides a solid foundation for programmatic manipulation of context managers and similar cleanup functionality. Unlike the previous contextlib.nested API (which was deprecated and removed), the new API is designed to work correctly regardless of whether context managers acquire their resources in their __init__ method (for example, file objects) or in their __enter__ method (for example, synchronisation objects from the threading module).

(issue 13585)

crypt

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

(issue 10924)

curses

  • Если модуль curses слинкован с библиотекой ncursesw, используйте функции Unicode, когда передаются строки или символы Unicode (например, waddwstr()), и функции для байтов в противном случае (например, waddstr()).
  • Используйте кодировку локали вместо utf-8 для кодирования строк Unicode.
  • curses.window имеет новый атрибут curses.window.encoding.
  • Класс curses.window имеет новый метод get_wch() для получения широкого символа.
  • Модуль curses имеет новую функцию unget_wch() для возврата широкого символа, чтобы следующий вызов get_wch() вернул его.

(Добавлено Iñigo Serna в issue 6755.)

datetime

  • Сравнение на равенство между наивными и осведомлёнными (aware) экземплярами datetime теперь возвращает False вместо возбуждения TypeError (issue 15006).
  • Новый метод datetime.datetime.timestamp(): возвращает POSIX-метку времени, соответствующую экземпляру datetime.
  • Метод datetime.datetime.strftime() поддерживает форматирование годов старше 1000.
  • Метод datetime.datetime.astimezone() теперь можно вызывать без аргументов для преобразования экземпляра datetime в системный часовой пояс.

decimal

issue 7652 – интеграция быстрой нативной десятичной арифметики.
C-модуль и libmpdec написаны Stefan Krah.

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

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

Приведённая ниже таблица предназначена для иллюстрации. Бенчмарки доступны по адресу http://www.bytereef.org/mpdecimal/quickstart.html.

  decimal.py _decimal ускорение
pi 42.02s 0.345s 120x
telco 172.19s 5.68s 30x
psycopg 3.57s 0.29s 12x

ВозможностиFeatures

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

Изменения APIAPI changes

  • 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() для получения округлённого или неточного значения.

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

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

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

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

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

email

Инфраструктура политикPolicy Framework

Пакет email теперь имеет инфраструктуру policy. Объект Policy – это объект с несколькими методами и свойствами, которые управляют поведением пакета email. Основной политикой для Python 3.3 является Compat32, которая обеспечивает обратную совместимость с пакетом email в Python 3.2. Политика policy может быть указана при разборе сообщения email с помощью parser, или при создании объекта Message, или при сериализации email с помощью 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 возбуждать ошибку при обнаружении дефектов, вместо добавления их в список defects объекта Message.

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

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

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

Временная политика с новым API заголовковProvisional Policy with New Header API

Хотя сама по себе структура политик (policy) представляет ценность, основная причина её введения – дать возможность создавать новые политики, реализующие новые возможности для пакета 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 <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'),))

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

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

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

Новые вспомогательные функции:

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

ftplib

  • ftplib.FTP теперь принимает именованный аргумент source_address для указания (host, port), который будет использоваться как исходный адрес в вызове bind при создании исходящего сокета. (Предложено Giampaolo Rodolà в issue 8594.)
  • Класс FTP_TLS теперь предоставляет новую функцию ccc() для возврата канала управления обратно в открытый текст. Это может быть полезно для использования межсетевых экранов, которые умеют обрабатывать NAT с небезопасным FTP без открытия фиксированных портов. (Предложено Giampaolo Rodolà в issue 12139.)
  • Добавлен метод ftplib.FTP.mlsd(), который предоставляет разбираемый формат списка каталогов и объявляет устаревшими ftplib.FTP.nlst() и ftplib.FTP.dir(). (Предложено Giampaolo Rodolà в issue 11072.)

functools

Декоратор functools.lru_cache() теперь принимает именованный аргумент typed (по умолчанию False), чтобы кэшировать значения разных типов, которые сравниваются как равные, в отдельных слотах кэша. (Предложено Raymond Hettinger в issue 13227.)

gc

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

hmac

Добавлена новая функция compare_digest() для предотвращения атак по сторонним каналам на дайджесты с помощью анализа времени выполнения. (Предложено Nick Coghlan и Christian Heimes в issue 15061.)

http

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

http.server теперь генерирует корректный HTML 4.01 strict вывод. (Предложено Ezio Melotti в issue 13295.)

http.client.HTTPResponse теперь имеет метод readinto(), что означает, что его можно использовать в качестве класса io.RawIOBase. (Предложено John Kuhn в issue 13464.)

html

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

Новый словарь html5, который отображает именованные символьные ссылки HTML5 на эквивалентные символы Unicode (например, html5['gt;'] == '>'), добавлен в модуль html.entities. Этот словарь теперь также используется HTMLParser. (Предложено Ezio Melotti в issue 11113 и issue 15156.)

imaplib

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

(Предложено Sijin Joseph в issue 8808.)

inspect

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

(Предложено Meador Inge и Nick Coghlan в issue 13062.)

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

(Предложено Meador Inge в issue 15153.)

io

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

(Предложено David Townshend в issue 12760.)

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

itertools

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

logging

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

В SysLogHandler добавлен атрибут уровня класса append_nul, позволяющий управлять добавлением байта NUL (\000) к записям syslog: для одних демонов он обязателен, а для других – передаётся в лог.

math

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

(Автор – Марк Дикинсон, issue 11888.)

mmap

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

multiprocessing

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

Объекты multiprocessing.Connection теперь можно передавать через multiprocessing-соединения. (Автор – Ричард Оудкерк, issue 4892.)

multiprocessing.Process теперь принимает именованный аргумент daemon, позволяющий переопределить стандартное поведение наследования флага daemon от родительского процесса (issue 6064).

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

Новые методы multiprocessing.pool.Pool.starmap() и starmap_async() предоставляют эквиваленты itertools.starmap() для существующих функций multiprocessing.pool.Pool.map() и map_async(). (Автор – Гинек Шлавак, issue 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')
>>>

(Автор – Джампаоло Родола, issue 9795.)

os

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

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

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

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

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

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

    (Патч предоставлен Джампаоло Родолой в issue 10784.)

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

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

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

  • Новые функции для поддержки расширенных атрибутов Linux (issue 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() (issue 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. (Автор: Victor Stinner в issue 13226.)
  • os.symlink() теперь принимает (и игнорирует) именованный аргумент target_is_directory на платформах, отличных от Windows, для упрощения кроссплатформенной поддержки.

pdb

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

(Автор: Georg Brandl в issue 14210)

pickle

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

(Автор: Richard Oudkerk в issue 14166.)

pydoc

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

re

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

(Автор: Serhiy Storchaka в issue 3665.)

sched

  • run() теперь принимает параметр blocking, который при установке в False заставляет метод выполнить запланированные события, срок которых истекает ранее всего (если такие есть), и затем немедленно вернуться. Это полезно, если требуется использовать scheduler в неблокирующих приложениях. (Автор: Giampaolo Rodolà в issue 13449.)
  • Класс scheduler теперь можно безопасно использовать в многопоточных средах. (Автор: Josiah Carlson и Giampaolo Rodolà в issue 8684.)
  • Параметры timefunc и delayfunct конструктора класса scheduler теперь являются необязательными и по умолчанию равны time.time() и time.sleep() соответственно. (Автор: Chris Clark в issue 13245.)
  • Параметр argument методов enter() и enterabs() теперь является необязательным. (Автор: Chris Clark в issue 13245.)
  • Методы enter() и enterabs() теперь принимают параметр kwargs. (Автор: Chris Clark в issue 13245.)

select

На платформах Solaris и производных появился новый класс select.devpoll для высокопроизводительных асинхронных сокетов через /dev/poll. (Автор: Jesús Cea Avión в issue 6397.)

shlex

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

shutil

  • Новые функции:
    • disk_usage(): предоставляет статистику общего, используемого и свободного дискового пространства. (Предложено Giampaolo Rodolà в issue 12442.)
    • chown(): позволяет изменить пользователя и/или группу для указанного пути, указывая также имена пользователя/группы, а не только их числовые идентификаторы. (Предложено Sandro Tosi в issue 12191.)
    • shutil.get_terminal_size(): возвращает размер окна терминала, к которому привязан интерпретатор. (Предложено Zbigniew Jędrzejewski-Szmek в issue 13609.)
  • copy2() и copystat() теперь сохраняют временные метки файлов с наносекундной точностью на платформах, которые это поддерживают. Они также сохраняют «расширенные атрибуты» файлов в Linux. (Предложено Larry Hastings в issue 14127 и issue 15238.)
  • Несколько функций теперь принимают необязательный аргумент symlinks: когда этот параметр равен true, символические ссылки не разыменовываются, и вместо этого операция выполняется над самой символьной ссылкой (или создаёт её, если это уместно). (Предложено Hynek Schlawack в issue 12715.)
  • При копировании файлов в другую файловую систему move() теперь обрабатывает символьные ссылки так же, как команда posix mv: создаёт заново символьную ссылку, а не копирует содержимое целевого файла. (Предложено Jonathan Niehof в issue 9993.) move() теперь также возвращает аргумент dst в качестве результата.
  • rmtree() теперь устойчива к атакам через символьные ссылки на платформах, поддерживающих новый параметр dir_fd в os.open() и os.unlink(). (Предложено Martin von Löwis и Hynek Schlawack в issue 4489.)

signal

  • В модуль signal добавлены новые функции:
    • pthread_sigmask(): получить и/или изменить маску сигналов вызывающего потока (Предложено Jean-Paul Calderone в issue 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 от Alberto Trevino. Расширение размера от Juhana Jauhiainen. Значительная дополнительная работа над патчем от Michele Orrù и Dan Boswell. issue 8739)

smtplib

Классы SMTP, SMTP_SSL и LMTP теперь принимают именованный аргумент source_address для указания (host, port), используемого в качестве исходного адреса при вызове bind для создания исходящего сокета. (Предложено Paulo Scardine в issue 11281.)

SMTP теперь поддерживает протокол управления контекстом, позволяя использовать экземпляр SMTP в инструкции with. (Предложено Giampaolo Rodolà в issue 11289.)

Конструктор SMTP_SSL и метод starttls() теперь принимают параметр SSLContext для управления параметрами защищённого канала. (Предложено Kasun Herath в issue 8809.)

socket

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

    (Предложено David Watson в issue 6560, на основе более раннего патча от Heiko Wundram)

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

    (Предложено Матиасом Фуксом, обновлено Тиаго Гонсалвешем в issue 10141.)

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

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

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

socketserver

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

sqlite3

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

ssl

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

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

    (Предложено Виктором Стиннером в issue 12049.)

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

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

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

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

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

  • Добавлена поддержка расширения согласования следующего протокола с помощью метода ssl.SSLContext.set_npn_protocols(). (Предложено Колином Марком в задаче 14204.)

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

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

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

stat

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

(Предложено Джампаоло Родолой в issue 14807.)

struct

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

подпроцессsubprocess

Строки команд теперь могут быть объектами bytes на платформах POSIX. (Предложено Виктором Стиннером в issue 8513.)

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

sys

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

tarfile

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

tempfile

Метод truncate() объекта tempfile.SpooledTemporaryFile теперь принимает параметр size. (Добавлено Райаном Келли в issue 9957.)

textwrap

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

threading

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

Конструктор threading.Thread теперь принимает именованный аргумент daemon, позволяющий переопределить поведение по умолчанию, при котором значение флага deamon наследуется от родительского потока (issue 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: прокси только для чтения отображения. (issue 14386)

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

unittest

assertRaises(), assertRaisesRegex(), assertWarns() и assertWarnsRegex() теперь принимают именованный аргумент msg при использовании в качестве контекстных менеджеров. (Добавлено Эцио Мелотти и Уинстоном Эвертом в issue 10775.)

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

urllib

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

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

(issue 1673007)

webbrowser

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

xml.etree.ElementTree

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

zlib

Новый атрибут zlib.Decompress.eof позволяет различать правильно сформированный сжатый поток и неполный или усечённый. (Добавлено Надимом Вавдой в issue 12646.)

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

ОптимизацииOptimizations

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

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

    • объём памяти уменьшается в 2–4 раза в зависимости от текста
    • кодирование строки ASCII в UTF-8 больше не требует кодирования символов, представление UTF-8 совпадает с представлением ASCII
    • кодировщик UTF-8 был оптимизирован
    • повторение одного символа ASCII и получение подстроки ASCII-строки выполняется в 4 раза быстрее
  • UTF-8 теперь работает в 2–4 раза быстрее. Кодирование UTF-16 теперь до 10 раз быстрее.

    (Предложено Serhiy Storchaka, issue 14624, issue 14738 и issue 15026.)

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

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

УстарелоDeprecated

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

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

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

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

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

Устаревшие функции и типы C APIDeprecated functions and types of the C API

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

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

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

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

Устаревшие возможностиDeprecated features

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

Переход на Python 3.3Porting to Python 3.3

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

Портирование кода PythonPorting Python code

  • Хэш-рандомизация включена по умолчанию. Установите переменную окружения PYTHONHASHSEED в значение 0, чтобы отключить хэш-рандомизацию. См. также метод object.__hash__().
  • issue 12326: в Linux sys.platform больше не содержит номер основной версии. Теперь это всегда 'linux' вместо 'linux2' или 'linux3' в зависимости от версии Linux, использованной для сборки Python. Замените sys.platform == 'linux2' на sys.platform.startswith('linux') или просто sys.platform == 'linux', если вам не нужно поддерживать более старые версии Python.
  • issue 13847, issue 14180: time и datetime: OverflowError теперь возбуждается вместо ValueError, если временная метка выходит за пределы диапазона. OSError теперь возбуждается, если функции C gmtime() или localtime() завершились ошибкой.
  • Средства поиска по умолчанию, используемые импортом, теперь используют кеш содержимого конкретного каталога. Если вы создаёте исходный файл Python или файл скомпилированного байт-кода, обязательно вызовите importlib.invalidate_caches(), чтобы очистить кеш, и тогда средства поиска заметят новый файл.
  • ImportError теперь использует полное имя модуля, который пытались импортировать. Тесты документации, проверяющие сообщение ImportError, нужно будет обновить, чтобы использовать полное имя модуля вместо только его хвостовой части.
  • Аргумент 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() для добавления в эти списки.
  • Поскольку теперь в sys.path_importer_cache вставляется None, если вы очищаете записи в словаре путей, для которых нет средства поиска, вам нужно будет удалять ключи, связанные со значениями 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 (issue 1079), в синтаксическом анализе, выполняемом email.header.decode_header(), была исправлена. Код, использующий стандартный идиом для преобразования закодированных заголовков в Unicode (str(make_header(decode_header(h))), не увидит изменений, но код, который смотрит на отдельные кортежи, возвращаемые decode_header, увидит, что пробелы, предшествующие или следующие за разделами ASCII, теперь включены в раздел ASCII. Код, который строит заголовки с помощью make_header, также должен продолжать работать без изменений, поскольку make_header продолжает добавлять пробелы между разделами ASCII и не-ASCII, если их нет во входных строках.
  • email.utils.formataddr() теперь выполняет правильное кодирование передачи содержимого, когда передаются не-ASCII отображаемые имена. Любой код, который полагался на предыдущее ошибочное поведение, сохраняющее не-ASCII юникод в отформатированной строке вывода, нужно будет изменить (issue 1690608).
  • poplib.POP3.quit() теперь может вызывать ошибки протокола, как и все остальные методы poplib. Код, который предполагает, что quit не вызывает ошибки poplib.error_proto, может потребовать изменения, если в конкретном приложении возникают ошибки на вызове quit (issue 11291).
  • Аргумент strict функции email.parser.Parser, устаревший начиная с Python 2.4, наконец-то удалён.
  • Устаревший метод unittest.TestCase.assertSameElements был удалён.
  • Устаревшая переменная time.accept2dyear была удалена.
  • Устаревший атрибут Context._clamp был удалён из модуля decimal. Ранее он был заменён публичным атрибутом clamp. (См. issue 8540.)
  • Недокументированный внутренний вспомогательный класс SSLFakeFile был удалён из smtplib, поскольку его функциональность уже давно предоставляется напрямую socket.socket.makefile().
  • Передача отрицательного значения в time.sleep() в Windows теперь вызывает ошибку вместо бесконечного ожидания. В POSIX это всегда вызывало ошибку.
  • Константа ast.__version__ была удалена. Если вам нужно принимать решения, зависящие от версии AST, используйте sys.version_info для принятия решения.
  • Код, который обходил тот факт, что модуль threading использовал фабричные функции, путём создания подклассов закрытых классов, должен будет измениться, чтобы создавать подклассы теперь уже открытых классов.
  • Недокументированная отладочная инфраструктура в модуле threading была удалена, что упрощает код. Это не должно повлиять на рабочий код, но упоминается здесь на случай, если какие-либо отладочные фреймворки приложений взаимодействовали с ней (issue 13550).

Перенос кода на CPorting C code

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

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

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

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

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

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

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

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

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

Изменения параметров командной строкиCommand Line Switch Changes

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

    (issue 10998, вклад Éric Araujo.)

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

    (issue 11591, предложено Carl Meyer с правками Éric Araujo.)