Документация 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 в bpo-13411.)

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

Изменения APIAPI changes

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

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

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

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

  • Дополнительные изменения см. в разделе Изменения сборки и C API и Перенос кода на C.

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

См. также

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Флаг ./configure --with-wide-unicode удалён.

Производительность и использование ресурсов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. (Предложено Брайаном Кертином в bpo-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

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

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

Для обычного пользователя видимых изменений в семантике быть не должно. Для тех, чей код в настоящее время манипулирует импортом или вызывает 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 теперь раскрывает, есть и другие видимые изменения в импорте. Самое большое из них – то, что sys.meta_path и sys.path_hooks теперь хранят все искатели метапути и хуки путевых записей, используемые импортом. Ранее искатели были неявными и скрытыми в C-коде импорта, а не раскрытыми напрямую. Это означает, что теперь можно легко удалять или изменять порядок различных искателей в соответствии со своими потребностями.

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

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

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() также распознаёт именованные последовательности.

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

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

  • Сравнения на равенство объектов range() теперь возвращают результат, отражающий равенство базовых последовательностей, порождённых этими объектами 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.)

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

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

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

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

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

(Добавлено Антуаном Питу в bpo-9260.)

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

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

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

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

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

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

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

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-адрес, связанный с определённой подсетью).

(Добавлено Google и Питером Муди в PEP 3144.)

lzma

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

(Добавлено Надимом Вавдой и Пером Эйвиндом Карлсеном в bpo-6715.)

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

abc

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

(Автор – Даррен Дейл в bpo-11610.)

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

array

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

(Авторы – Орен Тирош и Хирокадзу Ямамото в bpo-1172711.)

base64

Функции декодирования base64 современного интерфейса теперь принимают строки Unicode, состоящие только из ASCII. Например, 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, следует использовать функции Unicode при передаче строк или символов Unicode (например, waddwstr()), а в остальных случаях – функции для bytes (например, waddstr()).

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

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

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

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

