Что нового в Python 3.3
В этой статье объясняются новые возможности Python 3.3 по сравнению с 3.2. Python 3.3 был выпущен 29 сентября 2012 г. Для получения полной информации см. changelog.
См.также
PEP 398 — Расписание релиза Python 3.3
Резюме. Основные моменты релиза
Новые возможности синтаксиса:
- Новое выражение
yield from
для делегирование генератора. - Синтаксис
u'unicode'
снова принимается для объектовstr
.
Новые модули библиотеки:
faulthandler
(помогает отлаживать низкоуровневые сбои)ipaddress
(высокоуровневые объекты, представляющие IP-адреса и маски)lzma
(сжимать данные по алгоритму XZ/LZMA)unittest.mock
(замена части тестируемой системы мок объектами)venv
(Python виртуальные среды, как в популярном пакетеvirtualenv
)
Новые встроенные функции:
- Переработана иерархия исключений ввода-вывода.
Улучшения реализации:
- Машинерия импорта переписана на основе
importlib
. - Более компактные строки юникода.
- Более компактные словари атрибутов.
Значительно улучшенные библиотечные модули:
- C Ускоритель для модуля decimal.
- Улучшена обработка Юникода в модуле email (предварительный пакет).
Улучшения безопасности:
- Рандомизация хэшей включена по умолчанию.
Пожалуйста, ознакомьтесь с полным списком изменений, с которыми сталкивается пользователь.
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: новая реализация memoryview и документация по протоколу буфера
Реализация PEP 3118 была значительно улучшена.
Новая реализация memoryview полностью устраняет все проблемы с владением и временем жизни динамически выделяемых полей в структуре Py_buffer, которые приводили к многочисленным отчётам о сбоях. Кроме того, были исправлены несколько функций, которые давали сбой или возвращали неверные результаты для несмежных или многомерных входных данных.
У объекта memoryview теперь есть функция getbufferproc(), совместимая с PEP-3118, которая проверяет тип запроса потребителя. Было добавлено много новых функций, большинство из которых работает в полной мере для несмежных массивов и массивов с подсмещениями.
Документация была обновлена, в ней чётко прописаны обязанности как экспортёров, так и потребителей. Флаги запроса буфера сгруппированы в базовые и составные флаги. Объясняется расположение в памяти несмежных и многомерных массивов в стиле NumPy.
Возможности
- Теперь поддерживаются все собственные спецификаторы односимвольного формата в синтаксисе модуля struct (необязательно с префиксом «@»).
- С некоторыми ограничениями метод cast() позволяет изменять формат и форму C-непрерывных массивов.
- Представления многомерного списка поддерживаются для любого типа массива.
- Многомерные сравнения поддерживаются для любого типа массива.
- Одномерные представления памяти хешируемых (только для чтения) типов с форматами B, b или c теперь хэшируются. (Предоставлено Антуаном Питру в bpo-13411.)
- Поддерживается произвольная нарезка любого типа одномерных массивов. Например, теперь можно перевернуть memoryview за O(1), используя отрицательный шаг.
Изменения API
- Максимальное количество измерений официально ограничено 64.
- Представление пустой формы, шагов и подсмещений теперь представляет собой
пустой кортеж вместо
None
. - Доступ к элементу memoryview в формате «B» (беззнаковые байты) теперь возвращает целое число (в соответствии с синтаксисом модуля struct). Для возврата объекта bytes представление должно быть сначала приведено к «c».
- сравнения memoryview теперь используют логическую структуру операндов и сравнивают все элементы массива по значению. Поддерживаются все строки формата в синтаксисе модуля struct. Представления с нераспознанными строками формата по-прежнему разрешены, но всегда будут сравниваться как неравные, независимо от содержимого представления.
- Дополнительные сведения об изменениях см. в статьях Изменения сборки и C API и Портирование C-кода.
(Предоставлено Стефаном Крахом в bpo-10181.)
См.также
PEP 3118 — Пересмотр протокола буфера
PEP 393: Гибкое строковое представление
Тип Юникод строки изменён для поддержки нескольких внутренних представлений в зависимости от символа с наибольшим порядковым номером Юникод (1, 2 или 4 байта) в представляемой строке. Это предоставляет компактное представление в обычных случаях, но предоставляет доступ к полному UCS-4 во всех системах. Для совместимости с существующими API несколько представлений могут существовать параллельно; со временем данная совместимость должна быть прекращена.
Со стороны Python у этого изменения не должно быть недостатков.
На стороне C API PEP 393 полностью обратно совместим. Устаревший API должен оставаться доступным не менее пяти лет. Приложения, использующие устаревший API, не в полной мере выиграют от сокращения памяти или, что ещё хуже, могут использовать немного больше памяти, потому что Python’у, возможно, придётся поддерживать две версии каждой строки (в устаревшем формате и в новом эффективном хранилище).
Функциональность
Изменения, внесенные PEP 393, следующие:
- Теперь Python всегда поддерживает весь диапазон кодовых точек Юникод, в том
числе не-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
для обратной совместимости, и её не следует использовать с новым Юникод API (см. bpo-13054). - Флаг
./configure
--with-wide-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 для Windows
Установщик Python 3.3 для Windows теперь включает приложение запуска py
,
которое можно использовать для запуска Python приложений независимо от версии.
Запускальщик вызывается неявно при двойном щелчке по *.py
файлам.
Если в системе установлена только одна версия Python, данная версия будет
использоваться для запуска файла. Если установлено несколько версий, по
умолчанию используется самая последняя версия, но это можно переопределить,
включив в сценарий Python «строку shebang» в стиле Unix.
Запускальщик также можно использовать явно из командной строки как
приложение py
. Запуск py
следует тем же правилам выбора версии, что и
неявный запуск скриптов, но можно выбрать более точную версию, передав
соответствующие аргументы (например, -3
для запроса Python 3, когда также
установлен Python 2, или -2.6
, чтобы специально запросить более раннюю
версию Python, когда установлена более свежая версия).
В дополнение к запускальщику, установщик Windows теперь включает возможность добавить только что установленный Python в системный PATH. (Предоставлено Брайаном Кертином в bpo-3561.)
См.также
- PEP 397 — Запускальщик Python для Windows
- PEP, написанный Марком Хаммондом и Мартином фон Лёвисом; реализация Виная Саджипа.
Документация по запускальщику.
Модификация PATH установщика: Поиск исполняемого файла Python
PEP 3151: переработка иерархии исключений ОС и ввода-вывода
Иерархия исключений, вызванных ошибками операционной системы, теперь упрощена и детализирована.
Вам больше не нужно беспокоиться о выборе подходящего типа исключения между
OSError
, IOError
, EnvironmentError
, WindowsError
,
mmap.error
, socket.error
или select.error
. Все данные типы
исключений теперь только одни: OSError
. Другие имена сохраняются как
псевдонимы по соображениям совместимости.
Кроме того, теперь легче отловить состояние ошибки. Вместо
проверки атрибута errno
(или args[0]
) на наличии
константы из модуля errno
, вы можете поймать соответствующий подкласс
OSError
. Доступны следующие подклассы:
BlockingIOError
ChildProcessError
ConnectionError
FileExistsError
FileNotFoundError
InterruptedError
IsADirectoryError
NotADirectoryError
PermissionError
ProcessLookupError
TimeoutError
А у самого ConnectionError
есть более мелкие подклассы:
Благодаря новым исключениям теперь можно избежать обычного использования
errno
. Например, следующий код, написанный для Python 3.2:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("Файл document.txt отсутствует")
elif err.errno in (EACCES, EPERM):
print("Вам не разрешено читать document.txt")
else:
raise
теперь можно писать без импорта errno
и без ручной проверки атрибутов
исключений:
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("Файл document.txt отсутствует")
except PermissionError:
print("Вам не разрешено читать document.txt")
См.также
- PEP 3151 — Переработка иерархии исключений ОС и ввода-вывода
- PEP написан и реализован Антуаном Питру
PEP 380: Синтаксис делегирования подгенератору
PEP 380 добавляет выражение yield from
, позволяя генератору
делегировать часть своих операций другому генератору. Это позволяет выделить
часть кода, содержащую yield
, и поместить её в другой генератор.
Кроме того, подгенератору разрешено возвращать значение, и это значение
становится доступным для делегирующего генератора.
Хотя выражение yield from
разработано в первую очередь для использования
при делегировании подгенератору, оно на самом деле позволяет делегировать
произвольным подитераторам.
Для простых итераторов yield from iterable
— это просто сокращённая форма
for item in iterable: yield item
:
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
Однако, в отличие от обычного цикла, yield from
позволяет подгенераторам
получать отправленные и выброшенные значения непосредственно из вызывающей
области и возвращать окончательное значение внешнему генератору:
>>> def accumulate():
... tally = 0
... while 1:
... next = yield
... if next is None:
... return tally
... tally += next
...
>>> def gather_tallies(tallies):
... while 1:
... tally = yield from accumulate()
... tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc) # Убедитесь, что аккумулятор готов к приёму значений
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Закончить первый подсчёт
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Закончить второй подсчёт
>>> tallies
[6, 10]
Основной принцип, лежащий в основе этого изменения, заключается в том, чтобы
даже генераторы, предназначенные для использования с методами send
и
throw
, можно было разделить на несколько подгенераторов так же просто, как
одну большую функцию можно разделить на несколько подфункций.
См.также
- PEP 380 — синтаксис делегирования подгенератору
- 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'
Во время обработки вышеупомянутого исключения произошло другое исключение:
Traceback (последний последний вызов):
Файл «<stdin>», строка 1, в <module>
Файл «<stdin>», строка 8, в __getattr__
Ошибка атрибута: x
Возможность отладки не теряется, т. к. исходный контекст исключения остаётся доступным при необходимости (например, если промежуточная библиотека неправильно подавила важные базовые детали):
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
См.также
- PEP 409 — Подавление контекста исключения
- PEP, написанный Итаном Фурманом; реализован Итаном Фурманом и Ником Когланом.
PEP 414: Явные Юникод литералы
Чтобы упростить переход с 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 в качестве реализации Import
bpo-2377 — Заменяет __import__ w/ importlib.__import__
bpo-13959 — Повторно реализовывает части imp
на чистом Python
bpo-14605 — Сделал механизм импорта явным
bpo-14646 — Требование установки загрузчиков __loader__ и __package__
Функция __import__()
теперь поддерживается importlib.__import__()
.
Работа приводит к завершению «этапа 2» PEP 302. Данное изменение имеет
множество преимуществ. Во-первых, это позволило раскрыть больше механизмов,
обеспечивающих импорт, вместо того, чтобы быть неявными и скрытыми в коде C. Она
также предоставляет единую реализацию для всех виртуальных машин Python,
поддерживающих Python 3.3, что помогает устранить любые отклонения, характерные
для виртуальных машин, в семантике импорта. И, наконец, это облегчает
обслуживание импорта, позволяя обеспечить рост в будущем.
Для обычного пользователя не должно быть видимых изменений в семантике. Для тех, чей код в настоящее время управляет импортом или вызывает импорт программно, требуемые изменения кода, описаны в разделе Портирование Python кода данного документа.
Новые API
Одним из больших преимуществ этой работы является выявление того, что
необходимо для работы оператора import. Это означает, что
различные импортёры, которые когда-то были неявными, теперь полностью доступны
как часть пакета importlib
.
Абстрактные базовые классы, определённые в importlib.abc
, были расширены
для правильного разграничения между
поисковиком мета-пути и
поисковиком пути входа путём введения
importlib.abc.MetaPathFinder
и importlib.abc.PathEntryFinder
соответственно. Старая ABC importlib.abc.Finder
теперь предоставляется
только для обратной совместимости и не требует каких-либо требований к методу.
Что касается поисковиков, importlib.machinery.FileFinder
раскрывает
механизм, используемый для поиска исходных файлов и файлов байт-кода модуля.
Ранее данный класс был неявным членом sys.path_hooks
.
Для загрузчиков новый абстрактный базовый класс
importlib.abc.FileLoader
помогает написать загрузчик, использующий
файловую систему в качестве механизма хранения кода модуля. Загрузчик исходных
файлов (importlib.machinery.SourceFileLoader
), файлов байт-кода без
исходников (importlib.machinery.SourcelessFileLoader
) и модулей
расширения (importlib.machinery.ExtensionFileLoader
) теперь доступен
для прямого использования.
ImportError
теперь имеет атрибуты name
и path
, которые
устанавливаются при наличии соответствующих данных для предоставления. В
сообщении о неудачном импорте теперь также будет указано полное имя модуля, а
не только окончание имени модуля.
Функция importlib.invalidate_caches()
теперь будет вызывать метод с тем
же именем для всех поисковиков, кэшированных в
sys.path_importer_cache
, чтобы при необходимости очистить любое
сохраненное состояние.
Видимые изменения
Возможные необходимые изменения кода см. в разделе Портирование Python кода.
Помимо того, что теперь показывает importlib
, есть и другие видимые
изменения для импорта. Самым большим из них является то, что
sys.meta_path
и sys.path_hooks
теперь хранят все средства
поиска метапутей и хуки ввода пути, используемые при импорте. Раньше
поисковики были неявными и скрытыми в C коде импорта, а не выставлялись напрямую.
Это означает, что теперь можно легко удалить или изменить порядок различных
поисковиков в соответствии со своими потребностями.
Другое изменение заключается в том, что все модули имеют атрибут
__loader__
, в котором хранится загрузчик, используемый для создания модуля.
PEP 302 был обновлён, чтобы сделать данный атрибут обязательным для
реализации загрузчиками, поэтому в будущем, когда сторонние загрузчики будут
обновлены, люди смогут полагаться на существование этого атрибута. Однако до
этого времени импорт устанавливает постзагрузку модуля.
Также теперь ожидается, что загрузчики будут устанавливать атрибут
__package__
вместо PEP 366. Опять же, сам импорт уже устанавливает это
на всех загрузчиках из importlib
, а сам импорт устанавливает атрибут
постзагрузки.
None
теперь вставляется в sys.path_importer_cache
, когда поиск не
может быть найден в sys.path_hooks
. Поскольку imp.NullImporter
не отображается напрямую в sys.path_hooks
, больше нельзя полагаться на
то, что он всегда будет доступен для использования в качестве значения,
представляющего, что поисковик не найден.
Все остальные изменения относятся к семантическим изменениям, которые следует учитывать при обновлении кода для Python 3.3, и поэтому их следует прочитать в разделе Портирование Python кода данного документа.
(Реализация Бретта Кэннона)
Другие языковые изменения
Некоторые небольшие изменения, внесённые в основной язык Python:
Добавлена поддержка псевдонимов имён Юникод и именованных последовательностей. И
unicodedata.lookup()
, и'\N{...}'
теперь разрешают псевдонимы имён, аunicodedata.lookup()
также разрешает именованные последовательности.(Предоставлено Эцио Мелотти в bpo-12753.)
База данных Юникод обновлена до версии 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 истинен, поток принудительно сбрасывается.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
Улучшенные модули
abc
Улучшена поддержка абстрактных базовых классов, содержащих дескрипторы,
составленные с помощью абстрактных методов. Рекомендуемый подход к объявлению
абстрактных дескрипторов теперь заключается в предоставлении
__isabstractmethod__
в качестве динамически обновляемого свойства.
Встроенные дескрипторы были соответствующим образом обновлены.
abc.abstractproperty
устарел, вместо него используйтеproperty
сabc.abstractmethod()
.abc.abstractclassmethod
устарел, вместо него используйтеclassmethod
сabc.abstractmethod()
.abc.abstractstaticmethod
устарел, вместо него используйтеstaticmethod
сabc.abstractmethod()
.
(Предоставлено Дарреном Дейлом в bpo-11610.)
abc.ABCMeta.register()
теперь возвращает зарегистрированный подкласс, что
означает, что теперь его можно использовать в качестве декоратора класса
(bpo-10868).
array
Модуль array
поддерживает тип long long
с использованием кодов
типов q
и Q
.
(Предоставлено Ореном Тирошем и Хирокадзу Ямамото в bpo-1172711.)
base64
Юникод строки, содержащие только ASCII, теперь принимаются функциями
декодирования современного интерфейса base64
. Например,
base64.b64decode('YWJj')
возвращает b'abc'
. (Предоставлено Каталин Якоб
в bpo-13641.)
binascii
В дополнение к двоичным объектам, которые они обычно принимают, функции
a2b_
теперь также принимают в качестве входных данных строки только в
формате ASCII. (Предоставлено Антуаном Питру в bpo-13637.)
bz2
Модуль bz2
был переписан с нуля. В процессе было добавлено несколько
новых функций:
Новая функция
bz2.open()
: открытие сжатого bzip2 файла в двоичном или текстовом режиме.bz2.BZ2File
теперь может читать и записывать произвольные файловые объекты с помощью аргумента fileobj своего конструктора.(Предоставлено Надимом Вавдой в bpo-5863.)
bz2.BZ2File
иbz2.decompress()
теперь могут распаковывать многопотоковые входные данные (например, созданные инструментом pbzip2).bz2.BZ2File
теперь также можно использовать для создания файлов этого типа, используя режим'a'
(дополнение).(Предоставлено Ниром Эйдесом в bpo-1625.)
bz2.BZ2File
теперь реализует все APIio.BufferedIOBase
, за исключением методовdetach()
иtruncate()
.
codecs
Кодек mbcs
был переписан для правильной обработки
обработчиков ошибок replace
и ignore
во всех версиях Windows. Кодек
mbcs
теперь поддерживает все обработчики ошибок, а не только
replace
для кодирования и ignore
для декодирования.
Добавлен новый кодек только для Windows: cp65001
(bpo-13216). Это
кодовая страница Windows 65001 (Windows UTF-8, CP_UTF8
). Например, он
используется sys.stdout
, если для выходной кодовой страницы консоли
установлено значение cp65001 (например, с помощью команды chcp 65001
).
Многобайтовые декодеры CJK теперь ресинхронизируются быстрее. Они игнорируют
только первый байт недопустимой последовательности байтов. Например,
b'\xff\n'.decode('gb2312', 'replace')
теперь возвращает \n
после
символа замены.
Кодировщики инкрементных кодеков CJK больше не сбрасываются при каждом вызове их методов encode(). Например:
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'
Данный пример предоставляет b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'
со
старыми версиями Python.
Кодек unicode_internal
устарел.
collections
Добавлен новый класс ChainMap
, позволяющий обрабатывать
несколько отображений как единое целое. (Написано Рэймондом Хеттингером для
bpo-11089, обнародовано в bpo-11297.)
Абстрактные базовые классы были перемещены в новый модуль
collections.abc
, чтобы лучше различать абстрактные и классы
коллекций. Псевдонимы для ABC по-прежнему присутствуют в модуле
collections
, чтобы сохранить существующий импорт. (bpo-11085)
Класс Counter
теперь поддерживает унарные операторы +
и -
, а также встроенные операторы +=
, -=
, |=
и &=
.
(Предоставлено Рэймондом Хеттингером в bpo-13121.)
contextlib
ExitStack
теперь обеспечивает прочную основу для
программного управления менеджерами контекста и аналогичными функциями очистки.
В отличие от предыдущего API contextlib.nested
(который устарел и был
удалён), новый API предназначен для правильной работы независимо от того,
получают ли менеджеры контекста свои ресурсы в своём методе __init__
(например, файловые объекты) или в своём методе __enter__
(например,
синхронизация объекты из модуля threading
).
crypt
Добавление соли и модульного формата crypt (метод хеширования) и функции
mksalt()
в модуль crypt
.
curses
- Если модуль
curses
связан с библиотекой ncursesw, используйте функции Юникод, когда передаются строки или символы Юникод (например,waddwstr()
), и байтовые функции в противном случае (например,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 в системный часовой пояс.
decimal
- bpo-7652 — интеграция быстрой десятичной арифметики.
- C-модуль и libmpdec написаны Стефан Кра.
Новая версия C модуля decimal включает в себя высокоскоростную библиотеку libmpdec для арифметических операций с плавающей запятой с правильным округлением произвольной точности. libmpdec соответствует Общей спецификации десятичной арифметики IBM.
Прирост производительности варьируется от 10-кратного для приложений баз данных до 100-кратного для приложений с интенсивными вычислениями. Данные числа являются ожидаемым выигрышем для стандартной точности, используемой в десятичной арифметике с плавающей запятой. Поскольку точность настраивается пользователем, точные цифры могут отличаться. Например, в целочисленной арифметике больших чисел различия могут быть значительно выше.
Следующая таблица предназначена для иллюстрации. Контрольные показатели доступны по адресу.
decimal.py _decimal speedup pi 42.02s 0.345s 120x telco 172.19s 5.68s 30x psycopg 3.57s 0.29s 12x
Возможности
- Сигнал
FloatOperation
дополнительно включает более строгую семантику для смешивания чисел с плавающей запятой и десятичных. - Если Python скомпилирован без потоков, версия C автоматически отключает
дорогостоящий механизм локального контекста потоков. В этом случае переменной
HAVE_THREADS
присваивается значениеFalse
.
Изменения API
Модуль C имеет следующие контекстные ограничения в зависимости от архитектуры компьютера:
32-bit 64-bit MAX_PREC
425000000
999999999999999999
MAX_EMAX
425000000
999999999999999999
MIN_EMIN
-425000000
-999999999999999999
В шаблонах контекста (
DefaultContext
,BasicContext
иExtendedContext
) величинаEmax
иEmin
изменилась на999999
.Конструктор
Decimal
в decimal.py не соблюдает ограничения контекста и точно преобразует значения с произвольными показателями степени или точностью. Поскольку версия C имеет внутренние ограничения, используется следующая схема: если возможно, значения преобразуются точно, в противном случае вызываетсяInvalidOperation
и результатом является NaN. В последнем случае всегда можно использоватьcreate_decimal()
, чтобы получить округленное или неточное значение.Функция степени в decimal.py всегда правильно округляется. В версии C она определяется с точки зрения правильно округленных функций
exp()
иln()
, но конечный результат только «почти всегда правильно округлён».В версии C словарь контекста, содержащий сигналы, имеет вид
MutableMapping
. Из соображений скоростиflags
иtraps
всегда ссылаются на тот жеMutableMapping
, которым был инициализирован контекст. Если назначается новый словарь сигналов,flags
иtraps
обновляются новыми значениями, но они не ссылаются на RHS словарь.Пиклинг
Context
приводит к другому результату, чтобы иметь общий формат обмена для версий Python и C.Порядок аргументов в конструкторе
Context
был изменён, чтобы соответствовать порядку, отображаемомуrepr()
.Параметр
watchexp
в методеquantize()
устарел.
Фреймворк Политики
У пакета email теперь есть структура policy
.
Policy
— это объект с несколькими методами и свойствами,
которые управляют поведением пакета email. Основной политикой для
Python 3.3 является политика Compat32
, которая
обеспечивает обратную совместимость с пакетом email в Python 3.2.
policy
можно указать, когда сообщение электронной почты анализируется с
помощью parser
, или когда создаётся объект
Message
, или когда электронная почта сериализуется с
использованием generator
. Если не переопределить,
переданная в parser
политика, наследуется всеми объектами Message
и
подобъектами, созданными parser
. По умолчанию generator
будет
использовать политику объекта Message
, который он сериализует. Политика по
умолчанию — compat32
.
Минимальный множество элементов управления, реализуемых всеми объектами
policy
, таков:
max_line_length Максимальная длина, за исключением символа (символов) переноса строки. У отдельных строк может быть, когда Message
сериализуемый. По умолчанию 78.linesep Символ, используемый для разделения отдельных строк, когда Message
сериализуемый. По умолчанию\n
.cte_type 7bit
или8bit
.8bit
применяется только кBytes
generator
и означает, что не-ASCII может использоваться там, где это разрешено протоколом (или там, где он существует в исходном вводе).raise_on_defect Заставляет parser
вызывать ошибку, когда есть дефекты встречаются вместо добавления их вMessage
список объектовdefects
.
Новый экземпляр политики с новыми параметрами создаётся с использованием метода
объектов политики clone()
. clone
принимает любой
из вышеперечисленных элементов управления в качестве ключевых аргументов. Любой
элемент управления, не указанный в вызове, сохраняет значение по умолчанию.
Таким образом, вы можете создать политику, которая использует символы строки
\r\n
, подобные этой:
mypolicy = compat32.clone(linesep='\r\n')
Политики можно использовать для упрощения генерации сообщений в формате,
необходимом вашему приложению. Вместо запоминания указания
linesep='\r\n'
во всех местах, где вы называете generator
, вы можете
указать его один раз, когда устанавливаете политику, используемую parser
или Message
, в зависимости от того, что ваша программа использует для
создания Message
объектов. С другой стороны, если вам нужно генерировать
сообщения в нескольких формах, вы все равно можете указать параметры в
соответствующем вызове generator
. Или вы можете иметь собственные
экземпляры политик для разных случаев и передавать их при создании
generator
файла.
Временная политика с новым API заголовков
Хотя структура политик полезна сама по себе, основная причина её внедрения — разрешить создание новых политик, которые реализуют новые функции для пакета email таким образом, чтобы поддерживать обратную совместимость для тех, кто не использует новые политики. Поскольку новые политики вводят новый API, мы выпускаем их в Python 3.3 как предварительный пакет. Обратно несовместимые изменения (вплоть до удаления кода) могут быть внесены, если основные разработчики сочтут это необходимым.
Новые политики являются экземплярами EmailPolicy
и
добавляют следующие дополнительные элементы управления:
refold_source Определяет, анализируются ли заголовки файлом parser
перевернутыgenerator
. Может бытьnone
,long
, илиall
. По умолчанию —long
, что означает, что исходные заголовки со строкой длиннее, чемmax_line_length
получить повторно.none
означает, что нет свернутых строк, аall
означает, что все строки свернуты.header_factory Вызываемый объект, который принимает name
иvalue
и создаёт пользовательский объект заголовка.
header_factory
— это ключ к новым функциям, предоставляемым новыми
политиками. Когда используется одна из новых политик, любой заголовок,
полученный из объекта Message
, является созданным объектом
header_factory
, и каждый раз, когда вы устанавливаете заголовок для
Message
, он становится объектом, созданным header_factory
. Такие
объекты заголовков имеют атрибут name
, равный имени заголовка. Заголовки
Address и Date имеют дополнительные атрибуты, которые дают вам доступ к
распарсенным данным заголовка. Это означает, что теперь вы можете делать
такие вещи:
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <[email protected]>'
>>> m['to']
'Éric <[email protected]>'
>>> 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?= <[email protected]>
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='[email protected]')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <[email protected]>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <[email protected]>, Sally <[email protected]>;, Bonzo <[email protected]>
Декодирование в Юникода выполняется автоматически:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <[email protected]>'
При парсинге сообщения можно использовать атрибуты addresses
и groups
объектов заголовка для доступа к группам и отдельным адресам:
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
Таким образом, если вы используете одну из новых политик, манипулирование заголовками работает так, как должно: ваше приложение работает с Юникод строками, а пакет email прозрачно кодирует и декодирует Юникод в RFC стандартные кодировки передачи контента и обратно.
Другие изменения API
Новый BytesHeaderParser
, добавленный в модуль
parser
, чтобы дополнить HeaderParser
и
дополнить байтовый API.
Новые полезные функции:
format_datetime()
: при наличииdatetime
создаёт строку, отформатированную для использования в заголовке электронной почты.parsedate_to_datetime()
: учитывая строку даты из заголовка электронной почты, преобразовывает её в осведомлённыйdatetime
или наивныйdatetime
, если смещение равно-0000
.localtime()
: без аргументов возвращает текущее местное время в виде осведомлённогоdatetime
с использованием локальногоtimezone
. Имея осведомлённыйdatetime
, преобразует его в осведомлённыйdatetime
, используя локальныйtimezone
.
ftplib
ftplib.FTP
теперь принимает ключевой аргументsource_address
, чтобы указать(host, port)
для использования в качестве исходного адреса в вызове привязки при создании исходящего сокета. (Предоставлено Джампаоло Родола в 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 с эквивалентными Юникод символами (например, html5['gt;'] ==
'>'
). Словарь теперь также используется HTMLParser
.
(Предоставлено Эцио Мелотти в bpo-11113 и bpo-15156.)
imaplib
Конструктор IMAP4_SSL
теперь принимает параметр SSLContext
для управления параметрами защищенного канала.
(Предоставлено Сидзином Джозефом в bpo-8808.)
inspect
Добавлена новая функция 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
для предоставления пользовательской двоичной функции.
logging
Функция basicConfig()
теперь поддерживает необязательный
аргумент handlers
, принимающий итерацию обработчиков, добавляемых в
корневой логгер.
Атрибут уровня класса append_nul
был
добавлен к SysLogHandler
, чтобы позволить управлять
добавлением байта NUL
(\000
) к записям системного журнала, поскольку
для некоторых демонов это требуется, а для других он передаётся в журнал.
math
Модуль math
имеет новую функцию log2()
, которая возвращает
логарифм по основанию 2 числа x.
(Написано Марком Дикинсоном в bpo-11888.)
mmap
Метод read()
теперь более совместим с другими файлоподобными
объектами: если аргумент пропущен или указан как None
, он возвращает байты
от текущей позиции файла до конца сопоставления. (Предоставлено Петри Лехтинен
в bpo-12021.)
multiprocessing
Новая функция 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()
, которая обеспечивает эффективный способ «нулевого копирования» для копирования данных из одного дескриптора файла (или сокета) в другой. Фраза «нулевое копирование» относится к тому факту, что все копирование данных между двумя дескрипторами полностью выполняется ядром без копирования данных в буферы пользовательского пространства.sendfile()
можно использовать для эффективного копирования данных из файла на диске в сетевой сокет, например. для скачивания файла.(Исправление представлено Россом Лагерволлом и Джампаоло Родола в bpo-10882.)
Чтобы избежать условий гонки, таких как атаки с символическими ссылками и проблемы с временными файлами и каталогами, более надёжно (и также быстрее) манипулировать файловыми дескрипторами вместо имён файлов. В Python 3.3 улучшены существующие функции и представлены новые функции для работы с файловыми дескрипторами (bpo-4761, bpo-10755 и bpo-14626).
- Модуль
os
имеет новую функциюfwalk()
, аналогичнуюwalk()
, за исключением того, что она также выдаёт файловые дескрипторы, относящиеся к посещенным каталогам. Это особенно полезно, чтобы избежать гонки за символическими ссылками. - Следующие функции получают новые необязательные dir_fd (
пути относительно дескрипторов каталогов) и/или
follow_symlinks
(не следовать символическим ссылкам):
access()
,chflags()
,chmod()
,chown()
,link()
,lstat()
,mkdir()
,mkfifo()
,mknod()
,open()
,readlink()
,remove()
,rename()
,replace()
,rmdir()
,stat()
,symlink()
,unlink()
,utime()
. Поддержку платформы для использования данных параметров можно проверить с помощью множествos.supports_dir_fd
иos.supports_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()
, но расширенным на все процессы, а не только на текущий.(Исправление представлено Джампаоло Родола в 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
Tab-дополнение теперь доступна не только для имён команд, но и для их аргументов.
Например, для команды break
имена функций и файлов завершены.
(Предоставлено Георгом Брандлом в bpo-14210)
pickle
Объекты pickle.Pickler
теперь имеют необязательный атрибут
dispatch_table
, позволяющий устанавливать функции
сокращения для каждого сборщика.
(Предоставлено Ричардом Оудкерком в bpo-14166.)
pydoc
Графический интерфейс Tk и функция serve()
были удалены из модуля
pydoc
: pydoc -g
и serve()
устарели в Python 3.2.
re
Регулярные выражения str
теперь поддерживают escape-последовательности
\u
и \U
.
(Предоставлено Сергеем Сторчакой в bpo-3665.)
sched
run()
теперь принимает параметр blocking. Если для него установлено значение ложь, заставляет метод выполнять запланированные события, срок действия которых истекает в ближайшее время (если таковые имеются), а затем немедленно возвращаться. Это полезно, если вы хотите использовать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.)
select
Solaris и производные платформы имеют новый класс select.devpoll
для
высокопроизводительных асинхронных сокетов через /dev/poll
.
(Предоставлено Хесусом Сеа Авионом в bpo-6397.)
shlex
Ранее недокументированная вспомогательная функция quote
из модулей
pipes
была перемещена в модуль shlex
и задокументирована.
quote()
правильно экранирует все символы в строке, которым
оболочка могла бы придать особое значение.
shutil
- Новые функции:
disk_usage()
: предоставляет статистику общего, используемого и свободного места на диске. (Предоставлено Джампаоло Родола в bpo-12442.)chown()
: позволяет изменить пользователя и/или группу по заданному пути, также указав имена пользователей/групп, а не только их числовые идентификаторы. (Предоставлено Сандро Този в bpo-12191.)shutil.get_terminal_size()
: возвращает размер окна терминала, к которому привязан интерпретатор. (Предоставлено Збигневом Енджеевским- Шмеком в bpo-13609.)
copy2()
иcopystat()
теперь сохраняют временные метки файлов с точностью до наносекунды на платформах, которые это поддерживают. Они также сохраняют «расширенные атрибуты» файлов в Linux. (Предоставлено Ларри Гастингсом в bpo-14127 и bpo-15238.)- Несколько функций теперь принимают необязательный аргумент
symlinks
: когда данный параметр имеет значение истина, символические ссылки не разыменовываются, а вместо этого операция воздействует на саму символическую ссылку (или создаёт её, если необходимо). (Предоставлено Хайнеком Шлаваком в bpo-12715.) - При копировании файлов в другую файловую систему
move()
теперь обрабатывает символические ссылки так же, как это делает posix командаmv
, воссоздавая символическую ссылку, а не копируя содержимое целевого файла. (Предоставлено Джонатаном Нихофом в bpo-9993.)move()
теперь также возвращает аргументdst
в качестве результата. rmtree()
теперь устойчив к атакам по символическим ссылкам на платформах, поддерживающих новый параметрdir_fd
вos.open()
иos.unlink()
. (Предоставлено Мартином фон Лёвисом и Хайнеком Шлаваком в bpo-4489.)
signal
- Модуль
signal
имеет новые функции:pthread_sigmask()
: выборка и/или изменение маски сигнала вызывающего потока (предоставил Жан-Поль Кальдероне в bpo-8407);pthread_kill()
: отправить сигнал потоку;sigpending()
: проверить ожидающие выполнения функции;sigwait()
: ждать сигнала;sigwaitinfo()
: ждать сигнала, возвращая подробную информацию о нем;sigtimedwait()
: какsigwaitinfo()
, но с тайм-аутом.
- Обработчик сигнала записывает номер сигнала в виде одного байта вместо нулевого байта в дескриптор файла пробуждения. Таким образом, можно дождаться более одного сигнала и узнать, какие сигналы были вызваны.
signal.signal()
иsignal.siginterrupt()
вызывают ошибку OSError вместо RuntimeError: OSError имеет атрибут errno.
smtpd
Модуль smtpd
теперь поддерживает RFC 5321 (расширенный SMTP) и
RFC 1870 (расширение размера). По стандарту данные расширения включены тогда
и только тогда, когда клиент инициирует сеанс с помощью команды EHLO
.
(Первоначальная поддержка ELHO
от Альберто Тревино. Расширение размера от
Юхана Яухиайнен. Значительная дополнительная работа над патчем предоставлена
Мишель Орру и Дэн Босуэлл. bpo-8739)
smtplib
Классы SMTP
, SMTP_SSL
и
LMTP
теперь принимают ключевой аргумент source_address
,
чтобы указать (host, port)
для использования в качестве исходного адреса в
вызове привязки при создании исходящего сокета. (Предоставлено Пауло Скардином
в bpo-11281.)
SMTP
теперь поддерживает протокол управления контекстом, что
позволяет использовать экземпляр SMTP
в операторе with
. (Предоставлено
Джампаоло Родола в bpo-11289.)
Конструктор SMTP_SSL
и метод starttls()
теперь принимают параметр SSLContext для управления параметрами защищенного
канала. (Предоставлено Касун Херат в bpo-8809.)
socket
Класс
socket
теперь предоставляет дополнительные методы для обработки вспомогательных данных, если они поддерживаются базовой платформой:(Предоставлено Дэвидом Уотсоном в bpo-6560 на основе более раннего патча Хайко Вундрама)
Класс
socket
теперь поддерживает семейство протоколов PF_CAN в Linux <https://lwn.net/Articles/253425>.(Предоставлено Матиасом Фуксом, обновлено Тьяго Гонсалвесом в bpo-10141.)
Класс
socket
теперь поддерживает семейство протоколов PF_RDS и 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()
теперь принимает аргумент password, который следует использовать, если закрытый ключ зашифрован. (Предоставлено Адамом Симпкинсом в 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).
stat
Недокументированная функция tarfile.filemode перемещена в
stat.filemode()
. Её можно использовать для преобразования режима файла в
строку вида «-rwxrwxrwx».
(Предоставлено Джампаоло Родола в bpo-14807.)
struct
Модуль struct
теперь поддерживает ssize_t
и size_t
с помощью
новых кодов n
и N
соответственно. (Предоставлено Антуаном Питру в
bpo-3163.)
subprocess
Командные строки теперь могут быть байтовыми объектами на posix платформах. (Предоставлено Виктором Стиннером в bpo-8513.)
Новая константа DEVNULL
позволяет подавлять вывод
независимо от платформы. (Предоставлено Россом Лагерволлом в bpo-5870.)
sys
Модуль sys
имеет новый thread_info
именованный кортеж,
содержащий информацию о реализации потока (bpo-11223).
tarfile
tarfile
теперь поддерживает кодировку lzma
через модуль lzma
.
(Предоставлено Ларсом Густебелем в bpo-5689.)
tempfile
Метод tempfile.SpooledTemporaryFile
truncate()
теперь принимает параметр
size
. (Предоставлено Райаном Келли в bpo-9957.)
textwrap
Модуль textwrap
имеет новый indent()
, который упрощает
добавление общего префикса к выделенным строкам в текстовом блоке
(bpo-13857).
threading
threading.Condition
, threading.Semaphore
,
threading.BoundedSemaphore
, threading.Event
и
threading.Timer
, которые раньше были фабричными функциями,
возвращающими экземпляр класса, теперь являются классами и могут быть
подклассами. (Предоставлено Эриком Араужо в bpo-10968.)
Конструктор threading.Thread
теперь принимает ключевой аргумент
daemon
, чтобы переопределить поведение по умолчанию наследования значения
флага daemon
от родительского потока (bpo-6064).
Ранее закрытая функция _thread.get_ident
теперь доступна как общедоступная
функция threading.get_ident()
. Это исключает несколько случаев прямого
доступа к модулю _thread
в файле stdlib. Сторонний код, который использовал
_thread.get_ident
, также должен быть изменён для использования нового
общедоступного интерфейса.
time
PEP 418 добавил новые функции в модуль time
:
get_clock_info()
: получить информацию о часах.monotonic()
: монотонные часы (не могут идти назад), на них не влияют обновления системных часов.perf_counter()
: счётчик производительности с самым высоким доступным разрешением для кратковременного измерения.process_time()
: сумма системного и пользовательского процессорного времени текущего процесса.
Другие новые функции:
- Функции
clock_getres()
,clock_gettime()
иclock_settime()
с константамиCLOCK_xxx
. (Предоставлено Виктором Стиннером в bpo-10278.)
Чтобы улучшить согласованность между платформами, sleep()
теперь
вызывает ValueError
при передаче отрицательного значения сна. Ранее это
было ошибкой в posix, но приводило к бесконечному сну в Windows.
types
Добавлен новый класс types.MappingProxyType
: прокси-сервер
сопоставления только для чтения. (bpo-14386)
Новые функции types.new_class()
и types.prepare_class()
обеспечивают поддержку создания динамических типов, совместимых с PEP 3115.
(bpo-14588)
unittest
assertRaises()
, assertRaisesRegex()
, assertWarns()
и
assertWarnsRegex()
теперь принимают ключевой аргумент msg при
использовании в качестве менеджеров контекста. (Предоставлено Эцио Мелотти и
Уинстоном Эвертом в bpo-10775.)
unittest.TestCase.run()
теперь возвращает объект
TestResult
.
urllib
Класс Request
теперь принимает аргумент method,
используемый get_method()
для определения того,
какой метод HTTP следует использовать. Например, следующий код отправит
'HEAD'
запрос
>>> urlopen(Request('https://digitology.tech', method='HEAD'))
webbrowser
Модуль webbrowser
поддерживает больше «браузеров»: Google Chrome (с
именами chrome, chromium, chrome-browser или
chromium-browser в зависимости от версии и операционной системы), а
также общие средства запуска xdg-open из проекта FreeDesktop и
gvfs-open, который является URI по умолчанию обработчиком для GNOME
1. (Первый предоставлен Арно Кальметтесом в 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 добавлены новые типы, макросы и Юникод функции:
- API высокого уровня:
- API низкого уровня:
- Типы
Py_UCS1
,Py_UCS2
,Py_UCS4
- Структуры
PyASCIIObject
иPyCompactUnicodeObject
PyUnicode_READY
PyUnicode_FromKindAndData()
PyUnicode_AsUCS4()
,PyUnicode_AsUCS4Copy()
PyUnicode_DATA
,PyUnicode_1BYTE_DATA
,PyUnicode_2BYTE_DATA
,PyUnicode_4BYTE_DATA
PyUnicode_KIND
с перечислениемPyUnicode_Kind
:PyUnicode_WCHAR_KIND
,PyUnicode_1BYTE_KIND
,PyUnicode_2BYTE_KIND
,PyUnicode_4BYTE_KIND
PyUnicode_READ
,PyUnicode_READ_CHAR
,PyUnicode_WRITE
PyUnicode_MAX_CHAR_VALUE
- Типы
PyArg_ParseTuple
теперь принимаетbytearray
для форматаc
(bpo-12380).
Устарело
Неподдерживаемые операционные системы
OS/2 и VMS больше не поддерживаются из-за отсутствия сопровождающего.
Платформы Windows 2000 и Windows, в которых для COMSPEC
задано значение
command.com
, больше не поддерживаются из-за сложности обслуживания.
Поддержка OSF, объявленная устаревшей в версии 3.2, полностью удалена.
Устаревшие модули, функции и методы Python
- Передача непустой строки в
object.__format__()
устарела и создастTypeError
в Python 3.4 (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
. Используйте имена файлов в Юникод формате вместо байтовых имён файлов, чтобы больше не зависеть от кодовой страницы ANSI и поддерживать любое имя файла. - bpo-13988: модуль
xml.etree.cElementTree
устарел. Ускоритель используется автоматически, когда он доступен. - Поведение
time.clock()
зависит от платформы: вместо этого используйте новую функциюtime.perf_counter()
илиtime.process_time()
, в зависимости от ваших требований, чтобы иметь четко определённое поведение. - Функция
os.stat_float_times()
устарела. - Модуль
abc
:abc.abstractproperty
устарел, вместо него используйтеproperty
сabc.abstractmethod()
.abc.abstractclassmethod
устарел, вместо него используйтеclassmethod
сabc.abstractmethod()
.abc.abstractstaticmethod
устарел, вместо него используйтеstaticmethod
сabc.abstractmethod()
.
- Пакет
importlib
:importlib.abc.SourceLoader.path_mtime()
теперь устарел в пользуimportlib.abc.SourceLoader.path_stats()
, т. к. файлы байт-кода теперь хранят как время модификации, так и размер исходного файла, из которого был скомпилирован файл байт-кода.
Устаревшие функции и типы C API
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()
Устаревшие функции
Код формата 'u'
модуля array
теперь устарел и будет удалён в 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
, если вы очищаете записи в словаре путей, у которых нет поисковика, вам нужно удалить ключи в паре со значениямиNone
а такжеimp.NullImporter
для обеспечения обратной совместимости. Это приведёт к дополнительным накладным расходам в более старых версиях Python, которые повторно вставляютNone
вsys.path_importer_cache
, где это представляет использование неявных средств поиска, но семантически это ничего не должно изменить. importlib.abc.Finder
больше не указывает абстрактный метод find_module(), который должен быть реализован. Если вы полагались на подклассы для реализации этого метода, обязательно сначала проверьте существование метода. Вы, вероятно, захотите сначала проверить find_loader(), в случае работы с поисковиком пути входа.pkgutil
был преобразован для внутреннего использованияimportlib
. Это устраняет многие крайние случаи, когда старое поведение эмуляции импорта PEP 302 не соответствовало поведению реальной системы импорта. Сама эмуляция импорта по-прежнему присутствует, но теперь она устарела. Функцииpkgutil.iter_importers()
иpkgutil.walk_packages()
являются особым случаем стандартных обработчиков импорта, поэтому они по-прежнему поддерживаются, даже если они не предоставляют нестандартный методiter_modules()
.- Исправлена давняя ошибка соответствия RFC (bpo-1079) при парсинге
email.header.decode_header()
. Код, использующий стандартную идиому для преобразования закодированных заголовков в Юникод (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
и все функции, использующие данный тип, устарели (но останутся доступными не менее пяти лет). Если вы использовали низкоуровневые Юникод API-интерфейсы для создания и доступа к Юникод объектам и хотите воспользоваться преимуществами сокращения объёма памяти, обеспечиваемого PEP 393, вам необходимо преобразовать код в новый Юникод API.Однако, если вы использовали только высокоуровневые функции, такие как
PyUnicode_Concat()
,PyUnicode_Join()
илиPyUnicode_FromFormat()
, ваш код автоматически использует преимущества новых Юникод представлений.PyImport_GetMagicNumber()
теперь возвращает-1
при ошибке.Поскольку отрицательное значение аргумента level для
__import__()
больше недопустимо, то же самое теперь верно и дляPyImport_ImportModuleLevel()
. Это также означает, что значение level, используемоеPyImport_ImportModuleEx()
, теперь равно0
вместо-1
.
Сборка С расширений
Диапазон возможных имён файлов для C расширений был сужен. Очень редко используемые варианты написания были подавлены: в соответствии с POSIX файлы с именами
xxxmodule.so
,xxxmodule.abi3.so
иxxxmodule.cpython-*.so
больше не распознаются как реализующие модульxxx
. Если вы создавали такие файлы, вы должны переключиться на другие варианты написания (т. е. удалить строкуmodule
из имён файлов).(реализовано в bpo-14040.)
Изменения опций командной строки
Флаг командной строки -Q и связанные с ним артефакты были удалены. Проверка кода sys.flags.division_warning потребует обновления.
(bpo-10998, предоставлено Эриком Араужо)
Когда python запускается с
-S
,import site
больше не будет добавлять пути для сайтов в пути поиска модулей. В предыдущих версиях так и было.(bpo-11591, предоставлено Карлом Мейером с редакцией Эрика Араужо)