Что нового в 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.
Значительно улучшенные библиотечные модули:
Ускоритель языка Си для модуля 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 была значительно улучшена.
Новая реализация просмотра памяти полностью исправляет все проблемы с владением и временем жизни динамически выделяемых полей в структуре 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, никаких отрицательных сторон у этого изменения быть не должно.
Со стороны C API, 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
, которое можно использовать для запуска приложений 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 написан Марком Хаммондом и Мартином в. Лёвисом; реализация - Винаем Саджипом.
PEP написан Марком Хаммондом и Мартином в. Лёвисом; реализация - Винаем Саджипом.
Модификация 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 - Переработка иерархии исключений ОС и IO
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 написан Итаном Фурманом; реализован Итаном Фурманом и Ником Когланом.
PEP 414: Явные литералы Unicode¶
Чтобы облегчить переход от Python 2 к приложениям Python с поддержкой Unicode, которые активно используют литералы Unicode, Python 3.3 снова поддерживает префикс «u
» для строковых литералов. Этот префикс не имеет семантического значения в Python 3, он предоставляется исключительно для того, чтобы уменьшить количество чисто механических изменений при переходе на Python 3, облегчая разработчикам сосредоточение на более значимых семантических изменениях (таких как более строгое разделение двоичных и текстовых данных по умолчанию).
См.также
- PEP 414 - Явные литералы Unicode
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. Это изменение имеет множество преимуществ. Во-первых, это позволило раскрыть больше механизмов, обеспечивающих импорт, вместо того, чтобы они были неявными и скрытыми в коде на языке Си. Это также обеспечивает единую реализацию для всех виртуальных машин 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()
).Добавлены новые методы в
list
иbytearray
:copy()
иclear()
(bpo-10516). Следовательно,MutableSequence
теперь также определяет методclear()
(bpo-11388).Необработанные байтовые литералы теперь могут быть записаны как
rb"..."
, так иbr"..."
.(Внесено Антуаном Питру из bpo-13748).
dict.setdefault()
теперь выполняет только один поиск для заданного ключа, что делает его атомарным при использовании со встроенными типами.(Внесено Филипом Грущиньским из bpo-13521).
Значительно улучшены сообщения об ошибках, выдаваемые при несоответствии вызова функции сигнатуре функции.
(При участии Бенджамина Петерсона.)
(При участии Бенджамина Петерсона.)¶
Предыдущие версии CPython всегда полагались на глобальную блокировку импорта. Это приводило к неожиданным неприятностям, таким как тупики, когда импорт модуля вызывал выполнение кода в другом потоке в качестве побочного эффекта. Иногда использовались неуклюжие обходные пути, например, функция API C PyImport_ImportModuleNoBlock()
.
В 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¶
Строки Unicode только в формате 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
теперь реализует все APIio.BufferedIOBase
, за исключением методов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
теперь обеспечивает прочную основу для программного манипулирования менеджерами контекста и аналогичной функциональности очистки. В отличие от предыдущего API contextlib.nested
(который был устаревшим и удален), новый API предназначен для корректной работы независимо от того, получают ли менеджеры контекста свои ресурсы в своем методе __init__
(например, объекты файлов) или в своем методе __enter__
(например, объекты синхронизации из модуля threading
).
крипта¶
Добавление соли и модульного криптоформата (метод хэширования) и функции mksalt()
в модуль crypt
.
проклятия¶
Если модуль
curses
связан с библиотекой ncursesw, используйте функции Unicode, когда передаются строки или символы Unicode (например,waddwstr()
), и байтовые функции в противном случае (например,waddstr()
).Если модуль
utf-8
связан с библиотекой ncursesw, используйте функции Unicode, когда передаются строки или символы Unicode (например, :c ), и байтовые функции в противном случае (например, :c ).
curses.window
имеет новый атрибутcurses.window.encoding
.Класс
curses.window
имеет новый методget_wch()
для получения широкого символаВ модуле
curses
появилась новая функцияunget_wch()
для вставки широкого символа, чтобы следующийget_wch()
вернул его обратно
(Предоставлено Иньиго Серна в bpo-6755).
дататайм¶
Сравнения равенства между наивными и осознанными экземплярами
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
десятичный
ускорение
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()
устарел.
электронная почта¶
Основы политики¶
Теперь пакет email имеет структуру policy
. Policy
- это объект с несколькими методами и свойствами, которые управляют поведением пакета электронной почты. Основной политикой для Python 3.3 является политика Compat32
, которая обеспечивает обратную совместимость с почтовым пакетом в Python 3.2. Политика policy
может быть указана, когда сообщение электронной почты разбирается с помощью parser
, или когда создается объект Message
, или когда письмо сериализуется с помощью generator
. Если политика, переданная в parser
, не переопределена, она наследуется всеми объектами Message
и подобъектами, созданными parser
. По умолчанию generator
будет использовать политику объекта Message
, который он сериализует. По умолчанию используется политика compat32
.
Минимальный набор элементов управления, реализуемый всеми объектами policy
, является минимальным:
максимальная_длина_строки
Максимальная длина, исключая символ(ы) linesep, которую могут иметь отдельные строки при сериализации
Message
. По умолчанию равно 78.linesep
Символ, используемый для разделения отдельных строк при сериализации
Message
. По умолчанию используется\n
.cte_type
7bit
или8bit
.8bit
применяется только кBytes
generator
и означает, что не-ASCII может быть использован там, где это разрешено протоколом (или где он существует в исходном вводе).повышение_на_дефект
Заставляет
parser
вызывать ошибку при возникновении дефектов, а не добавлять их в списокMessage
объектаdefects
.
Новый экземпляр политики с новыми настройками создается с помощью метода clone()
объектов политики. clone
принимает любой из перечисленных выше элементов управления в качестве аргумента ключевого слова. Любой элемент управления, не указанный в вызове, сохраняет свое значение по умолчанию. Таким образом, вы можете создать политику, использующую символы строк \r\n
следующим образом:
mypolicy = compat32.clone(linesep='\r\n')
Политики можно использовать для упрощения генерации сообщений в формате, необходимом вашему приложению. Вместо того чтобы не забывать указывать linesep='\r\n'
во всех местах, где вы вызываете generator
, вы можете указать его один раз, когда задаете политику, используемую parser
или Message
, в зависимости от того, что ваша программа использует для создания объектов Message
. С другой стороны, если вам нужно генерировать сообщения в нескольких формах, вы все равно можете указать параметры в соответствующем вызове generator
. Или вы можете иметь пользовательские экземпляры политики для различных случаев и передавать их при создании generator
.
Временная политика с API нового заголовка¶
Политики можно использовать для упрощения генерации сообщений в формате, необходимом вашему приложению. Вместо того чтобы не забывать указывать provisional policy во всех местах, где вы вызываете , вы можете указать его один раз, когда задаете политику, используемую или , в зависимости от того, что ваша программа использует для создания объектов . С другой стороны, если вам нужно генерировать сообщения в нескольких формах, вы все равно можете указать параметры в соответствующем вызове . Или вы можете иметь пользовательские экземпляры политики для различных случаев и передавать их при создании .
Новые политики являются экземплярами EmailPolicy
и добавляют следующие дополнительные элементы управления:
refold_source
Управляет тем, будут ли заголовки, разобранные
parser
, разворачиватьсяgenerator
. Это может бытьnone
,long
илиall
. По умолчанию используетсяlong
, что означает, что исходные заголовки со строкой длиннее, чемmax_line_length
, будут перевернуты.none
означает, что ни одна строка не будет перевернута, аall
означает, что все строки будут перевернуты.header_factory
Вызываемый объект, который принимает
name
иvalue
и создает объект пользовательского заголовка.
header_factory
является ключом к новым возможностям, предоставляемым новыми политиками. Когда используется одна из новых политик, любой заголовок, полученный из объекта Message
, является объектом, произведенным header_factory
, и каждый раз, когда вы устанавливаете заголовок на Message
, он становится объектом, произведенным header_factory
. Все такие объекты заголовков имеют атрибут name
, равный имени заголовка. Заголовки Address и Date имеют дополнительные атрибуты, которые дают вам доступ к разобранным данным заголовка. Это означает, что теперь вы можете делать такие вещи, как:
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
Вы заметите, что при сериализации сообщения отображаемое в юникоде имя автоматически кодируется как utf-8
, но при прямом обращении к заголовку вы получаете версию в юникоде. Это устраняет необходимость работать с функциями email.header
decode_header()
или make_header()
.
Вы также можете создавать адреса из частей:
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
... Address('Sally', 'sally', 'example.com')]),
... Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>
Декодирование в юникод происходит автоматически:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'
Когда вы разбираете сообщение, вы можете использовать атрибуты addresses
и groups
объектов заголовка для доступа к группам и индивидуальным адресам:
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
В целом, если вы используете одну из новых политик, манипуляция заголовками работает так, как и должна работать: ваше приложение работает со строками юникода, а почтовый пакет прозрачно кодирует и декодирует юникод в стандартные кодировки передачи содержимого RFC и обратно.
Другие изменения API¶
Новый BytesHeaderParser
, добавленный в модуль parser
, дополняет HeaderParser
и завершает API байтов.
Новые функции полезности:
format_datetime()
: учитываяdatetime
, выдает строку, отформатированную для использования в заголовке электронной почты.
parsedate_to_datetime()
: учитывая строку даты из заголовка электронной почты, преобразуйте ее в осознаннуюdatetime
или наивнуюdatetime
, если смещение равно-0000
.
localtime()
: При отсутствии аргумента возвращает текущее местное время в виде awaredatetime
, используя localtimezone
. При значении awaredatetime
преобразует его в awaredatetime
, используя localtimezone
.
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).
В модуль html5
был добавлен новый словарь html5['gt;'] == '>'
, который отображает ссылки на именованные символы HTML5 на эквивалентные символы Unicode (например, html.entities
). Словарь теперь также используется модулем HTMLParser
. (Внесено Эцио Мелотти в bpo-11113 и bpo-15156).
imaplib¶
Конструктор IMAP4_SSL
теперь принимает параметр SSLContext для управления параметрами защищенного канала.
(Внесено Сиджином Джозефом из bpo-8808).
проверять¶
Добавлена новая функция getclosurevars()
. Эта функция сообщает текущую привязку всех имен, на которые ссылается тело функции, и где эти имена были разрешены, что облегчает проверку правильности внутреннего состояния при тестировании кода, который полагается на закрытия с состоянием.
(Вклад внесли Меадор Инге и Ник Коглан из bpo-13062).
Добавлена новая функция getgeneratorlocals()
. Эта функция сообщает о текущей привязке локальных переменных в стековом фрейме генератора, что облегчает проверку правильности внутреннего состояния при тестировании генераторов.
(Внесено Меадором Инге в 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')
>>>
(Внесено Джампаоло Родола в 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
.Следующие функции теперь поддерживают дескриптор файла в качестве аргумента пути:
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()
, но распространяются на все процессы, а не только на текущий.(Патч представлен Giampaolo Rodolà в 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
.
(Внесено Сергеем Сторчакой в bpo-3665).
расписание¶
run()
теперь принимает блокирующий параметр, который при установке в 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()
правильно экранирует все символы в строке, которым оболочка может придать специальное значение.
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()
. (Вклад Мартина фон Лёвиса и Хинека Шлавака в 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).
socketserver¶
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“.
(Внесено Джампаоло Родола в 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
при передаче отрицательного значения sleep. Ранее это было ошибкой на 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
позволяет отличить правильно сформированный сжатый поток от неполного или усеченного. (Внесено Nadeem Vawda в bpo-12646.)
Новый атрибут zlib.ZLIB_RUNTIME_VERSION
сообщает строку версии основной библиотеки zlib
, которая загружается во время выполнения. (Внесен Торстеном Ландшоффом в bpo-12306).
Оптимизации¶
Добавлены значительные улучшения производительности:
Благодаря PEP 393 были оптимизированы некоторые операции над строками Unicode:
объем памяти делится на 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).
Изменения в API Build и C¶
Изменения в процессе сборки 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
enum: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: 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()
, поскольку файлы байткода теперь хранят время модификации и размер исходного файла, из которого был скомпилирован файл байткода.
Устаревшие функции и типы API языка C¶
Тип Py_UNICODE
был устаревшим PEP 393 и будет удален в Python 4. Все функции, использующие этот тип, устарели:
Функции и методы Unicode, использующие типы Py_UNICODE
и Py_UNICODE*:
PyUnicode_FromUnicode
: используйтеPyUnicode_FromWideChar()
илиPyUnicode_FromKindAndData()
PyUnicode_AS_UNICODE
,PyUnicode_AsUnicode()
,PyUnicode_AsUnicodeAndSize()
: использоватьPyUnicode_AsWideCharString()
PyUnicode_AS_DATA
: использоватьPyUnicode_DATA
сPyUnicode_READ
иPyUnicode_WRITE
PyUnicode_GET_SIZE
,PyUnicode_GetSize()
: используйтеPyUnicode_GET_LENGTH
илиPyUnicode_GetLength()
PyUnicode_GET_DATA_SIZE
: используйтеPyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
(работает только с готовыми строками)PyUnicode_AsUnicodeCopy()
: используйтеPyUnicode_AsUCS4Copy()
илиPyUnicode_AsWideCharString()
PyUnicode_GetMax()
Функции и макросы, манипулирующие строками Py_UNICODE*:
Py_UNICODE_strlen
: используйтеPyUnicode_GetLength()
илиPyUnicode_GET_LENGTH
Py_UNICODE_strcat
: используйтеPyUnicode_CopyCharacters()
илиPyUnicode_FromFormat()
Py_UNICODE_strcpy
,Py_UNICODE_strncpy
,Py_UNICODE_COPY
: используйтеPyUnicode_CopyCharacters()
илиPyUnicode_Substring()
Py_UNICODE_strcmp
: использоватьPyUnicode_Compare()
Py_UNICODE_strncmp
: использоватьPyUnicode_Tailmatch()
Py_UNICODE_strchr
,Py_UNICODE_strrchr
: использоватьPyUnicode_FindChar()
Py_UNICODE_FILL
: использоватьPyUnicode_Fill()
Py_UNICODE_MATCH
Кодирующие устройства:
PyUnicode_Encode()
: использоватьPyUnicode_AsEncodedObject()
PyUnicode_EncodeUTF8()
: используйтеPyUnicode_AsUTF8()
илиPyUnicode_AsUTF8String()
PyUnicode_EncodeUnicodeEscape()
использоватьPyUnicode_AsUnicodeEscapeString()
PyUnicode_EncodeRawUnicodeEscape()
использоватьPyUnicode_AsRawUnicodeEscapeString()
PyUnicode_EncodeLatin1()
: использоватьPyUnicode_AsLatin1String()
PyUnicode_EncodeASCII()
: использоватьPyUnicode_AsASCIIString()
PyUnicode_EncodeMBCS()
: используйтеPyUnicode_AsMBCSString()
илиPyUnicode_EncodeCodePage()
(сCP_ACP
кодовой_страницей)PyUnicode_EncodeDecimal()
,PyUnicode_TransformDecimalToASCII()
Устаревшие функции¶
Код формата array
модуля 'u'
теперь устарел и будет удален в Python 4 вместе с остальной частью API (Py_UNICODE
).
Перенос на 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
теперь выдается, если функции Сиgmtime()
или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
, если вы удаляете записи в словаре путей, не имеющих искателя, вам нужно будет удалить ключи, сопряженные со значениями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()
.Давняя ошибка в соответствии с RFC (bpo-1079) в разборе, выполняемом
email.header.decode_header()
, была исправлена. Код, использующий стандартную идиому для преобразования кодированных заголовков в юникод (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
использует фабричные функции путем подклассификации частных классов, должен будет измениться, чтобы подклассифицировать теперь публичные классы.Недокументированные механизмы отладки в модуле потоков были удалены, что упростило код. Это не должно повлиять на производственный код, но упомянуто здесь на случай, если с ним взаимодействовали отладочные механизмы приложений (bpo-13550).
Перенос кода на языке Си¶
В ходе изменений в 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, предоставлено Карлом Мейером и отредактировано Эриком Араужо).