(Автор: Iñigo Serna; 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 написаны Stefan Krah.

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

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

Следующая таблица приведена для иллюстрации. Тесты производительности доступны по адресу https://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 опционально включает более строгую семантику для смешивания чисел с плавающей запятой и десятичных чисел.

  • Если 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 можно указать при разборе сообщения электронной почты с помощью parser, при создании объекта Message или при сериализации сообщения с помощью generator. Если не переопределена, политика, переданная в parser, наследуется всеми объектами Message и подобъектами, созданными parser. По умолчанию generator использует политику объекта Message, который он сериализует. Политикой по умолчанию является compat32.

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

max_line_length

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

linesep

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

cte_type

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

raise_on_defect

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

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

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, переформатированы (refolded) с помощью 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, возвращает строку, отформатированную для использования в заголовке email.

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

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

ftplib

  • ftplib.FTP теперь принимает именованный аргумент source_address для указания (host, port), используемого в качестве исходного адреса в вызове bind при создании исходящего сокета. (Автор: Giampaolo Rodolà в bpo-8594.)

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

  • Добавлен метод ftplib.FTP.mlsd(), который предоставляет разбираемый формат списка каталогов и заменяет устаревшие ftplib.FTP.nlst() и ftplib.FTP.dir(). (Автор: Giampaolo Rodolà в bpo-11072.)

functools

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

gc

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

hmac

Добавлена новая функция compare_digest() для предотвращения атак по побочным каналам на дайджесты через анализ времени выполнения. (Авторы: Nick Coghlan и Christian Heimes в bpo-15061.)

http

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

http.server теперь создаёт корректный вывод HTML 4.01 strict. (Автор: Ezio Melotti в bpo-13295.)

http.client.HTTPResponse теперь имеет метод readinto(), что позволяет использовать его как класс io.RawIOBase. (Автор: John Kuhn в bpo-13464.)

html

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

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

imaplib

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

(Автор: Sijin Joseph в bpo-8808.)

inspect

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

(Авторы: Meador Inge и Nick Coghlan в bpo-13062.)

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

(Автор: Meador Inge в bpo-15153.)

io

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

(Автор: David Townshend в bpo-12760.)

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

itertools

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

logging

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

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

math

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

(Написан Mark Dickinson в bpo-11888.)

mmap

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

multiprocessing

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

Объекты multiprocessing.connection.Connection теперь можно передавать через соединения multiprocessing. (Автор: Richard Oudkerk в 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(). (Автор: Hynek Schlawack в bpo-12708.)

nntplib

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

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

(Предложено Giampaolo Rodolà в bpo-9795.)

os

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

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

    (Патч предоставлен Ross Lagerwall и Giampaolo Rodolà в bpo-10882.)

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

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

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

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

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

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

  • Новая функция os.get_terminal_size() запрашивает размер терминала, подключённого к файловому дескриптору. См. также shutil.get_terminal_size(). (Предложено Zbigniew Jędrzejewski-Szmek в bpo-13609.)

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

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

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

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

    • posix_fallocate(): Гарантирует, что для файла выделено достаточно дискового пространства.

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

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

    • lockf(): Установить, проверить или снять блокировку POSIX на открытом файловом дескрипторе.

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

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

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

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

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

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

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

  • times() и uname(): Тип возвращаемого значения изменён с кортежа на объект, похожий на кортеж, с именованными атрибутами.

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

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

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

pdb

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

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

pickle

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

(Добавлено Ричардом Аудкерком в bpo-14166.)

pydoc

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

re

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

(Добавлено Сергием Сторчакой в bpo-3665.)

sched

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

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

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

  • Параметр argument у enter() и enterabs() теперь необязателен. (Добавлено Крисом Кларком в 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: если этот параметр равен True, символические ссылки не разыменовываются, и операция вместо этого воздействует на саму символическую ссылку (или создаёт её, если применимо). (Добавлено Хайнеком Шлаваком в bpo-12715.)

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

  • rmtree() теперь устойчив к атакам через симлинки на платформах, поддерживающих новый параметр dir_fd в os.open() и os.unlink(). (Авторы: Martin von Löwis и Hynek Schlawack в bpo-4489.)

signal

  • В модуле signal появились новые функции:

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

smtplib

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

SMTP теперь поддерживает протокол менеджера контекста, что позволяет использовать экземпляр SMTP в операторе with. (Автор: Giampaolo Rodolà в bpo-11289.)

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

socket

socketserver

BaseServer теперь имеет переопределяемый метод service_actions(), который вызывается методом serve_forever() в сервисном цикле. ForkingMixIn теперь использует это для очистки зомби-процессов дочерних процессов. (Автор: Justin Warkentin в bpo-11109.)

sqlite3

Новый метод sqlite3.Connection set_trace_callback() можно использовать для захвата трассировки всех команд SQL, обрабатываемых sqlite. (Автор: Torsten Landschoff в bpo-11688.)

ssl

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

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

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

    (Предложено Victor Stinner в bpo-12049.)

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

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

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

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

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

  • Добавлена поддержка расширения согласования следующего протокола (Next Protocol Negotiation) с использованием метода ssl.SSLContext.set_npn_protocols(). (Предложено Colin Marc в bpo-14204.)

  • Теперь ошибки SSL можно легче анализировать благодаря атрибутам library и reason. (Предложено Antoine Pitrou в bpo-14837.)

  • Функция get_server_certificate() теперь поддерживает IPv6. (Предложено Charles-François Natali в bpo-11811.)

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

stat

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

(Предложено Giampaolo Rodolà в bpo-14807.)

struct

Модуль struct теперь поддерживает ssize_t и size_t через новые коды n и N соответственно. (Предложено Antoine Pitrou в bpo-3163.)

подпроцессsubprocess

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

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

sys

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

tarfile

tarfile теперь поддерживает кодировку lzma через модуль lzma. (Предложено Lars Gustäbel в bpo-5689.)

tempfile

Метод truncate() tempfile.SpooledTemporaryFile теперь принимает параметр size. (Предложено Ryan Kelly в bpo-9957.)

textwrap

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

threading

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

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

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

time

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

  • get_clock_info(): получение информации о часах.

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

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

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

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

Для улучшения кроссплатформенной согласованности sleep() теперь вызывает ValueError при передаче отрицательного значения sleep. Ранее это было ошибкой в 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://www.python.org', method='HEAD'))

(bpo-1673007)

webbrowser

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

xml.etree.ElementTree

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

zlib

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

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

Оптимизации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, bpo-14624, bpo-14738 и bpo-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

  • Передача непустой строки в object.__format__() объявлена устаревшей и в Python 3.4 будет приводить к TypeError (bpo-9856).

  • Кодек unicode_internal объявлен устаревшим из-за PEP 393; используйте UTF-8, UTF-16 (utf-16-le или utf-16-be) или UTF-32 (utf-32-le или utf-32-be)

  • ftplib.FTP.nlst() и ftplib.FTP.dir(): используйте ftplib.FTP.mlsd()

  • platform.popen(): используйте модуль subprocess. Обратите особое внимание на раздел Замена устаревших функций модулем subprocess (bpo-11377).

  • bpo-13374: API байтовых строк Windows объявлен устаревшим в модуле os. Используйте имена файлов в Unicode вместо байтовых имён, чтобы больше не зависеть от кодовой страницы ANSI и поддерживать любые имена файлов.

  • bpo-13988: Модуль xml.etree.cElementTree объявлен устаревшим. Ускоритель используется автоматически, если доступен.

  • Поведение time.clock() зависит от платформы: используйте новую функцию time.perf_counter() или time.process_time() в зависимости от ваших требований, чтобы получить чётко определённое поведение.

  • Функция os.stat_float_times() объявлена устаревшей.

  • Модуль abc:

  • Пакет importlib:

    • importlib.abc.SourceLoader.path_mtime() теперь объявлен устаревшим в пользу importlib.abc.SourceLoader.path_stats(), так как файлы байт-кода теперь хранят как время модификации, так и размер исходного файла, из которого был скомпилирован файл байт-кода.

Устаревшие функции и типы 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__().

  • 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() завершились ошибкой.

  • Используемые по умолчанию искатели (finders) модуля import теперь используют кеш содержимого конкретного каталога. Если вы создаёте файл исходного кода 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 теперь по умолчанию содержат искатели (finders), скорее всего, для добавления в эти списки вам потребуется использовать 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(). Код, использующий стандартную идиому преобразования закодированных заголовков в Unicode (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 удалён, что упростило код. Это не должно повлиять на production-код, но упоминается здесь на случай, если какие-либо отладочные фреймворки приложений с ним взаимодействовали (bpo-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 из имён файлов).

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

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

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

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

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

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