Содержание страницы
Что нового в Python 3.3¶What’s New In Python 3.3
В этой статье описываются новые возможности Python 3.3 по сравнению с версией 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 в bpo-13411.)
Поддерживается произвольная нарезка любого одномерного массива. Например, теперь можно обратить memoryview за O(1), используя отрицательный шаг.
Изменения API¶API 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 для 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. (Предложено Брайаном Кертином в 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: Явные литералы 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
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 этого документа.
Новые 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 теперь раскрывает, есть и другие видимые изменения в импорте. Самое большое из них – то, что 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__ как динамически обновляемое
свойство. Встроенные дескрипторы были соответствующим образом обновлены.
abc.abstractpropertyобъявлен устаревшим, вместо него используйтеpropertyсabc.abstractmethod().abc.abstractclassmethodобъявлен устаревшим, вместо него используйтеclassmethodсabc.abstractmethod().abc.abstractstaticmethodобъявлен устаревшим, вместо него используйтеstaticmethodсabc.abstractmethod().
(Автор – Даррен Дейл в 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теперь реализует весь APIio.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 после символа замены.
Инкрементальные кодировщики кодеков 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.
Кодек 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).
crypt¶
Добавление соли и модульного формата crypt (метода хеширования), а также функции mksalt()
в модуль crypt.
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.
Изменения API¶API changes
C-модуль имеет следующие ограничения контекста в зависимости от архитектуры машины:
В шаблонах контекста (
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), которую могут иметь отдельные строки при сериализации |
linesep |
Символ, используемый для разделения отдельных строк при сериализации |
cte_type |
|
raise_on_defect |
Заставляет |
Новый экземпляр политики с новыми настройками создаётся с помощью метода 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 |
Определяет, будут ли заголовки, разобранные с помощью |
header_factory |
Вызываемый объект, который принимает |
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, возвращает строку, отформатированную для использования в заголовке 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).
В модуле
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_follow_symlinks.Следующие функции теперь поддерживают файловый дескриптор в качестве аргумента path:
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(). Они используются для получения или установки приоритета (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()теперь обрабатывает символические ссылки так же, как команда posixmv: создаёт ссылку заново, а не копирует содержимое целевого файла. (Добавлено Джонатаном Нихофом в 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¶
Класс
socketтеперь предоставляет дополнительные методы для обработки вспомогательных данных, если это поддерживается платформой:(Автор: David Watson в bpo-6560, на основе более раннего патча от Heiko Wundram)
Класс
socketтеперь поддерживает семейство протоколов PF_CAN (https://en.wikipedia.org/wiki/Socketcan) на Linux (https://lwn.net/Articles/253425).(Автор: Matthias Fuchs, обновлено Tiago Gonçalves в bpo-10141.)
Класс
socketтеперь поддерживает семейство протоколов PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets и https://oss.oracle.com/projects/rds).Класс
socketтеперь поддерживает семейство протоколовPF_SYSTEMна OS X. (Автор: Michael Goderbauer в bpo-13777.)Новая функция
sethostname()позволяет установить имя хоста в Unix-системах, если вызывающий процесс имеет достаточные привилегии. (Автор: Ross Lagerwall в bpo-10866.)
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(): сумма системного и пользовательского времени ЦП текущего процесса.
Другие новые функции:
clock_getres(),clock_gettime()иclock_settime()функции с константамиCLOCK_xxx. (Добавлено Виктором Стиннером в bpo-10278.)
Для улучшения кроссплатформенной согласованности 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'))
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 API¶Build and C API Changes
Изменения процесса сборки Python и C API включают:
Новая функция, связанная с PEP 3118:
PEP 393 добавил новые типы, макросы и функции Unicode:
API высокого уровня:
API низкого уровня:
структуры
PyASCIIObjectиPyCompactUnicodeObjectPyUnicode_DATA,PyUnicode_1BYTE_DATA,PyUnicode_2BYTE_DATA,PyUnicode_4BYTE_DATAPyUnicode_KINDс перечислениемPyUnicode_Kind:PyUnicode_WCHAR_KIND,PyUnicode_1BYTE_KIND,PyUnicode_2BYTE_KIND,PyUnicode_4BYTE_KIND
PyArg_ParseTupleтеперь принимаетbytearrayдля форматаc(bpo-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(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: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_WRITEPyUnicode_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_LENGTHPy_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_ACPcode_page)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__().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теперь возбуждается, если функции Cgmtime()или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).
Перенос кода на 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из имён файлов).(реализовано в bpo-14040.)
Изменения параметров командной строки¶Command Line Switch Changes
Флаг командной строки -Q и связанные с ним артефакты удалены. Код, проверяющий sys.flags.division_warning, потребует обновления.
(bpo-10998, предоставлено Эриком Араужо.)
Когда python запускается с
-S,import siteбольше не будет добавлять пути, специфичные для сайта, в пути поиска модулей. В предыдущих версиях это делалось.(bpo-11591, предоставлен Карлом Мейером с правками Эрика Араужо.)