Содержание страницы
Что нового в Python 3.3¶What’s New In Python 3.3
В этой статье описаны новые возможности Python 3.3 по сравнению с Python 3.2. Python 3.3 вышел 29 сентября 2012 года. Полные сведения – в списке изменений.
См. также
PEP 398 – График выпуска Python 3.3
Итоги – основные изменения¶Summary – Release highlights
Новые синтаксические возможности:
- Новое выражение yield from для делегирования генераторам.
- Синтаксис u'unicode' снова поддерживается для объектов str.
Новые модули библиотеки:
- faulthandler (помогает отлаживать низкоуровневые сбои)
- ipaddress (высокоуровневые объекты, представляющие IP-адреса и маски)
- lzma (сжатие данных с использованием алгоритма XZ / LZMA)
- unittest.mock (замена частей тестируемой системы на mock-объекты)
- venv (Python виртуальные окружения, как в популярном пакете virtualenv)
Новые встроенные возможности:
- Переработанная иерархия исключений ввода-вывода.
Улучшения реализации:
- Переписан механизм импорта на основе importlib.
- Более компактные строки Unicode.
- Более компактные словари атрибутов.
Значительно улучшенные модули библиотеки:
- C-акселератор для модуля decimal.
- Улучшенная обработка Unicode в модуле email (предварительный).
Улучшения в области безопасности:
- Рандомизация хэшей включена по умолчанию.
Читайте далее, чтобы ознакомиться с полным списком изменений, значимых для пользователя.
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), используя отрицательный шаг.
Изменения API¶API 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). Различие между узкой и широкой сборками больше не существует, и 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 для Windows¶PEP 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. Доступны следующие подклассы:
- BlockingIOError
- ChildProcessError
- ConnectionError
- FileExistsError
- FileNotFoundError
- InterruptedError
- IsADirectoryError
- NotADirectoryError
- PermissionError
- ProcessLookupError
- TimeoutError
А сам 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: Явные литералы Unicode¶PEP 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.implementation¶PEP 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 – Замена __import__ на importlib.__import__ issue 13959 – Переписать части imp на чистом Python issue 14605 – Сделать механизм импорта явным issue 14607 – Требовать, чтобы загрузчики устанавливали __loader__ и __package__
Функция __import__() теперь работает на основе importlib.__import__(). Эта работа приводит к завершению «фазы 2» PEP 302. У этого изменения есть множество преимуществ. Во-первых, оно позволило сделать больше механизмов, управляющих импортом, явными, а не неявными и скрытыми в коде C. Оно также предоставляет единую реализацию для всех виртуальных машин Python, поддерживающих Python 3.3, помогая устранить любые отклонения в семантике импорта, зависящие от конкретной виртуальной машины. И наконец, оно упрощает сопровождение импорта, позволяя дальнейшее развитие.
Для обычного пользователя видимых изменений в семантике быть не должно. Для тех, чей код в настоящее время манипулирует импортом или вызывает import программно, возможные необходимые изменения в коде описаны в разделе Перенос кода Python этого документа.
Новые API¶New 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 и Peter Moody в PEP 3144)
lzma ¶
Недавно добавленный модуль lzma предоставляет сжатие и распаковку данных с использованием алгоритма LZMA, включая поддержку форматов файлов .xz и .lzma.
(Предложено Nadeem Vawda и Per Øyvind Karlsen в issue 6715)
Улучшенные модули¶Improved Modules
abc ¶
Улучшена поддержка абстрактных базовых классов, содержащих дескрипторы, составленные из абстрактных методов. Теперь рекомендуется объявлять абстрактные дескрипторы, предоставляя __isabstractmethod__ в качестве динамически обновляемого свойства. Встроенные дескрипторы были обновлены соответствующим образом.
- abc.abstractproperty устарел, вместо него используйте property с abc.abstractmethod().
- abc.abstractclassmethod устарел, вместо него используйте classmethod с abc.abstractmethod().
- abc.abstractstaticmethod устарел, вместо него используйте staticmethod с abc.abstractmethod().
(Предложено 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 после символа замены.
Инкрементальные кодировщики кодеков 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.'.
Кодек 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).
crypt¶
Добавление соли и модульного формата crypt (метод хеширования) и функции mksalt() в модуль crypt.
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.
Изменения API¶API 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 и обратно.
Другие изменения API¶Other 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)
В модуль html.entities добавлен новый словарь html5, который отображает именованные ссылки на символы HTML5 в эквивалентные символы Unicode (например, html5['gt;'] == '>'). Этот словарь теперь также используется 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.
(Автор: Mark Dickinson в issue 11888).
mmap¶
Метод read() теперь более совместим с другими файлоподобными объектами: если аргумент опущен или указан как None, он возвращает байты от текущей позиции в файле до конца отображения. (Автор: Petri Lehtinen в issue 12021.)
multiprocessing¶
Новая функция multiprocessing.connection.wait() позволяет опрашивать несколько объектов (например, соединения, сокеты и каналы) с таймаутом. (Автор – Ричард Оудкерк, issue 12328.)
Объекты multiprocessing.Connection теперь можно передавать через multiprocessing-соединения. (Автор – Ричард Оудкерк, issue 4892.)
multiprocessing.Process теперь принимает именованный аргумент daemon, позволяющий переопределить стандартное поведение наследования флага daemon от родительского процесса (issue 6064).
Новый атрибут multiprocessing.Process.sentinel позволяет программе ожидать сразу несколько объектов Process с помощью соответствующих системных примитивов (например, 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')
>>>
(Автор: Giampaolo Rodolà в issue 9795)
os¶
В модуле os появилась новая функция pipe2(), которая позволяет атомарно создать канал с флагами O_CLOEXEC или O_NONBLOCK. Это особенно полезно для предотвращения состояний гонки в многопоточных программах.
Модуль os содержит новую функцию sendfile(), предоставляющую эффективный способ «zero-copy» для копирования данных из одного файлового (или сокетного) дескриптора в другой. Термин «zero-copy» означает, что всё копирование данных между двумя дескрипторами выполняется полностью ядром, без копирования данных в буферы пользовательского пространства. sendfile() можно использовать для эффективного копирования данных из файла на диске в сетевой сокет, например, для скачивания файла.
(Патч предоставлен Россом Лагерваллем и Джампаоло Родолой в issue 10882.)
Для предотвращения состояний гонки (например, атак через символьные ссылки) и проблем с временными файлами и каталогами надёжнее (и быстрее) манипулировать файловыми дескрипторами, а не именами файлов. Python 3.3 расширяет существующие функции и вводит новые для работы с файловыми дескрипторами (issue 4761, issue 10755 и issue 14626).
- В модуле os появилась новая функция fwalk(), аналогичная walk(), но также возвращающая файловые дескрипторы посещаемых каталогов. Это особенно полезно для предотвращения гонок символьных ссылок.
- Следующие функции получили новые необязательные параметры dir_fd (пути относительно дескрипторов каталогов) и/или follow_symlinks (не следовать символьным ссылкам): access(), chflags(), chmod(), chown(), link(), lstat(), mkdir(), mkfifo(), mknod(), open(), readlink(), remove(), rename(), replace(), rmdir(), stat(), symlink(), unlink(), utime(). Поддержка платформы для использования этих параметров проверяется через наборы os.supports_dir_fd и os.supports_follows_symlinks.
- Следующие функции теперь поддерживают файловый дескриптор в качестве аргумента пути: chdir(), chmod(), chown(), execve(), listdir(), pathconf(), exists(), stat(), statvfs(), utime(). Поддержка этой возможности на платформе проверяется через набор os.supports_fd.
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).
(Автор: Matthias Fuchs, обновлено Tiago Gonçalves в issue 10141)
Класс socket теперь поддерживает семейство протоколов PF_RDS (http://en.wikipedia.org/wiki/Reliable_Datagram_Sockets и http://oss.oracle.com/projects/rds/).
Класс socket теперь поддерживает семейство протоколов PF_SYSTEM в OS X. (Предложено Майклом Годербауэром в issue 13777.)
Новая функция sethostname() позволяет установить имя хоста в системах Unix, если вызывающий процесс имеет достаточные привилегии. (Предложено Россом Лагерваллом в issue 10866.)
socketserver¶
Теперь у BaseServer есть переопределяемый метод service_actions(), который вызывается методом serve_forever() в цикле обслуживания. ForkingMixIn теперь использует этот метод для очистки зомби-процессов потомков. (Предложено Justin Warkentin в issue 11109.)
sqlite3¶
Новый метод sqlite3.Connection set_trace_callback() можно использовать для захвата трассировки всех команд SQL, обработанных sqlite. (Предложено Торстеном Ландшоффом в issue 11688.)
ssl¶
Модуль ssl имеет две новые функции генерации случайных чисел:
- RAND_bytes(): генерирует криптостойкие псевдослучайные байты.
- RAND_pseudo_bytes(): генерирует псевдослучайные байты.
(Предложено Victor Stinner в issue 12049)
Модуль ssl теперь предоставляет более детальную иерархию исключений, чтобы облегчить анализ различных типов ошибок. (Предложено Antoine Pitrou в issue 11183)
load_cert_chain() теперь принимает аргумент password, который используется, если закрытый ключ зашифрован. (Предложено Adam Simpkins в issue 12803)
Обмен ключами Диффи-Хеллмана, как обычный, так и на основе эллиптических кривых, теперь поддерживается через методы load_dh_params() и set_ecdh_curve(). (Предложено Antoine Pitrou в issue 13626 и issue 13627)
У SSL-сокетов появился новый метод get_channel_binding(), позволяющий реализовать некоторые механизмы аутентификации, такие как SCRAM-SHA-1-PLUS. (Предложено Jacek Konieczny в issue 12551)
Алгоритм сжатия SSL, используемый SSL-сокетом, можно узнать с помощью нового метода compression(). Новый атрибут OP_NO_COMPRESSION можно использовать для отключения сжатия. (Предложено Antoine Pitrou в issue 13634)
Добавлена поддержка расширения согласования следующего протокола с помощью метода ssl.SSLContext.set_npn_protocols(). (Предложено Colin Marc в issue 14204)
Ошибки SSL теперь можно легче анализировать благодаря атрибутам library и reason. (Предложено Antoine Pitrou в issue 14837)
Функция get_server_certificate() теперь поддерживает IPv6. (Предложено Шарлем-Франсуа Натали в issue 11811.)
Новый атрибут OP_CIPHER_SERVER_PREFERENCE позволяет настроить SSLv3-сокеты сервера на использование порядка шифров, предпочитаемого сервером, а не клиентом (issue 13635).
stat¶
Незадокументированная функция tarfile.filemode была перемещена в stat.filemode(). Её можно использовать для преобразования режима файла в строку вида ‘-rwxrwxrwx’.
(Предложено Giampaolo Rodolà в 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, которые раньше были фабричными функциями, возвращающими экземпляр класса, теперь стали классами и могут быть унаследованы. (Предложено Éric Araujo в 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(): сумма системного и пользовательского процессорного времени текущего процесса.
Другие новые функции:
- Функции clock_getres(), clock_gettime() и clock_settime() с константами CLOCK_xxx. (Предложено Victor Stinner в issue 10278)
Для улучшения совместимости между платформами 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 при использовании в качестве контекстных менеджеров. (Предложено Ezio Melotti и Winston Ewert в issue 10775)
unittest.TestCase.run() теперь возвращает объект TestResult.
urllib¶
Класс Request теперь принимает аргумент method, используемый get_method() для определения HTTP-метода. Например, так можно отправить запрос 'HEAD':
>>> urlopen(Request('http://www.python.org', method='HEAD'))
webbrowser¶
Модуль webbrowser поддерживает больше «браузеров»: Google Chrome (назван chrome, chromium, chrome-browser или chromium-browser в зависимости от версии и операционной системы), и универсальные запускатели xdg-open из проекта FreeDesktop.org и gvfs-open, который является обработчиком URI по умолчанию для GNOME 3. (Первое предложено Arnaud Calmettes в issue 13620, второе – Matthias Klose в 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 API¶Build and C API Changes
Изменения процесса сборки Python и C API включают:
- Новая функция, связанная с PEP 3118:
- PEP 393 добавил новые типы, макросы и функции Unicode:
- API высокого уровня:
- API низкого уровня:
- Py_UCS1, Py_UCS2, Py_UCS4 типы
- PyASCIIObject и PyCompactUnicodeObject структуры
- PyUnicode_READY
- PyUnicode_FromKindAndData()
- PyUnicode_AsUCS4(), PyUnicode_AsUCS4Copy()
- PyUnicode_DATA, PyUnicode_1BYTE_DATA, PyUnicode_2BYTE_DATA, PyUnicode_4BYTE_DATA
- PyUnicode_KIND с перечислением PyUnicode_Kind: PyUnicode_WCHAR_KIND, PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND, PyUnicode_4BYTE_KIND
- PyUnicode_READ, PyUnicode_READ_CHAR, PyUnicode_WRITE
- PyUnicode_MAX_CHAR_VALUE
- PyArg_ParseTuple теперь принимает bytearray для формата c (issue 12380).
Устарело¶Deprecated
Неподдерживаемые операционные системы¶Unsupported Operating Systems
OS/2 и VMS больше не поддерживаются из-за отсутствия сопровождающего.
Windows 2000 и версии Windows, в которых COMSPEC указывает на command.com, больше не поддерживаются из-за затрат на сопровождение.
Поддержка OSF, объявленная устаревшей в версии 3.2, полностью удалена.
Устаревшие модули, функции и методы Python¶Deprecated Python modules, functions and methods
- Передача непустой строки в object.__format__() устарела, и в Python 3.4 это будет приводить к TypeError (issue 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(): use the subprocess module. Check especially the Replacing Older Functions with the subprocess Module section (issue 11377).
- issue 13374: Windows bytes API объявлен устаревшим в модуле os. Используйте имена файлов в Unicode вместо имён в байтах, чтобы не зависеть от кодовой страницы ANSI и иметь возможность использовать любые имена файлов.
- issue 13988: Модуль xml.etree.cElementTree устарел. Ускоритель используется автоматически, когда он доступен.
- Поведение time.clock() зависит от платформы: вместо неё используйте новую функцию time.perf_counter() или time.process_time(), в зависимости от ваших потребностей, чтобы поведение было однозначным.
- Функция os.stat_float_times() устарела.
- Модуль abc:
- abc.abstractproperty устарел, вместо него используйте property с abc.abstractmethod().
- abc.abstractclassmethod устарел, вместо него используйте classmethod с abc.abstractmethod().
- abc.abstractstaticmethod устарел, вместо него используйте staticmethod с abc.abstractmethod().
- Пакет importlib:
- importlib.abc.SourceLoader.path_mtime() теперь считается устаревшим, вместо него рекомендуется importlib.abc.SourceLoader.path_stats(), так как файлы байт-кода теперь хранят как время изменения, так и размер исходного файла, из которого был скомпилирован байт-код.
Устаревшие функции и типы C API¶Deprecated functions and types of the C API
Тип Py_UNICODE объявлен устаревшим в PEP 393 и будет удалён в Python 4. Все функции, использующие этот тип, устарели:
Функции и методы Unicode, использующие типы Py_UNICODE и Py_UNICODE*:
- PyUnicode_FromUnicode: используйте PyUnicode_FromWideChar() или PyUnicode_FromKindAndData()
- PyUnicode_AS_UNICODE, PyUnicode_AsUnicode(), PyUnicode_AsUnicodeAndSize(): используйте PyUnicode_AsWideCharString()
- PyUnicode_AS_DATA: используйте PyUnicode_DATA вместе с PyUnicode_READ и PyUnicode_WRITE
- PyUnicode_GET_SIZE, PyUnicode_GetSize(): используйте PyUnicode_GET_LENGTH или PyUnicode_GetLength()
- PyUnicode_GET_DATA_SIZE: используйте PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str) (работает только с подготовленными строками)
- PyUnicode_AsUnicodeCopy(): используйте PyUnicode_AsUCS4Copy() или PyUnicode_AsWideCharString()
- PyUnicode_GetMax()
Функции и макросы для работы со строками Py_UNICODE*:
- Py_UNICODE_strlen: используйте PyUnicode_GetLength() или PyUnicode_GET_LENGTH
- Py_UNICODE_strcat: используйте PyUnicode_CopyCharacters() или PyUnicode_FromFormat()
- Py_UNICODE_strcpy, Py_UNICODE_strncpy, Py_UNICODE_COPY: используйте PyUnicode_CopyCharacters() или PyUnicode_Substring()
- Py_UNICODE_strcmp: используйте PyUnicode_Compare()
- Py_UNICODE_strncmp: используйте PyUnicode_Tailmatch()
- Py_UNICODE_strchr, Py_UNICODE_strrchr: используйте PyUnicode_FindChar()
- Py_UNICODE_FILL: используйте PyUnicode_Fill()
- Py_UNICODE_MATCH
Кодировщики:
- PyUnicode_Encode(): используйте PyUnicode_AsEncodedObject()
- PyUnicode_EncodeUTF7()
- PyUnicode_EncodeUTF8(): используйте PyUnicode_AsUTF8() или PyUnicode_AsUTF8String()
- PyUnicode_EncodeUTF32()
- PyUnicode_EncodeUTF16()
- PyUnicode_EncodeUnicodeEscape:(): используйте PyUnicode_AsUnicodeEscapeString()
- PyUnicode_EncodeRawUnicodeEscape:(): используйте PyUnicode_AsRawUnicodeEscapeString()
- PyUnicode_EncodeLatin1(): используйте PyUnicode_AsLatin1String()
- PyUnicode_EncodeASCII(): используйте PyUnicode_AsASCIIString()
- PyUnicode_EncodeCharmap()
- PyUnicode_TranslateCharmap()
- PyUnicode_EncodeMBCS(): используйте PyUnicode_AsMBCSString() или PyUnicode_EncodeCodePage() (с CP_ACP в качестве кодовой страницы)
- PyUnicode_EncodeDecimal(), PyUnicode_TransformDecimalToASCII()
Устаревшие возможности¶Deprecated features
Код формата 'u' модуля array теперь устарел и будет удалён в Python 4 вместе с остальной частью API (Py_UNICODE).
Переход на Python 3.3¶Porting to Python 3.3
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Портирование кода Python¶Porting 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).
Перенос кода на C¶Porting 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.
Сборка расширений C¶Building 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.)