Что нового в Python 3.3¶
В этой статье рассказывается о новых возможностях Python 3.3 по сравнению с 3.2. Python 3.3 был выпущен 29 сентября 2012 года. Более подробную информацию вы можете найти в changelog.
См.также
PEP 398 - График выхода Python 3.3
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
Новое выражение
yield from
для generator delegation.Синтаксис
u'unicode'
снова принят для объектовstr
.
Новые библиотечные модули:
faulthandler
(помогает отлаживать низкоуровневые сбои)ipaddress
(высокоуровневые объекты, представляющие IP-адреса и маски)lzma
(сжатие данных с помощью алгоритма XZ / LZMA)unittest.mock
(замените части тестируемой системы имитационными объектами)venv
(Python virtual environments, как в популярном пакетеvirtualenv
)
Новые встроенные функции:
Переработанная I/O exception hierarchy.
Улучшения в реализации:
Переписанный import machinery на основе
importlib
.Более компактный unicode strings.
Более компактный attribute dictionaries.
Значительно улучшенные библиотечные модули:
Ускоритель C для модуля decimal.
Улучшена обработка юникода в модуле email (provisional).
Улучшения в системе безопасности:
Рандомизация хэша включена по умолчанию.
Полный список изменений, касающихся пользователей, читайте далее.
PEP 405: Виртуальные среды¶
Виртуальные среды позволяют создавать отдельные установки Python, но при этом совместно использовать общесистемную базовую установку, что упрощает обслуживание. Виртуальные среды имеют свой собственный набор частных пакетов сайта (то есть локально установленных библиотек) и по желанию отделяются от общесистемных пакетов сайта. Их концепция и реализация вдохновлены популярным сторонним пакетом virtualenv
, но выигрывают от более тесной интеграции с ядром интерпретатора.
Этот PEP добавляет модуль venv
для программного доступа и скрипт pyvenv
для доступа и администрирования из командной строки. Интерпретатор Python проверяет наличие pyvenv.cfg
, файла, существование которого сигнализирует об основании дерева каталогов виртуальной среды.
См.также
- PEP 405 - Виртуальные среды Python
PEP написан Карлом Мейером; реализация Карлом Мейером и Винаем Саджипом
PEP 420: Неявные пакеты пространства имен¶
Встроенная поддержка каталогов пакетов, которые не требуют файлов-маркеров __init__.py
и могут автоматически охватывать несколько сегментов пути (вдохновлено различными сторонними подходами к пакетам пространств имен, как описано в PEP 420)
См.также
- PEP 420 - Неявные пакеты пространства имен
PEP написан Эриком В. Смитом; реализация Эриком В. Смитом и Барри Варшавом
PEP 3118: Новая реализация просмотра памяти и документация по буферному протоколу¶
Реализация PEP 3118 была значительно улучшена.
Новая реализация memoryview полностью исправляет все проблемы с владением и временем жизни динамически выделяемых полей в структуре Py_buffer, которые приводили к многочисленным сообщениям о сбоях. Кроме того, исправлено несколько функций, которые аварийно завершали работу или возвращали неверные результаты для несвязного или многомерного ввода.
Объект memoryview теперь имеет совместимую с PEP-3118 функцию getbufferproc(), которая проверяет тип запроса потребителя. Добавлено множество новых функций, большинство из которых работает в полном объеме для несмежных массивов и массивов с подмножествами.
Обновлена документация, в которой четко прописаны обязанности экспортеров и потребителей. Флаги запросов буфера сгруппированы в базовые и составные флаги. Объясняется расположение в памяти несвязных и многомерных массивов в стиле NumPy.
Характеристики¶
Теперь поддерживаются все собственные односимвольные спецификаторы формата в синтаксисе модуля struct (опционально с префиксом „@“).
С некоторыми ограничениями метод cast() позволяет изменять формат и форму C-связных массивов.
Представления многомерных списков поддерживаются для любого типа массива.
Многомерные сравнения поддерживаются для любого типа массива.
Одномерные представления памяти хэшируемых (только для чтения) типов с форматами B, b или c теперь являются хэшируемыми. (Внесено Антуаном Питру в bpo-13411).
Поддерживается произвольная нарезка массивов любого типа 1-D. Например, теперь можно перевернуть представление памяти в O(1), используя отрицательный шаг.
Изменения в API¶
Максимальное количество измерений официально ограничено 64.
Представление пустой формы, страйдов и подмножеств теперь представляет собой пустой кортеж вместо
None
.Доступ к элементу memoryview с форматом „B“ (беззнаковые байты) теперь возвращает целое число (в соответствии с синтаксисом модуля struct). Для возврата байтового объекта представление должно быть сначала приведено к формату „c“.
Сравнения с просмотром памяти теперь используют логическую структуру операндов и сравнивают все элементы массива по значению. Поддерживаются все строки формата в синтаксисе модуля struct. Представления с нераспознанными строками формата по-прежнему разрешены, но всегда будут сравниваться как неравные, независимо от содержимого представления.
О дальнейших изменениях смотрите Build and C API Changes и Porting C code.
(Внесено Стефаном Крахом в bpo-10181).
См.также
PEP 3118 - Пересмотр протокола буферизации
PEP 393: Гибкое представление строк¶
Тип строки Unicode изменен для поддержки нескольких внутренних представлений, в зависимости от символа с наибольшим порядковым номером Unicode (1, 2 или 4 байта) в представляемой строке. Это позволяет экономить место в обычных случаях, но дает доступ к полному UCS-4 во всех системах. Для совместимости с существующими API несколько представлений могут существовать параллельно; со временем от такой совместимости следует отказаться.
С точки зрения Python, никаких отрицательных моментов в этом изменении быть не должно.
Что касается API на языке C, то PEP 393 полностью обратно совместим. Устаревший API должен оставаться доступным как минимум пять лет. Приложения, использующие устаревший API, не смогут в полной мере воспользоваться преимуществами сокращения памяти или - что еще хуже - могут использовать немного больше памяти, поскольку Python придется поддерживать две версии каждой строки (в устаревшем формате и в новом эффективном хранилище).
Функциональность¶
Изменения, внесенные 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
был удален.
Производительность и использование ресурсов¶
Хранение строк Unicode теперь зависит от старшей кодовой точки в строке:
Чистые строки ASCII и Latin1 (
U+0000-U+00FF
) используют по 1 байту на каждую кодовую точку;Строки BMP (
U+0000-U+FFFF
) используют 2 байта на одну кодовую точку;Не-BMP-строки (
U+10000-U+10FFFF
) используют 4 байта на одну кодовую точку.
Чистый эффект заключается в том, что для большинства приложений использование памяти для хранения строк должно значительно снизиться - особенно по сравнению с прежними широкими юникодными сборками - поскольку во многих случаях строки будут представлять собой чистый ASCII даже в международном контексте (поскольку многие строки хранят нечеловеческие языковые данные, такие как фрагменты XML, заголовки HTTP, данные в кодировке JSON и т. д.). Мы также надеемся, что по тем же причинам это повысит эффективность кэша процессора в нетривиальных приложениях. Потребление памяти Python 3.3 в два-три раза меньше, чем у Python 3.2, и немного лучше, чем у Python 2.7, в бенчмарке Django (подробности см. в PEP).
См.также
- PEP 393 - Гибкое представление строк
PEP написан Мартином фон Лёвисом; реализация - Торстеном Беккером и Мартином фон Лёвисом.
PEP 397: Python Launcher для Windows¶
Программа установки Python 3.3 для Windows теперь включает приложение py
launcher, которое можно использовать для запуска приложений Python независимо от версии.
Эта программа запуска неявно вызывается при двойном щелчке по файлам *.py
. Если в системе установлена только одна версия Python, то для запуска файла будет использоваться эта версия. Если установлено несколько версий, то по умолчанию используется самая последняя версия, но это можно отменить, включив в скрипт Python «строку shebang» в стиле Unix.
Программа запуска также может быть использована явно из командной строки как приложение py
. При запуске py
используются те же правила выбора версии, что и при неявном запуске скриптов, но можно выбрать более конкретную версию, передав соответствующие аргументы (например, -3
для запроса Python 3, если установлен Python 2, или -2.6
для специального запроса более ранней версии Python, если установлена более новая версия).
В дополнение к программе запуска, программа установки Windows теперь включает опцию добавления только что установленного Python в системный PATH. (Внесено Брайаном Кертином в bpo-3561).
См.также
- PEP 397 - Python Launcher для Windows
PEP написан Марком Хаммондом и Мартином в. Лёвисом; реализация - Винаем Саджипом.
Документация по лаунчеру: Python Launcher для Windows
Модификация PATH установщика: Поиск исполняемого файла Python
PEP 3151: Переработка иерархии исключений ОС и ввода-вывода¶
Иерархия исключений, возникающих при ошибках операционной системы, теперь упрощена и более тонко прописана.
Вам больше не нужно беспокоиться о выборе подходящего типа исключения между OSError
, IOError
, EnvironmentError
, WindowsError
, mmap.error
, socket.error
или select.error
. Все эти типы исключений теперь только один: OSError
. Остальные имена оставлены в качестве псевдонимов по соображениям совместимости.
Кроме того, теперь стало проще поймать конкретное состояние ошибки. Вместо того чтобы проверять атрибут errno
(или args[0]
) для конкретной константы из модуля errno
, вы можете поймать соответствующий подкласс OSError
. Доступны следующие подклассы:
А сам ConnectionError
имеет более тонкие подклассы:
Благодаря новым исключениям теперь можно избежать частого использования errno
. Например, следующий код, написанный для Python 3.2:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt 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 добавлено выражение yield from
, позволяющее generator делегировать часть своих операций другому генератору. Это позволяет вычленить участок кода, содержащий 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) # Ensure the accumulator is ready to accept values
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Finish the first tally
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Finish the second tally
>>> tallies
[6, 10]
Основной принцип этого изменения заключается в том, чтобы позволить даже генераторам, предназначенным для использования с методами send
и throw
, разбиваться на несколько подгенераторов так же легко, как одна большая функция может быть разбита на несколько подфункций.
См.также
- PEP 380 - Синтаксис для делегирования полномочий подгенератору
PEP написан Грегом Юингом; реализация Грегом Юингом, интегрирована в 3.3 Рено Бланшем, Райаном Келли и Ником Когланом; документация Збигневом Ендржеевским-Шмеком и Ником Когланом
PEP 409: Подавление контекста исключений¶
PEP 409 вводит новый синтаксис, который позволяет отключить отображение контекста цепочки исключений. Это позволяет сделать более чистыми сообщения об ошибках в приложениях, которые конвертируют между типами исключений:
>>> class D:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
Без суффикса from None
, подавляющего причину, исходное исключение будет отображаться по умолчанию:
>>> class C:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
File "<stdin>", line 6, in __getattr__
KeyError: 'x'
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¶
Чтобы облегчить переход с Python 2 для приложений Python с поддержкой Юникода, которые активно используют литералы Юникода, Python 3.3 снова поддерживает префикс «u
» для строковых литералов. Этот префикс не имеет смыслового значения в Python 3, он предоставляется исключительно для того, чтобы уменьшить количество чисто механических изменений при переходе на Python 3, облегчая разработчикам задачу сосредоточиться на более значимых смысловых изменениях (таких как более строгое разделение двоичных и текстовых данных по умолчанию).
См.также
- PEP 414 - Явные литералы Юникода
Автор сценария PEP - Армин Ронахер.
PEP 3155: Квалифицированные имена для классов и функций¶
Объекты функций и классов имеют новый атрибут __qualname__
, представляющий собой «путь» от верхнего уровня модуля до их определения. Для глобальных функций и классов это то же самое, что и __name__
. Для других функций и классов он предоставляет более точную информацию о том, где они были определены, и как они могут быть доступны из глобальной области видимости.
Пример с (несвязанными) методами:
>>> class C:
... def meth(self):
... pass
...
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
Пример с вложенными классами:
>>> class C:
... class D:
... def meth(self):
... pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
Пример с вложенными функциями:
>>> def outer():
... def inner():
... pass
... return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
Строковое представление этих объектов также изменяется, чтобы включить новую, более точную информацию:
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
См.также
- PEP 3155 - Квалифицированное имя для классов и функций
PEP написан и реализован Антуаном Питру.
PEP 412: Словарь совместного использования ключей¶
Словари, используемые для хранения атрибутов объектов, теперь могут делиться друг с другом частью своей внутренней памяти (а именно, частью, хранящей ключи и соответствующие им хэши). Это уменьшает потребление памяти программами, создающими множество экземпляров нестроящихся типов.
См.также
- PEP 412 - Словарь совместного использования ключей
PEP написан и реализован Марком Шенноном.
PEP 362: Объект сигнатуры функции¶
Новая функция inspect.signature()
делает интроспекцию вызываемых объектов python простой и понятной. Поддерживается широкий спектр вызываемых объектов: функции python, декорированные или нет, классы и объекты functools.partial()
. Новые классы inspect.Signature
, inspect.Parameter
и inspect.BoundArguments
хранят информацию о сигнатурах вызовов, таких как аннотации, значения по умолчанию, виды параметров и связанные аргументы, что значительно упрощает написание декораторов и любого кода, который проверяет или изменяет сигнатуры вызовов или аргументы.
См.также
- PEP 362: - Объект сигнатуры функции
PEP написан Бреттом Кэнноном, Юрием Селивановым, Ларри Хастингсом, Дживоном Со; реализован Юрием Селивановым.
PEP 421: Добавление sys.implementation¶
Новый атрибут модуля sys
раскрывает информацию, специфичную для реализации текущего интерпретатора. Первоначальный набор атрибутов на sys.implementation
- это name
, version
, hexversion
и cache_tag
.
Цель sys.implementation
- объединить в одном пространстве имен специфические для реализации данные, используемые стандартной библиотекой. Это позволит различным реализациям Python легче использовать единую базу кода стандартной библиотеки. В исходном состоянии sys.implementation
содержит лишь небольшую часть данных, специфичных для реализации. Со временем это соотношение будет изменено, чтобы сделать стандартную библиотеку более переносимой.
Одним из примеров улучшенной переносимости стандартной библиотеки является cache_tag
. Начиная с Python 3.3, sys.implementation.cache_tag
используется importlib
для поддержки соответствия PEP 3147. Любая реализация Python, использующая importlib
для встроенной системы импорта, может использовать cache_tag
для управления поведением кэширования модулей.
SimpleNamespace¶
Реализация sys.implementation
также вводит в Python новый тип: types.SimpleNamespace
. В отличие от пространства имен, основанного на отображении, как dict
, SimpleNamespace
основано на атрибутах, как object
. Однако, в отличие от object
, экземпляры SimpleNamespace
можно записывать. Это означает, что вы можете добавлять, удалять и изменять пространство имен с помощью обычного доступа к атрибутам.
См.также
- PEP 421 - Добавление sys.implementation
PEP написан и реализован Эриком Сноу.
Использование importlib в качестве реализации импорта¶
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, что помогает покончить с любыми специфическими для ВМ отклонениями в семантике импорта. И наконец, она облегчает сопровождение импорта, позволяя развивать его в будущем.
Для обычного пользователя никаких видимых изменений в семантике быть не должно. Для тех, чей код в настоящее время манипулирует импортом или вызывает импорт программно, изменения кода, которые могут потребоваться, описаны в разделе Porting Python code этого документа.
Новые API¶
Одним из значительных преимуществ этой работы является раскрытие того, что именно обеспечивает работу оператора импорта. Это означает, что различные импортеры, которые раньше были неявными, теперь полностью раскрыты как часть пакета importlib
.
Абстрактные базовые классы, определенные в importlib.abc
, были расширены, чтобы правильно разграничить meta path finders и path entry finders, введя 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
, чтобы помочь очистить все сохраненные состояния, если это необходимо.
Видимые изменения¶
О возможных необходимых изменениях в коде см. в разделе Porting Python code.
Помимо того, что importlib
теперь открывает все возможности, есть и другие заметные изменения в импорте. Самое большое из них заключается в том, что sys.meta_path
и sys.path_hooks
теперь хранят все метапоисковики путей и крючки входа в путь, используемые импортом. Раньше искатели были неявными и скрывались в Си-коде импорта, а не выводились напрямую. Это означает, что теперь можно легко удалить или изменить порядок расположения различных искателей в соответствии со своими потребностями.
Еще одно изменение - все модули имеют атрибут __loader__
, хранящий загрузчик, использованный для создания модуля. Атрибут PEP 302 был обновлен, чтобы сделать его обязательным для реализации загрузчиками, так что в будущем, когда сторонние загрузчики будут обновлены, люди смогут полагаться на существование этого атрибута. До тех пор, однако, импорт устанавливает модуль после загрузки.
Также теперь ожидается, что загрузчики будут устанавливать атрибут __package__
, начиная с PEP 366. Опять же, импорт уже сам устанавливает этот атрибут во всех загрузчиках, начиная с importlib
, и импорт сам устанавливает атрибут после загрузки.
None
теперь вставляется в sys.path_importer_cache
, когда в sys.path_hooks
не найден ни один искатель. Поскольку imp.NullImporter
не выводится непосредственно на sys.path_hooks
, теперь нельзя полагаться на то, что он всегда будет доступен для использования в качестве значения, обозначающего отсутствие найденного искателя.
Все остальные изменения относятся к семантическим изменениям, которые следует учитывать при обновлении кода для Python 3.3, и поэтому о них следует читать в разделе Porting Python code этого документа.
(Реализация Бретта Кэннона)
Другие языковые изменения¶
Некоторые более мелкие изменения, внесенные в ядро языка Python:
Добавлена поддержка псевдонимов имен Unicode и именованных последовательностей. Теперь и
unicodedata.lookup()
, и'\N{...}'
разрешают псевдонимы имен, аunicodedata.lookup()
разрешает именованные последовательности.(Внесено Эцио Мелотти в bpo-12753).
База данных Unicode обновлена до версии UCD 6.1.0
Сравнение равенства объектов
range()
теперь возвращает результат, отражающий равенство базовых последовательностей, порожденных этими объектами диапазона. (bpo-13201)Методы
count()
,find()
,rfind()
,index()
иrindex()
объектовbytes
иbytearray
теперь принимают в качестве первого аргумента целое число от 0 до 255.(Внесено Петри Лехтиненом в bpo-12170).
Методы
rjust()
,ljust()
иcenter()
изbytes
иbytearray
теперь принимаютbytearray
для аргументаfill
. (Внесено Петри Лехтиненом в bpo-12380).Новые методы были добавлены в
list
иbytearray
:copy()
иclear()
(bpo-10516). Следовательно,MutableSequence
теперь также определяет методclear()
(bpo-11388).Литералы необработанных байтов теперь можно записывать как
rb"..."
, так иbr"..."
.(Внесено Антуаном Питру в bpo-13748).
dict.setdefault()
теперь выполняет только один поиск по заданному ключу, что делает его атомарным при использовании со встроенными типами.(Внесено Филипом Грущиньским в bpo-13521).
Значительно улучшены сообщения об ошибках, выдаваемые при несоответствии вызова функции сигнатуре функции.
(Предоставлено Бенджамином Петерсоном.)
Более тонкая блокировка импорта¶
Предыдущие версии CPython всегда полагались на глобальную блокировку импорта. Это приводило к неожиданным неприятностям, таким как тупики, когда импорт модуля вызывал выполнение кода в другом потоке в качестве побочного эффекта. Иногда использовались неуклюжие обходные пути, такие как PyImport_ImportModuleNoBlock()
функция C API.
В Python 3.3 при импорте модуля используется блокировка каждого модуля. Это корректно сериализует импорт данного модуля из нескольких потоков (предотвращая появление не полностью инициализированных модулей), устраняя при этом вышеупомянутые неудобства.
(Внесено Антуаном Питру в bpo-9260).
Встроенные функции и типы¶
open()
получает новый параметр opener: базовый дескриптор файла для файлового объекта можно получить, вызвав opener с (file, flags). С его помощью можно использовать пользовательские флаги, напримерos.O_CLOEXEC
. Был добавлен режим'x'
: открытие для эксклюзивного создания, отказ, если файл уже существует.print()
: добавлен аргумент с ключевым словом flush. Если аргумент flush равен true, поток принудительно очищается.hash()
: рандомизация хэша включена по умолчанию, см.object.__hash__()
иPYTHONHASHSEED
.Тип
str
получает новый методcasefold()
: возвращает свернутую копию строки, свернутые строки могут использоваться для бесказуального сопоставления. Например,'ß'.casefold()
возвращает'ss'
.Документация по последовательностям была существенно переписана, чтобы лучше объяснить различие между двоичными и текстовыми последовательностями и предоставить специальные разделы документации для отдельных встроенных типов последовательностей (bpo-4966).
Новые модули¶
faulthandler¶
Этот новый отладочный модуль faulthandler
содержит функции для явного сброса трассировки Python, при ошибке (сбое, например, ошибке сегментации), после тайм-аута или по сигналу пользователя. Вызовите faulthandler.enable()
, чтобы установить обработчики ошибок для сигналов SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
и SIGILL
. Вы также можете включить их при запуске, установив переменную окружения PYTHONFAULTHANDLER
или используя -X
faulthandler
опции командной строки.
Пример ошибки сегментации в Linux:
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
ipaddress¶
Новый модуль ipaddress
предоставляет инструменты для создания и манипулирования объектами, представляющими адреса IPv4 и IPv6, сети и интерфейсы (т.е. IP-адрес, связанный с определенной IP-подсетью).
(Предоставлено компанией Google и Питером Муди в PEP 3144).
lzma¶
Недавно добавленный модуль lzma
обеспечивает сжатие и распаковку данных по алгоритму LZMA, включая поддержку форматов файлов .xz
и .lzma
.
(Предоставлено Надимом Вавдой и Пером Эйвиндом Карлсеном в bpo-6715).
Улучшенные модули¶
abc¶
Улучшена поддержка абстрактных базовых классов, содержащих дескрипторы, состоящие из абстрактных методов. Рекомендуемый подход к объявлению абстрактных дескрипторов теперь заключается в предоставлении __isabstractmethod__
в качестве динамически обновляемого свойства. Встроенные дескрипторы были обновлены соответствующим образом.
abc.abstractproperty
был устаревшим, вместо него используйтеproperty
сabc.abstractmethod()
.abc.abstractclassmethod
был устаревшим, вместо него используйтеclassmethod
сabc.abstractmethod()
.abc.abstractstaticmethod
был устаревшим, вместо него используйтеstaticmethod
сabc.abstractmethod()
.
(Предоставлено Дарреном Дейлом в bpo-11610).
abc.ABCMeta.register()
теперь возвращает зарегистрированный подкласс, что означает, что его можно использовать в качестве декоратора класса (bpo-10868).
массив¶
Модуль array
поддерживает тип long long, используя коды типов q
и Q
.
(Предоставлено Ореном Тирошем и Хироказу Ямамото в bpo-1172711).
base64¶
Строки Юникода только ASCII теперь принимаются функциями декодирования современного интерфейса base64
. Например, base64.b64decode('YWJj')
возвращает b'abc'
. (Внесено Каталином Якобом в bpo-13641).
binascii¶
В дополнение к двоичным объектам, которые они обычно принимают, функции a2b_
теперь принимают на вход строки только ASCII. (Внесено Антуаном Питру в bpo-13637).
bz2¶
Модуль bz2
был переписан с нуля. В процессе работы было добавлено несколько новых функций:
Новая функция
bz2.open()
: открытие bzip2-сжатого файла в двоичном или текстовом режиме.bz2.BZ2File
теперь может читать из и записывать в произвольные файлоподобные объекты с помощью аргумента fileobj своего конструктора.(Предоставлено Nadeem Vawda в bpo-5863).
bz2.BZ2File
иbz2.decompress()
теперь могут распаковывать многопотоковые файлы (например, созданные инструментом pbzip2).bz2.BZ2File
также может быть использован для создания файлов такого типа, используя режим'a'
(append).(Предоставлено Ниром Айдесом в bpo-1625).
bz2.BZ2File
теперь реализует всеio.BufferedIOBase
API, за исключением методовdetach()
иtruncate()
.
кодеки¶
Кодек 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
был устаревшим.
коллекции¶
Добавление нового класса ChainMap
, позволяющего рассматривать ряд отображений как единое целое. (Написано Раймондом Хеттингером для bpo-11089, обнародовано в bpo-11297).
Абстрактные базовые классы были перенесены в новый модуль collections.abc
, чтобы лучше разграничить абстрактные и конкретные классы коллекций. Псевдонимы для ABC по-прежнему присутствуют в модуле collections
, чтобы сохранить существующий импорт. (bpo-11085)
Класс Counter
теперь поддерживает унарные операторы +
и -
, а также операторы in-place +=
, -=
, |=
и &=
. (Внесено Раймондом Хеттингером в bpo-13121).
contextlib¶
ExitStack
теперь обеспечивает прочную основу для программного манипулирования менеджерами контекста и подобной функциональности очистки. В отличие от предыдущего contextlib.nested
API (который был устаревшим и удален), новый API предназначен для корректной работы независимо от того, получают ли менеджеры контекста свои ресурсы в своем __init__
методе (например, файловые объекты) или в своем __enter__
методе (например, объекты синхронизации из модуля threading
).
крипта¶
Добавление соли и модульного криптоформата (метод хэширования), а также функции mksalt()
в модуль crypt
.
проклятия¶
Если модуль
curses
связан с библиотекой ncursesw, используйте функции Unicode, если передаются строки или символы Unicode (например,waddwstr()
), и функции bytes в противном случае (например,waddstr()
).Используйте кодировку локали вместо
utf-8
для кодирования строк Юникода.У
curses.window
появился новый атрибутcurses.window.encoding
.Класс
curses.window
имеет новый методget_wch()
для получения широкого символаВ модуле
curses
появилась новая функцияunget_wch()
, которая выталкивает широкий символ, чтобы следующийget_wch()
вернул его
(Предоставлено Иньиго Серна в bpo-6755).
datetime¶
Сравнение равенства между наивными и осведомленными экземплярами
datetime
теперь возвращаетFalse
, а не поднимаетTypeError
(bpo-15006).Новый метод
datetime.datetime.timestamp()
: Возвращает временную метку POSIX, соответствующую экземпляруdatetime
.Метод
datetime.datetime.strftime()
поддерживает форматирование лет старше 1000.Метод
datetime.datetime.astimezone()
теперь можно вызывать без аргументов для преобразования экземпляра datetime в системный часовой пояс.
десятичная¶
- bpo-7652 - интегрировать быструю встроенную десятичную арифметику.
C-модуль и libmpdec написаны Стефаном Крахом.
В новую версию модуля decimal на языке C интегрирована высокоскоростная библиотека libmpdec для произвольной точности корректно округленной десятичной арифметики с плавающей запятой. libmpdec соответствует спецификации IBM General Decimal Arithmetic Specification.
Прирост производительности варьируется от 10 раз для приложений баз данных до 100 раз для приложений с интенсивным числом. Эти цифры - ожидаемый прирост для стандартной точности, используемой в десятичной арифметике с плавающей запятой. Поскольку точность настраивается пользователем, точные цифры могут отличаться. Например, в целочисленной двоичной арифметике разница может быть значительно выше.
Следующая таблица приведена в качестве иллюстрации. Бенчмарки доступны на сайте https://www.bytereef.org/mpdecimal/quickstart.html.
decimal.py
_decimal
ускорение
pi
42.02s
0.345s
120x
телеком
172.19s
5.68s
30x
psycopg
3.57s
0.29s
12x
Характеристики¶
Сигнал
FloatOperation
опционально включает более строгую семантику для смешивания плавающих и десятичных чисел.Если Python скомпилирован без потоков, то в версии C автоматически отключается дорогостоящий механизм локального контекста потоков. В этом случае переменная
HAVE_THREADS
устанавливается в значениеFalse
.
Изменения в API¶
Модуль 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()
, чтобы получить округленное или неточное значение.Функция power в decimal.py всегда округляется правильно. В версии на C она определяется в терминах правильно округленных функций
exp()
иln()
, но конечный результат только «почти всегда правильно округлен».В версии на языке C словарь контекста, содержащий сигналы, представляет собой
MutableMapping
. По соображениям скоростиflags
иtraps
всегда ссылаются на тот жеMutableMapping
, которым был инициализирован контекст. Если назначается новый словарь сигналов,flags
иtraps
обновляются новыми значениями, но они не ссылаются на словарь RHS.Пикировка
Context
дает другой вывод, чтобы иметь общий формат обмена для версий Python и C.Порядок аргументов в конструкторе
Context
был изменен, чтобы соответствовать порядку, отображаемому вrepr()
.Параметр
watchexp
в методеquantize()
устарел.
e-mail¶
Основы политики¶
Теперь у почтового пакета есть каркас policy
. Политика Policy
- это объект с несколькими методами и свойствами, которые управляют поведением почтового пакета. Основной политикой для Python 3.3 является политика Compat32
, которая обеспечивает обратную совместимость с почтовым пакетом в Python 3.2. Политика policy
может быть указана при разборе почтового сообщения с помощью parser
, при создании объекта Message
или при сериализации письма с помощью generator
. Если политика, переданная в parser
, не переопределена, она наследуется всеми объектами Message
и субобъектами, созданными parser
. По умолчанию generator
будет использовать политику сериализуемого объекта Message
. По умолчанию используется политика compat32
.
Минимальный набор элементов управления, реализуемый всеми объектами policy
, таков:
max_line_length |
Максимальная длина отдельных строк, исключая символ(ы) linesep, которую могут иметь отдельные строки при сериализации |
lineep |
Символ, используемый для разделения отдельных строк при сериализации |
cte_type |
|
повышение_на_дефект |
Заставляет |
Новый экземпляр политики с новыми настройками создается с помощью метода clone()
для объектов политики. Метод clone
принимает любой из перечисленных выше элементов управления в качестве аргумента ключевого слова. Любой элемент управления, не указанный в вызове, сохраняет свое значение по умолчанию. Таким образом, вы можете создать политику, использующую символы строк \r\n
, например:
mypolicy = compat32.clone(linesep='\r\n')
Политики можно использовать для упрощения процесса генерации сообщений в формате, необходимом вашему приложению. Вместо того чтобы помнить о необходимости указывать linesep='\r\n'
во всех местах вызова generator
, вы можете указать его один раз, когда задаете политику, используемую parser
или Message
, в зависимости от того, что ваша программа использует для создания объектов Message
. С другой стороны, если вам нужно генерировать сообщения в нескольких формах, вы все равно можете указать параметры в соответствующем вызове generator
. Или вы можете создать собственные экземпляры политики для разных случаев и передать их при создании generator
.
Временная политика с новым API для заголовков¶
Хотя фреймворк политик достоин сам по себе, основная мотивация его введения заключается в том, чтобы позволить создавать новые политики, реализующие новые возможности почтового пакета, таким образом, чтобы сохранить обратную совместимость для тех, кто не использует новые политики. Поскольку новые политики вводят новый API, мы выпускаем их в Python 3.3 в виде provisional policy. Изменения обратной совместимости (вплоть до удаления кода) могут быть внесены, если разработчики ядра сочтут это необходимым.
Новые политики являются экземплярами 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'),))
В итоге, если вы используете одну из новых политик, работа с заголовками будет работать так, как и должна: ваше приложение работает со строками юникода, а почтовый пакет прозрачно кодирует и декодирует юникод в стандартные кодировки передачи содержимого RFC и обратно.
Другие изменения API¶
Новый BytesHeaderParser
, добавленный к модулю parser
, чтобы дополнить HeaderParser
и завершить API байтов.
Новые функции полезности:
format_datetime()
: при заданииdatetime
выдает строку, отформатированную для использования в заголовке электронной почты.parsedate_to_datetime()
: при получении строки даты из заголовка электронной почты преобразуйте ее в значащуюdatetime
или наивнуюdatetime
, если смещение равно-0000
.localtime()
: Без аргумента возвращает текущее местное время в виде awaredatetime
, используя localtimezone
. Если задано значение awaredatetime
, преобразует его в awaredatetime
, используя локальноеtimezone
.
ftplib¶
ftplib.FTP
теперь принимает аргумент с ключевым словомsource_address
, чтобы указать(host, port)
для использования в качестве адреса источника в вызове bind при создании исходящего сокета. (Внесено Джампаоло Родола в bpo-8594).Класс
FTP_TLS
теперь предоставляет новую функциюccc()
для возврата канала управления обратно в открытый текст. Это может быть полезно для использования преимуществ брандмауэров, которые умеют обрабатывать NAT с небезопасным FTP без открытия фиксированных портов. (Внесено Джампаоло Родола в bpo-12139).Добавлен метод
ftplib.FTP.mlsd()
, который обеспечивает разборчивый формат списка каталогов, и отмененыftplib.FTP.nlst()
иftplib.FTP.dir()
. (Внесен Джампаоло Родола в bpo-11072).
functools¶
Декоратор functools.lru_cache()
теперь принимает аргумент с ключевым словом typed
(по умолчанию False
), чтобы гарантировать, что он кэширует значения разных типов, которые сравниваются одинаково, в отдельных слотах кэша. (Внесено Раймондом Хеттингером в bpo-13227).
gc¶
Теперь можно регистрировать обратные вызовы, вызываемые сборщиком мусора до и после сборки, используя новый список callbacks
.
hmac¶
Добавлена новая функция compare_digest()
для предотвращения атак через побочные каналы на дайджесты с помощью анализа времени. (Вклад Ника Коглана и Кристиана Хаймса в bpo-15061).
http¶
http.server.BaseHTTPRequestHandler
теперь буферизирует заголовки и записывает их все сразу при вызове end_headers()
. Новый метод flush_headers()
можно использовать для прямого управления отправкой накопленных заголовков. (Внесено Эндрю Шаафом в bpo-3709).
http.server
теперь выводит корректный HTML 4.01 strict
. (Внесено Эцио Мелотти в bpo-13295).
У http.client.HTTPResponse
теперь есть метод readinto()
, а значит, его можно использовать как класс io.RawIOBase
. (Внесено Джоном Куном в bpo-13464).
html¶
html.parser.HTMLParser
теперь может разбирать неполную разметку без возникновения ошибок, поэтому аргумент strict конструктора и исключение HTMLParseError
теперь устарели. Возможность разбора неполной разметки является результатом исправления ряда ошибок, которые также доступны в последних релизах Python 2.7/3. 2. (Вклад Эцио Мелотти в bpo-15114, а также bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311).
В модуль html.entities
был добавлен новый словарь html5
, который сопоставляет ссылки на именованные символы HTML5 с эквивалентными символами Unicode (например, html5['gt;'] == '>'
). Теперь этот словарь также используется модулем HTMLParser
. (Внесено Эцио Мелотти в bpo-11113 и bpo-15156).
imaplib¶
Конструктор IMAP4_SSL
теперь принимает параметр SSLContext для управления параметрами защищенного канала.
(Предоставлено Sijin Joseph в bpo-8808).
осмотреть¶
Добавлена новая функция getclosurevars()
. Эта функция сообщает о текущей привязке всех имен, на которые ссылается тело функции, и о том, где эти имена были разрешены, что облегчает проверку правильности внутреннего состояния при тестировании кода, который полагается на закрытия с состоянием.
(При участии Меадора Инге и Ника Коглана в bpo-13062).
Добавлена новая функция getgeneratorlocals()
. Эта функция сообщает текущую привязку локальных переменных в стековом фрейме генератора, что облегчает проверку корректности внутреннего состояния при тестировании генераторов.
(Предоставлено Meador Inge в bpo-15153).
io¶
Функция open()
имеет новый режим 'x'
, который может использоваться исключительно для создания нового файла и вызывать ошибку FileExistsError
, если файл уже существует. Он основан на режиме C11 „x“ для функции fopen().
(Внесено Дэвидом Тауншендом в bpo-12760).
В конструкторе класса TextIOWrapper
появился новый необязательный аргумент write_through. Если write_through равен True
, вызовы write()
гарантированно не буферизируются: любые данные, записанные в объект TextIOWrapper
, немедленно обрабатываются в его базовом двоичном буфере.
itertools¶
accumulate()
теперь принимает необязательный аргумент func
для предоставления двоичной функции, заданной пользователем.
ведение журнала¶
Функция basicConfig()
теперь поддерживает дополнительный аргумент handlers
, принимающий итерацию обработчиков, которые должны быть добавлены к корневому логгеру.
Атрибут уровня класса append_nul
был добавлен к SysLogHandler
, чтобы позволить контролировать добавление NUL
(\000
) байта к записям syslog, поскольку для некоторых демонов это необходимо, а для других - передается в журнал.
математика¶
В модуле math
появилась новая функция log2()
, которая возвращает логарифм по основанию 2 от x.
(Написано Марком Дикинсоном в bpo-11888).
mmap¶
Метод read()
теперь более совместим с другими файлоподобными объектами: если аргумент опущен или указан как None
, он возвращает байты от текущей позиции файла до конца отображения. (Внесено Петри Лехтиненом в bpo-12021).
многопроцессорная обработка¶
Новая функция multiprocessing.connection.wait()
позволяет опрашивать несколько объектов (таких как соединения, сокеты и трубы) с таймаутом. (Внесено Ричардом Оудкерком в bpo-12328).
Объекты multiprocessing.Connection
теперь можно передавать по многопроцессорным соединениям. (Внесено Ричардом Оудкерком в bpo-4892).
multiprocessing.Process
теперь принимает аргумент с ключевым словом daemon
, чтобы отменить поведение по умолчанию, когда флаг daemon
наследуется от родительского процесса (bpo-6064).
Новый атрибут multiprocessing.Process.sentinel
позволяет программе ожидать несколько объектов Process
одновременно, используя соответствующие примитивы ОС (например, select
в системах posix).
Новые методы multiprocessing.pool.Pool.starmap()
и starmap_async()
предоставляют itertools.starmap()
эквиваленты существующих функций multiprocessing.pool.Pool.map()
и map_async()
. (Внесено Хинеком Шлаваком в bpo-12708).
nntplib¶
Класс nntplib.NNTP
теперь поддерживает протокол управления контекстом для безусловного поглощения исключений socket.error
и закрытия NNTP-соединения по завершении работы:
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
... n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
(Предоставлено Giampaolo Rodolà в bpo-9795).
os¶
В модуле
os
появилась новая функцияpipe2()
, позволяющая атомарно создавать трубу с установленными флагамиO_CLOEXEC
илиO_NONBLOCK
. Это особенно полезно для предотвращения условий гонки в многопоточных программах.В модуле
os
появилась новая функцияsendfile()
, которая обеспечивает эффективный способ копирования данных из одного дескриптора файла (или сокета) в другой. Фраза «zero-copy» относится к тому факту, что все копирование данных между двумя дескрипторами выполняется полностью ядром, без копирования данных в буферы пользовательского пространства.sendfile()
может использоваться для эффективного копирования данных из файла на диске в сетевой сокет, например, для загрузки файла.(Патч прислали Росс Лагеруолл и Джампаоло Родола в bpo-10882).
Чтобы избежать условий гонки, таких как атаки симлинков и проблемы с временными файлами и каталогами, надежнее (а также быстрее) работать с дескрипторами файлов, а не с именами файлов. В Python 3.3 улучшены существующие функции и введены новые функции для работы с дескрипторами файлов (bpo-4761, bpo-10755 и bpo-14626).
В модуле
os
появилась новая функцияfwalk()
, аналогичнаяwalk()
, за исключением того, что она также выдает дескрипторы файлов, ссылающиеся на посещенные каталоги. Это особенно полезно для предотвращения гонок симлинков.Следующие функции получают новые необязательные dir_fd (paths relative to directory descriptors) и/или follow_symlinks (not following 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
.Следующие функции теперь поддерживают файловый дескриптор в качестве аргумента 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()
. Они могут использоваться для получения или установки приоритета процесса, аналогичноos.nice()
, но распространяясь на все процессы, а не только на текущий.(Патч прислал Джампаоло Родола в bpo-10784).
Новая функция
os.replace()
позволяет переименовать файл с перезаписью места назначения. С помощьюos.rename()
существующий файл назначения перезаписывается в POSIX, но вызывает ошибку в Windows. (Внесено Антуаном Питру в bpo-8828).Семейство функций stat (
stat()
,fstat()
иlstat()
) теперь поддерживает чтение временных меток файла с точностью до наносекунды. Симметрично,utime()
теперь может записывать временные метки файлов с наносекундной точностью. (Внесено Ларри Гастингсом в bpo-14127).Новая функция
os.get_terminal_size()
запрашивает размер терминала, прикрепленного к дескриптору файла. См. такжеshutil.get_terminal_size()
. (Внесено Збигневом Енджеевским-Шмеком в bpo-13609).
Новые функции для поддержки расширенных атрибутов Linux (bpo-12720):
getxattr()
,listxattr()
,removexattr()
,setxattr()
.Новый интерфейс для планировщика. Эти функции управляют тем, как операционная система выделяет процессу процессорное время. Новые функции:
sched_get_priority_max()
,sched_get_priority_min()
,sched_getaffinity()
,sched_getparam()
,sched_getscheduler()
,sched_rr_get_interval()
,sched_setaffinity()
,sched_setparam()
,sched_setscheduler()
,sched_yield()
,Новые функции для управления файловой системой:
posix_fadvise()
: Сообщает о намерении получить доступ к данным по определенной схеме, что позволяет ядру произвести оптимизацию.posix_fallocate()
: Убеждается, что для файла выделено достаточно места на диске.sync()
: Принудительная запись всего на диск.
Дополнительные новые функции posix:
lockf()
: Наложение, проверка или снятие POSIX-блокировки на открытый дескриптор файла.pread()
: Чтение из дескриптора файла по смещению, при этом смещение файла остается неизменным.pwrite()
: Запись в дескриптор файла со смещения, оставляя смещение файла неизменным.readv()
: Чтение из дескриптора файла в несколько буферов, доступных для записи.truncate()
: Усечь файл, соответствующий path, так, чтобы его размер был не более length байт.waitid()
: Ожидание завершения одного или нескольких дочерних процессов.writev()
: Запись содержимого buffers в дескриптор файла, где buffers - произвольная последовательность буферов.getgrouplist()
(bpo-9344): Возвращает список идентификаторов групп, к которым принадлежит указанный пользователь.
times()
иuname()
: Тип возврата изменен с кортежа на кортежеподобный объект с именованными атрибутами.Некоторые платформы теперь поддерживают дополнительные константы для функции
lseek()
, такие какos.SEEK_HOLE
иos.SEEK_DATA
.Новые константы
RTLD_LAZY
,RTLD_NOW
,RTLD_GLOBAL
,RTLD_LOCAL
,RTLD_NODELETE
,RTLD_NOLOAD
иRTLD_DEEPBIND
доступны на платформах, которые их поддерживают. Они предназначены для использования с функциейsys.setdlopenflags()
и заменяют аналогичные константы, определенные вctypes
иDLFCN
. (Внесено Виктором Стиннером в bpo-13226).os.symlink()
теперь принимает (и игнорирует) аргумент ключевого словаtarget_is_directory
на платформах, отличных от Windows, чтобы облегчить кроссплатформенную поддержку.
pdb¶
Завершение табуляции теперь доступно не только для имен команд, но и для их аргументов. Например, для команды break
заполняются имена функций и файлов.
(Внесено Георгом Брандлом в bpo-14210)
маринованный огурец¶
Объекты pickle.Pickler
теперь имеют необязательный атрибут dispatch_table
, позволяющий задавать функции сокращения для каждого пиклера.
(Внесено Ричардом Оудкерком в bpo-14166).
pydoc¶
Графический интерфейс Tk и функция serve()
были удалены из модуля pydoc
: pydoc -g
и serve()
были устаревшими в Python 3.2.
re¶
Регулярные выражения str
теперь поддерживают экранирование \u
и \U
.
(Предоставлено Serhiy Storchaka в bpo-3665).
расписание¶
run()
теперь принимает параметр blocking, который при установке значения false заставляет метод выполнять запланированные события, которые истекут раньше всего (если таковые имеются), а затем немедленно возвращаться. Это полезно в том случае, если вы хотите использоватьscheduler
в неблокирующих приложениях. (Внесено Джампаоло Родола в bpo-13449).Класс
scheduler
теперь можно безопасно использовать в многопоточных средах. (Внесено Джосайей Карлсоном и Джампаоло Родола в bpo-8684).Параметры timefunc и delayfunct конструктора класса
scheduler
теперь необязательны и имеют значения по умолчаниюtime.time()
иtime.sleep()
соответственно. (Внесено Крисом Кларком в bpo-13245).enter()
иenterabs()
Параметр argument теперь необязателен. (Внесено Крисом Кларком в bpo-13245).enter()
иenterabs()
теперь принимают параметр kwargs. (Внесено Крисом Кларком в bpo-13245).
выберите¶
В Solaris и производных платформах появился новый класс select.devpoll
для высокопроизводительных асинхронных сокетов через /dev/poll
. (Внесено Хесусом Сеа Авионом в bpo-6397).
shlex¶
Ранее недокументированная вспомогательная функция quote
из модулей pipes
была перенесена в модуль shlex
и задокументирована. quote()
правильно экранирует все символы в строке, которым оболочка может придать особое значение.
ШУТИЛ¶
Новые функции:
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()
. (Вклад Мартина фон Лёвиса и Хинека Шлавака в bpo-4489).
сигнал¶
В модуле
signal
появились новые функции:pthread_sigmask()
: получение и/или изменение маски сигнала вызывающего потока (Внесено Жан-Полем Кальдероном в bpo-8407);pthread_kill()
: отправить сигнал потоку;sigpending()
: изучить ожидающие функции;sigwait()
: ожидание сигнала;sigwaitinfo()
: ожидание сигнала, возвращение подробной информации о нем;sigtimedwait()
: какsigwaitinfo()
, но с тайм-аутом.
Обработчик сигналов записывает в дескриптор файла пробуждения номер сигнала в виде одного байта, а не nul-байта. Таким образом, можно ожидать более одного сигнала и знать, какие сигналы были вызваны.
signal.signal()
иsignal.siginterrupt()
вызывают OSError, а не RuntimeError: OSError имеет атрибут errno.
smtpd¶
Модуль smtpd
теперь поддерживает RFC 5321 (расширенный SMTP) и RFC 1870 (расширение размера). Согласно стандарту, эти расширения включаются тогда и только тогда, когда клиент инициирует сессию командой EHLO
.
(Первоначальная поддержка ELHO
от Альберто Тревино. Расширение размера - Юхана Яухиайнен. Существенный дополнительный вклад в работу над патчем внесли Микеле Орру и Дэн Босвелл. bpo-8739)
smtplib¶
Классы SMTP
, SMTP_SSL
и LMTP
теперь принимают аргумент с ключевым словом source_address
для указания адреса источника (host, port)
в вызове bind при создании исходящего сокета. (Внесено Пауло Скардином в bpo-11281).
SMTP
теперь поддерживает протокол управления контекстом, позволяя использовать экземпляр SMTP
в операторе with
. (Внесено Джампаоло Родола в bpo-11289).
Конструктор SMTP_SSL
и метод starttls()
теперь принимают параметр SSLContext для управления параметрами защищенного канала. (Внесено Касуном Гератом в bpo-8809).
сокет¶
Класс
socket
теперь предоставляет дополнительные методы для обработки вспомогательных данных, если они поддерживаются базовой платформой:(Внесено Дэвидом Уотсоном в bpo-6560, основано на более раннем исправлении Хейко Вундрама)
Класс
socket
теперь поддерживает семейство протоколов PF_CAN (https://en.wikipedia.org/wiki/Socketcan), в Linux (https://lwn.net/Articles/253425).(Внесено Маттиасом Фуксом, обновлено Тиаго Гонсалвесом в bpo-10141).
Класс
socket
теперь поддерживает семейство протоколов PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets и https://oss.oracle.com/projects/rds).Класс
socket
теперь поддерживает семейство протоколовPF_SYSTEM
в OS X. (Внесено Майклом Годербауэром в bpo-13777).Новая функция
sethostname()
позволяет устанавливать имя хоста на Unix-системах, если вызывающий процесс обладает достаточными привилегиями. (Внесено Россом Лагеруоллом в bpo-10866).
сокетсервер¶
У BaseServer
теперь есть переопределяемый метод service_actions()
, который вызывается методом serve_forever()
в цикле обслуживания. ForkingMixIn
теперь использует его для очистки зомбированных дочерних процессов. (Внесено Джастином Варкентином в bpo-11109).
sqlite3¶
Новый метод sqlite3.Connection
set_trace_callback()
можно использовать для получения трассировки всех sql-команд, обрабатываемых sqlite. (Внесено Торстеном Ландшоффом в bpo-11688).
ssl¶
В модуле
ssl
появились две новые функции генерации случайных чисел:RAND_bytes()
: генерировать криптографически сильные псевдослучайные байты.RAND_pseudo_bytes()
: генерировать псевдослучайные байты.
(Внесено Виктором Стиннером в bpo-12049).
Модуль
ssl
теперь раскрывает более тонкую иерархию исключений, чтобы упростить проверку различных видов ошибок. (Внесено Антуаном Питру в bpo-11183).load_cert_chain()
теперь принимает аргумент пароль, который будет использоваться, если закрытый ключ зашифрован. (Внесено Адамом Симпкинсом в bpo-12803).Обмен ключами Диффи-Хеллмана, как обычными, так и на основе эллиптической кривой, теперь поддерживается методами
load_dh_params()
иset_ecdh_curve()
. (Вклад Антуана Питру в bpo-13626 и bpo-13627).В сокетах SSL появился новый метод
get_channel_binding()
, позволяющий реализовать некоторые механизмы аутентификации, такие как SCRAM-SHA-1-PLUS. (Внесено Яцеком Конечны в bpo-12551).Вы можете запросить алгоритм сжатия SSL, используемый сокетом SSL, благодаря новому методу
compression()
. Новый атрибутOP_NO_COMPRESSION
можно использовать для отключения сжатия. (Внесено Антуаном Питру в bpo-13634).Добавлена поддержка расширения Next Protocol Negotiation с использованием метода
ssl.SSLContext.set_npn_protocols()
. (Внесено Колином Марком в bpo-14204).Теперь ошибки SSL можно легче обнаружить благодаря атрибутам
library
иreason
. (Внесено Антуаном Питру в bpo-14837).Функция
get_server_certificate()
теперь поддерживает IPv6. (Внесено Шарлем-Франсуа Натали в bpo-11811).Новый атрибут
OP_CIPHER_SERVER_PREFERENCE
позволяет настроить серверные сокеты SSLv3 так, чтобы они использовали предпочтения сервера по порядку шифров, а не клиента (bpo-13635).
статистика¶
Недокументированная функция tarfile.filemode была перемещена в stat.filemode()
. С ее помощью можно преобразовать режим файла в строку вида „-rwxrwxrwx“.
(Предоставлено Giampaolo Rodolà в bpo-14807).
struct¶
Модуль struct
теперь поддерживает ssize_t
и size_t
с помощью новых кодов n
и N
соответственно. (Внесено Антуаном Питру в bpo-3163).
подпроцесс¶
Командные строки теперь могут быть объектами байтов на платформах posix. (Внесено Виктором Стиннером в bpo-8513).
Новая константа DEVNULL
позволяет подавлять вывод в независимости от платформы. (Внесено Россом Лагеруоллом в bpo-5870).
sys¶
Модуль sys
имеет новый thread_info
named tuple, содержащий информацию о реализации потока (bpo-11223).
tarfile¶
tarfile
теперь поддерживает кодировку lzma
через модуль lzma
. (Внесено Ларсом Густебелем в bpo-5689).
tempfile¶
Метод tempfile.SpooledTemporaryFile
's truncate()
теперь принимает параметр size
. (Внесено Райаном Келли в bpo-9957).
textwrap¶
В модуле textwrap
появился новый indent()
, позволяющий добавлять общий префикс к выделенным строкам в блоке текста (bpo-13857).
нарезка резьбы¶
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
в stdlib. Сторонний код, использующий _thread.get_ident
, также должен быть изменен для использования нового публичного интерфейса.
время¶
Модуль PEP 418 добавил новые функции к модулю time
:
get_clock_info()
: Получение информации о часах.monotonic()
: Монотонные часы (не могут идти назад), не зависят от обновления системных часов.perf_counter()
: Счетчик производительности с максимальным доступным разрешением для измерения короткой длительности.process_time()
: Сумма системного и пользовательского процессорного времени текущего процесса.
Другие новые функции:
Функции
clock_getres()
,clock_gettime()
иclock_settime()
с константамиCLOCK_xxx
. (Внесено Виктором Стиннером в bpo-10278).
Чтобы улучшить кроссплатформенную совместимость, sleep()
теперь выдает ValueError
при передаче отрицательного значения сна. Ранее это было ошибкой на posix, но приводило к бесконечному сну на Windows.
типы¶
Добавьте новый класс 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
поддерживает больше «браузеров»: 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).
Оптимизации¶
Добавлены значительные улучшения производительности:
Благодаря PEP 393 были оптимизированы некоторые операции над строками Юникода:
объем памяти делится на 2 - 4 в зависимости от текста
кодировать строку ASCII в UTF-8 больше не нужно кодировать символы, представление UTF-8 используется совместно с представлением ASCII
оптимизирован кодировщик UTF-8
повторение одной буквы ASCII и получение подстроки строки ASCII в 4 раза быстрее
Кодировка UTF-8 теперь работает в 2-4 раза быстрее. Кодирование UTF-16 теперь происходит в 10 раз быстрее.
(Предоставлено Сергеем Сторчакой, bpo-14624, bpo-14738 и bpo-15026).
Изменения в сборке и C API¶
Изменения в процессе сборки Python и в C API включают:
Новая функция, связанная с PEP 3118:
PEP 393 добавлены новые типы, макросы и функции Unicode:
Высокоуровневый API:
Низкоуровневый API:
Структуры
PyASCIIObject
иPyCompactUnicodeObject
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
PyArg_ParseTuple
теперь принимаетbytearray
для форматаc
(bpo-12380).
Утратившие актуальность¶
Неподдерживаемые операционные системы¶
OS/2 и VMS больше не поддерживаются из-за отсутствия сопровождающего.
Платформы Windows 2000 и Windows, установившие значение COMSPEC
на command.com
, больше не поддерживаются в связи с необходимостью технического обслуживания.
Поддержка OSF, которая была устаревшей в 3.2, была полностью удалена.
Утратившие актуальность модули, функции и методы Python¶
Передача непустой строки в
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: Windows bytes API был устаревшим в модуле
os
. Используйте имена файлов Unicode вместо имен файлов bytes, чтобы больше не зависеть от кодовой страницы 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()
, так как файлы байткода теперь хранят и время модификации, и размер исходного файла, из которого был скомпилирован файл байткода.
Утраченные функции и типы API языка C¶
Тип Py_UNICODE
был устаревшим по сравнению с PEP 393 и будет удален в Python 4. Все функции, использующие этот тип, устарели:
Функции и методы Юникода, использующие типы 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()
Утраченные функции¶
Код формата array
модуля 'u'
теперь устарел и будет удален в Python 4 вместе с остальной частью (Py_UNICODE
) API.
Переход на Python 3.3¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Перенос кода Python¶
Рандомизация хэша включена по умолчанию. Установите переменную окружения
PYTHONHASHSEED
в значение0
, чтобы отключить рандомизацию хэша. См. также методobject.__hash__()
.bpo-12326: В Linux sys.platform больше не содержит основной версии. Теперь это всегда „linux“, а не „linux2“ или „linux3“ в зависимости от версии Linux, используемой для сборки Python. Замените sys.platform == „linux2“ на sys.platform.startswith(„linux“), или прямо sys.platform == „linux“, если вам не нужна поддержка старых версий Python.
bpo-13847, bpo-14180:
time
иdatetime
:OverflowError
теперь выдается вместоValueError
, если временная метка выходит за пределы диапазона.OSError
теперь вызывается, если функции Cgmtime()
илиlocaltime()
не сработали.Поисковики по умолчанию, используемые при импорте, теперь используют кэш того, что содержится в определенном каталоге. Если вы создаете файл исходного кода Python или файл байткода без источника, обязательно вызовите
importlib.invalidate_caches()
, чтобы очистить кэш, чтобы поисковики заметили новый файл.ImportError
теперь использует полное имя модуля, который пытались импортировать. Доктесты, проверяющие сообщение ImportErrors, нужно будет обновить, чтобы они использовали полное имя модуля, а не только хвост имени.Аргумент index в
__import__()
теперь по умолчанию принимает значение 0 вместо -1 и больше не поддерживает отрицательные значения. По недосмотру при реализации PEP 328 значение по умолчанию оставалось -1. Если вам нужно продолжать выполнять относительный импорт с последующим абсолютным импортом, выполните относительный импорт с индексом 1, а затем другой импорт с индексом 0. Предпочтительнее, однако, использоватьimportlib.import_module()
, а не вызывать__import__()
напрямую.__import__()
больше не позволяет использовать значение индекса, отличное от 0, для модулей верхнего уровня. Например,__import__('sys', level=1)
теперь является ошибкой.Поскольку на
sys.meta_path
иsys.path_hooks
теперь по умолчанию установлены искатели, для добавления в эти списки вы, скорее всего, захотите использоватьlist.insert()
, а неlist.append()
.Поскольку
None
теперь вставляется вsys.path_importer_cache
, если вы очищаете записи в словаре путей, у которых нет finder, вам нужно будет удалить ключи, сопряженные со значениямиNone
иimp.NullImporter
, чтобы обеспечить обратную совместимость. Это приведет к дополнительным накладным расходам в старых версиях Python, которые повторно вставляютNone
вsys.path_importer_cache
, где он представляет использование неявных искателей, но семантически это ничего не должно изменить.В
importlib.abc.Finder
больше не указывается абстрактный методfind_module()
, который должен быть реализован. Если вы рассчитывали на то, что подклассы реализуют этот метод, сначала проверьте его существование. Однако в случае работы с path entry finders вам, вероятно, захочется сначала проверить наличиеfind_loader()
.pkgutil
был преобразован для внутреннего использованияimportlib
. Это устраняет многие крайние случаи, когда старое поведение эмуляции импорта PEP 302 не соответствовало поведению реальной системы импорта. Сама эмуляция импорта по-прежнему присутствует, но уже устарела. Функцииpkgutil.iter_importers()
иpkgutil.walk_packages()
являются специальным случаем стандартных крючков импорта, поэтому они по-прежнему поддерживаются, даже если не предоставляют нестандартный методiter_modules()
.Давняя ошибка (bpo-1079) в разборе, выполняемом
email.header.decode_header()
в соответствии с RFC, была исправлена. Код, использующий стандартную идиому для преобразования кодированных заголовков в юникод (str(make_header(decode_header(h))
), не увидит изменений, но код, просматривающий отдельные кортежи, возвращаемые decode_header, увидит, что пробельные символы, предшествующие или следующие за секциямиASCII
, теперь включаются в секциюASCII
. Код, который строит заголовки с помощьюmake_header
, также должен продолжать работать без изменений, посколькуmake_header
продолжает добавлять пробельные символы между секциямиASCII
и не``ASCII``, если они еще не присутствуют во входных строках.email.utils.formataddr()
теперь правильно передает кодировку при передаче не``ASCII`` имен отображения. Любой код, зависящий от предыдущего ошибочного поведения, которое сохраняло не``ASCII`` юникод в форматированной выходной строке, необходимо изменить (bpo-1690608).poplib.POP3.quit()
теперь может вызывать ошибки протокола, как и все остальные методыpoplib
. Код, предполагающий, чтоquit
не вызывает ошибокpoplib.error_proto
, может потребовать изменений, если ошибки наquit
встречаются в конкретном приложении (bpo-11291).Аргумент
strict
дляemail.parser.Parser
, устаревший со времен Python 2.4, наконец-то был удален.Устаревший метод
unittest.TestCase.assertSameElements
был удален.Устаревшая переменная
time.accept2dyear
была удалена.Устаревший атрибут
Context._clamp
был удален из модуляdecimal
. Ранее он был заменен публичным атрибутомclamp
(см. bpo-8540).Недокументированный внутренний класс-помощник
SSLFakeFile
был удален изsmtplib
, поскольку его функциональность уже давно обеспечивается непосредственноsocket.socket.makefile()
.Передача отрицательного значения в
time.sleep()
в Windows теперь приводит к ошибке, а не к вечному сну. На posix это всегда приводило к ошибке.Константа
ast.__version__
была удалена. Если вам нужно принимать решения, на которые влияет версия AST, используйтеsys.version_info
.Код, который раньше обходил тот факт, что модуль
threading
использовал фабричные функции, подклассифицируя приватные классы, должен будет измениться, чтобы подклассифицировать теперь публичные классы.Недокументированные механизмы отладки в модуле threading были удалены, что упростило код. Это не должно повлиять на рабочий код, но упоминается здесь на случай, если с ним взаимодействовали какие-либо отладочные фреймворки приложений (bpo-13550).
Перенос кода на языке C¶
В ходе изменений в API буфера был удален недокументированный член
smalltable
из структурыPy_buffer
и изменено расположениеPyMemoryViewObject
.Все расширения, полагающиеся на соответствующие части в
memoryobject.h
илиobject.h
, должны быть перестроены.В связи с появлением PEP 393 тип
Py_UNICODE
и все функции, использующие этот тип, устарели (но будут доступны еще как минимум пять лет). Если вы использовали низкоуровневые Unicode API для построения и доступа к объектам юникода и хотите воспользоваться преимуществами сокращения объема памяти, обеспечиваемыми PEP 393, вам придется перевести свой код на новый Unicode API.Однако если вы использовали только высокоуровневые функции, такие как
PyUnicode_Concat()
,PyUnicode_Join()
илиPyUnicode_FromFormat()
, ваш код будет автоматически использовать преимущества новых юникодных представлений.PyImport_GetMagicNumber()
теперь возвращает-1
при неудаче.Поскольку отрицательное значение аргумента level для
__import__()
больше недействительно, то же самое теперь справедливо и дляPyImport_ImportModuleLevel()
. Это также означает, что значение level, используемоеPyImport_ImportModuleEx()
, теперь равно0
, а не-1
.
Пристройки к зданию C¶
Диапазон возможных имен файлов для расширений C был сужен. Очень редко используемые написания были подавлены: согласно POSIX, файлы с именами
xxxmodule.so
,xxxmodule.abi3.so
иxxxmodule.cpython-*.so
больше не распознаются как реализующие модульxxx
. Если вы генерировали такие файлы, вам придется перейти на другие написания (т. е. удалить строкуmodule
из имен файлов).(реализовано в bpo-14040).
Изменения в переключателях командной строки¶
Флаг командной строки -Q и связанные с ним артефакты были удалены. Код, проверяющий sys.flags.division_warning, потребует обновления.
(bpo-10998, предоставлено Éric Araujo.)
Когда python запускается вместе с
-S
,import site
больше не будет добавлять пути для конкретного сайта в пути поиска модулей. В предыдущих версиях это происходило.(bpo-11591, предоставлено Карлом Мейером и отредактировано Эриком Араужо).