Что нового в Python 3.3¶
В этой статье описываются новые возможности Python 3.3 по сравнению с версией 3.2. Версия Python 3.3 была выпущена 29 сентября 2012 года. Более подробную информацию смотрите в changelog.
См.также
PEP 398 - Расписание выхода Python 3.3
Краткое описание - Основные моменты выпуска¶
Новые возможности синтаксиса:
Новое выражение
yield from
для generator delegation.Синтаксис
u'unicode'
снова принимается для объектовstr
.
Новые библиотечные модули:
faulthandler
(помогает отлаживать низкоуровневые сбои)ipaddress
(объекты высокого уровня, представляющие IP-адреса и маски)lzma
(сжатие данных с использованием алгоритма XZ / LZMA)unittest.mock
(замените тестируемые части вашей системы макетными объектами)venv
(Python virtual environments, как в популярном пакетеvirtualenv
)
Новые встроенные функции:
Переработано I/O exception hierarchy.
Усовершенствования в области внедрения:
Переписано import machinery на основе
importlib
.Более компактный unicode strings.
Более компактный attribute dictionaries.
Значительно улучшенные библиотечные модули:
Ускоритель C для модуля decimal.
Улучшена обработка юникода в модуле email (provisional).
Улучшения в области безопасности:
По умолчанию включена рандомизация хэша.
Пожалуйста, ознакомьтесь с полным списком изменений, с которыми сталкиваются пользователи.
PEP 405: Виртуальные среды¶
Виртуальные среды позволяют создавать отдельные настройки Python, а также совместно использовать общесистемную базовую установку для удобства обслуживания. Виртуальные среды имеют свой собственный набор пакетов для частного сайта (т.е. локально установленных библиотек) и могут быть дополнительно отделены от общесистемных пакетов для сайта. Их концепция и реализация вдохновлены популярным пакетом virtualenv
сторонних разработчиков, но выигрывают от более тесной интеграции с ядром интерпретатора.
Это приложение добавляет модуль venv
для программного доступа и скрипт pyvenv
для доступа из командной строки и администрирования. Интерпретатор Python проверяет наличие pyvenv.cfg
, файла, существование которого указывает на основание дерева каталогов виртуальной среды.
См.также
- PEP 405 - Виртуальные среды Python
PEP, написанный Карлом Мейером; реализация - Карлом Мейером и Винаем Саджипом
PEP 420: Неявные пакеты пространства имен¶
Встроенная поддержка каталогов пакетов, для которых не требуются файлы-маркеры __init__.py
и которые могут автоматически охватывать несколько сегментов пути (вдохновлены различными сторонними подходами к пакетам пространства имен, как описано в PEP 420)
См.также
- PEP 420 - Неявные пакеты пространства имен
PEP, написанный Эриком В. Смитом; реализация - Эриком В. Смитом и Барри Уоршоу
PEP 3118: Новая реализация memoryview и документация по протоколу buffer¶
Реализация PEP 3118 была значительно улучшена.
Новая реализация memoryview полностью устраняет все проблемы с владением и сроком службы динамически распределяемых полей в структуре Py_buffer, которые приводили к многочисленным сбоям в работе. Кроме того, исправлены некоторые функции, которые приводили к сбоям или возвращали неверные результаты для несмежных или многомерных входных данных.
Объект memoryview теперь имеет функцию getbufferproc(), совместимую с PEP-3118, которая проверяет тип запроса пользователя. Добавлено много новых функций, большинство из которых работают в полном соответствии с общими требованиями для несмежных массивов и массивов с вложенными смещениями.
Обновлена документация, в которой четко прописаны обязанности как экспортеров, так и потребителей. Флаги запроса буфера сгруппированы в базовые и составные флаги. Объясняется расположение памяти в несмежных и многомерных массивах в стиле NumPy.
Особенности¶
Теперь поддерживаются все собственные спецификаторы односимвольного формата в синтаксисе модуля struct (необязательно с префиксом «@»).
С некоторыми ограничениями метод cast() позволяет изменять формат и форму C-непрерывных массивов.
Многомерные представления списков поддерживаются для любого типа массива.
Многомерные сравнения поддерживаются для любого типа массива.
Теперь доступны одномерные представления памяти хэшируемых (доступных только для чтения) типов в форматах B, b или c. (Автор: Антуан Питру в bpo-13411).
Поддерживается произвольная нарезка любого типа одномерных массивов. Например, теперь можно изменить вид памяти в O(1), используя отрицательный шаг.
Изменения в API¶
Максимальное количество измерений официально ограничено 64.
Представление пустой фигуры, шагов и подотстроек теперь представляет собой пустой кортеж вместо
None
.Доступ к элементу представления в памяти с форматом «B» (байты без знака) теперь возвращает целое число (в соответствии с синтаксисом модуля struct). Для возврата объекта bytes сначала необходимо преобразовать представление в «c».
сравнения в режиме memoryview теперь используют логическую структуру операндов и сравнивают все элементы массива по значению. Поддерживаются все форматные строки в синтаксисе модуля struct. Представления с нераспознанными форматными строками по-прежнему разрешены, но всегда будут сравниваться как неравные, независимо от содержимого представления.
Дополнительные изменения приведены в разделах Build and C API Changes и Porting C code.
(Автор: Стефан Кра в bpo-10181.)
См.также
PEP 3118 - Изменение протокола буферизации
PEP 393: Гибкое представление строк¶
Тип строки в Юникоде изменен для поддержки нескольких внутренних представлений, в зависимости от символа с наибольшим порядковым номером в Юникоде (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
был удален.
Производительность и использование ресурсов¶
Хранение строк в Юникоде теперь зависит от самой высокой кодовой точки в строке:
в чистых строках ASCII и Latin1 (
U+0000-U+00FF
) используется 1 байт на кодовую точку;В строках BMP (
U+0000-U+FFFF
) используется 2 байта на кодовую точку;в строках, отличных от BMP (
U+10000-U+10FFFF
), используется 4 байта на кодовую точку.
Конечным результатом является то, что для большинства приложений использование памяти для хранения строк должно значительно сократиться - особенно по сравнению с предыдущими сборками для широкого использования в unicode, - поскольку во многих случаях строки будут представлять собой чистый ASCII даже в международных контекстах (поскольку многие строки хранят данные, не относящиеся к человеческому языку, такие как фрагменты XML, заголовки HTTP, Данные в кодировке JSON и т.д.). Мы также надеемся, что это по тем же причинам повысит эффективность кэширования процессора в нетривиальных приложениях. Использование памяти в Python 3.3 в два-три раза меньше, чем в Python 3.2, и немного лучше, чем в Python 2.7, в тесте Django (подробности смотрите в PEP).
См.также
- PEP 393 - Гибкое строковое представление
PEP, написанный Мартином фон Левисом; реализация - Торстеном Беккером и Мартином фон Левисом.
PEP 397: Программа запуска Python для Windows¶
Установщик Windows Python 3.3 теперь включает в себя py
приложение запуска, которое можно использовать для запуска приложений Python независимо от версии.
Эта программа запуска вызывается неявно при двойном щелчке по файлам *.py
. Если в системе установлена только одна версия Python, эта версия будет использоваться для запуска файла. Если установлено несколько версий, по умолчанию используется самая последняя версия, но это можно изменить, включив в скрипт Python строку shebang в стиле Unix.
Программа запуска также может быть использована явно из командной строки в качестве приложения py
. Запуск py
выполняется по тем же правилам выбора версии, что и неявный запуск скриптов, но можно выбрать более конкретную версию, передав соответствующие аргументы (например, -3
для запроса Python 3, когда также установлен Python 2, или -2.6
чтобы специально запросить более раннюю версию Python при установке более поздней версии).
В дополнение к программе запуска, установщик Windows теперь включает в себя возможность добавления недавно установленного Python в системный ПУТЬ. (Автор: Брайан Кертин в bpo-3561.)
См.также
- PEP 397 - Программа запуска Python для Windows
Руководство написано Марком Хаммондом и Мартином В. Льюисом; автор - Винай Саджип.
Документация по программе запуска: Программа запуска Python для Windows
Изменение ПУТИ установки: Поиск исполняемого файла Python
PEP 3151: Переработка иерархии исключений операционной системы и ввода-вывода¶
Иерархия исключений, возникающих из-за ошибок операционной системы, теперь упрощена и более детализирована.
Вам больше не нужно беспокоиться о выборе подходящего типа исключения из списка OSError
, IOError
, EnvironmentError
, WindowsError
, mmap.error
, socket.error
или select.error
. Для всех этих типов исключений теперь существует только один: OSError
. Остальные имена сохранены в качестве псевдонимов из соображений совместимости.
Кроме того, теперь стало проще отслеживать конкретное состояние ошибки. Вместо проверки атрибута errno
(или args[0]
) для конкретной константы из модуля errno
вы можете найти соответствующий подкласс OSError
. Доступны следующие подклассы:
И сам ConnectionError
имеет более детализированные подклассы:
Благодаря новым исключениям, теперь можно избежать обычного использования errno
. Например, следующий код написан для Python 3.2:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt file is missing")
elif err.errno in (EACCES, EPERM):
print("You are not allowed to read document.txt")
else:
raise
теперь они могут быть записаны без импорта errno
и без ручной проверки атрибутов исключений:
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("document.txt file is missing")
except PermissionError:
print("You are not allowed to read document.txt")
См.также
- PEP 3151 - Переработка иерархии исключений операционной системы и ввода-вывода
PEP, написанный и реализованный Антуаном Питру
PEP 380: Синтаксис для делегирования подгенератору¶
PEP 380 добавляет выражение yield from
, позволяющее generator делегировать часть своих операций другому генератору. Это позволяет исключить фрагмент кода, содержащий yield
, и поместить его в другой генератор. Кроме того, подгенератору разрешено возвращать значение, и это значение становится доступным для делегирующего генератора.
Хотя выражение yield from
предназначено в первую очередь для использования при делегировании подгенератору, на самом деле оно позволяет делегировать произвольным подитераторам.
Для простых итераторов yield from iterable
- это, по сути, просто сокращенная форма for item in iterable: yield item
:
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
Однако, в отличие от обычного цикла, yield from
позволяет подгенераторам получать отправленные и переданные значения непосредственно из вызывающей области и возвращать конечное значение внешнему генератору:
>>> def accumulate():
... tally = 0
... while 1:
... next = yield
... if next is None:
... return tally
... tally += next
...
>>> def gather_tallies(tallies):
... while 1:
... tally = yield from accumulate()
... tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc) # Ensure the accumulator is ready to accept values
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Finish the first tally
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Finish the second tally
>>> tallies
[6, 10]
Основной принцип, лежащий в основе этого изменения, заключается в том, чтобы даже генераторы, предназначенные для использования с методами send
и throw
, можно было разделить на несколько подгенераторов так же легко, как одну большую функцию можно разделить на несколько подфункций.
См.также
- PEP 380 - Синтаксис для делегирования подгенератору
PEP written by Greg Ewing; implementation by Greg Ewing, integrated into 3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by Zbigniew Jedrzejewski-Szmek and Nick Coghlan
PEP 409: Подавление контекста исключения¶
PEP 409 вводит новый синтаксис, который позволяет отключить отображение контекста связанных исключений. Это позволяет получать более четкие сообщения об ошибках в приложениях, которые преобразуют типы исключений:
>>> class D:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
Без суффикса from None
, указывающего на причину, исходное исключение отображалось бы по умолчанию:
>>> class C:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
File "<stdin>", line 6, in __getattr__
KeyError: 'x'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
При этом не теряется возможность отладки, поскольку исходный контекст исключения остается доступным при необходимости (например, если промежуточная библиотека неправильно скрыла важные базовые данные).:
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
См.также
- PEP 409 - Подавление контекста исключения
PEP написан Итаном Фурманом; реализован Итаном Фурманом и Ником Когланом.
PEP 414: Явные литералы Юникода¶
Чтобы облегчить переход с Python 2 на Python-приложения с поддержкой Unicode, которые активно используют литералы Unicode, в Python 3.3 снова поддерживается префикс «u
» для строковых литералов. Этот префикс не имеет семантического значения в Python 3, он предусмотрен исключительно для уменьшения количества чисто механических изменений при переходе на Python 3, что позволяет разработчикам сосредоточиться на более существенных семантических изменениях (таких как более строгое разделение двоичных и текстовых данных по умолчанию).
См.также
- PEP 414 - Явные литералы Юникода
БОДРЯЩИЙ настрой, написанный Армином Роначером.
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
предоставляет информацию, относящуюся к реализации текущего интерпретатора. Начальным набором атрибутов для 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
для управления поведением кэширования модулей.
Простое пространство имен¶
Реализация sys.implementation
также вводит новый тип в Python: types.SimpleNamespace
. В отличие от пространства имен, основанного на отображении, например dict
, SimpleNamespace
, оно основано на атрибутах, например object
. Однако, в отличие от object
, SimpleNamespace
экземпляры доступны для записи. Это означает, что вы можете добавлять, удалять и изменять пространство имен с помощью обычного доступа к атрибутам.
См.также
- PEP 421 - Добавлена системная реализация
PEP, написанный и реализованный Эриком Сноу.
Использование importlib в качестве реализации импорта¶
bpo-2377 - Заменить __import__ на/ importlib.__import__ bpo-13959 - Повторно реализовать части imp
на чистом Python bpo-14605 - Сделать механизм импорта явным bpo-14646 - Требуется установить загрузчики __loader__ и __package__
Функция __import__()
теперь работает на основе importlib.__import__()
. Эта работа завершает «фазу 2» PEP 302. У этого изменения есть множество преимуществ. Во-первых, это позволило использовать больше механизмов, обеспечивающих импорт, вместо того, чтобы быть неявными и скрытыми в коде на C. Это также обеспечивает единую реализацию для всех виртуальных машин на Python, поддерживающих Python 3.3, что помогает устранить любые отклонения в семантике импорта, характерные для конкретной виртуальной машины. И, наконец, это облегчает поддержание импорта, обеспечивая рост в будущем.
Для обычного пользователя не должно быть заметных изменений в семантике. Для тех, чей код в настоящее время управляет import или вызывает import программно, изменения кода, которые могут потребоваться, описаны в разделе Porting Python code этого документа.
Новые API-интерфейсы¶
Одним из больших преимуществ этой работы является раскрытие того, что требуется для выполнения инструкции import. Это означает, что различные импортеры, которые когда-то были неявными, теперь полностью доступны как часть пакета importlib
.
Абстрактные базовые классы, определенные в importlib.abc
, были расширены для правильного разграничения между meta path finders и path entry finders, введя importlib.abc.MetaPathFinder
и importlib.abc.PathEntryFinder
соответственно. Старая азбука 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
теперь хранятся все средства поиска мета-путей и перехватчики ввода пути, используемые при импорте. Ранее средства поиска были неявными и скрывались в коде импорта на C, а не были доступны напрямую. Это означает, что теперь можно легко удалить или изменить порядок расположения различных средств поиска в соответствии со своими потребностями.
Еще одно изменение заключается в том, что все модули имеют атрибут __loader__
, сохраняющий загрузчик, используемый для создания модуля. PEP 302 был обновлен, чтобы сделать этот атрибут обязательным для реализации загрузчиками, поэтому в будущем, как только сторонние загрузчики будут обновлены, пользователи смогут уметь полагаться на существование этого атрибута. Однако до этого времени импорт - это настройка последующей загрузки модуля.
Также ожидается, что загрузчики теперь будут устанавливать атрибут __package__
из PEP 366. Еще раз, сам import уже устанавливает этот параметр для всех загрузчиков из importlib
, а сам import устанавливает атрибут после загрузки.
None
теперь вставляется в sys.path_importer_cache
, если поисковик не может быть найден в sys.path_hooks
. Поскольку imp.NullImporter
напрямую не отображается в sys.path_hooks
, больше нельзя полагаться на то, что он всегда будет доступен для использования в качестве значения, представляющего значение, которое не найдено поисковиком.
Все остальные изменения относятся к семантическим изменениям, которые следует учитывать при обновлении кода для Python 3.3, и, следовательно, о них следует прочитать в разделе Porting Python code этого документа.
(Реализация Бреттом Кэнноном)
Другие языковые изменения¶
Вот некоторые небольшие изменения, внесенные в основной язык Python:
Добавлена поддержка псевдонимов имен в Юникоде и именованных последовательностей. Как
unicodedata.lookup()
, так и'\N{...}'
теперь разрешают псевдонимы имен, аunicodedata.lookup()
также разрешает именованные последовательности.(Автор: Эцио Мелотти в bpo-12753.)
База данных Unicode обновлена до UCD версии 6.1.0
Сравнение на равенство объектов
range()
теперь возвращает результат, отражающий равенство базовых последовательностей, сгенерированных этими объектами диапазона. (bpo-13201)Методы
count()
,find()
,rfind()
,index()
иrindex()
объектовbytes
иbytearray
теперь принимают в качестве первого аргумента целое число от 0 до 255.(Автор Петри Лехтинен в статье bpo-12170.)
Методы
rjust()
,ljust()
, иcenter()
изbytes
иbytearray
теперь принимаютbytearray
в качестве аргументаfill
. (Автор Петри Лехтинен в статье bpo-12380.)Новые методы были добавлены в
list
иbytearray
:copy()
иclear()
(bpo-10516). Следовательно,MutableSequence
теперь также определяет методclear()
(bpo-11388).Необработанные байтовые литералы теперь могут быть записаны как
rb"..."
, так иbr"..."
.(Автор: Антуан Питру в статье bpo-13748.)
dict.setdefault()
теперь выполняется только один поиск по данному ключу, что делает его атомарным при использовании со встроенными типами.(Contributed by Filip Gruszczyński in bpo-13521.)
Были значительно улучшены сообщения об ошибках, появляющиеся при вызове функции, которая не соответствует сигнатуре функции.
(Автор: Бенджамин Питерсон.)
Более Мелкозернистый импортный замок¶
Предыдущие версии Python всегда полагались на глобальную блокировку импорта. Это приводило к неожиданным неприятностям, таким как взаимоблокировки, когда импорт модуля запускал выполнение кода в другом потоке в качестве побочного эффекта. Иногда использовались неуклюжие обходные пути, такие как PyImport_ImportModuleNoBlock()
Функция C API.
В Python 3.3 импорт модуля блокируется для каждого модуля. Это корректно упорядочивает импорт данного модуля из нескольких потоков (предотвращая доступ к не полностью инициализированным модулям), устраняя вышеупомянутые неудобства.
(Автор: Антуан Питру в статье bpo-9260.)
Встроенные функции и типы¶
open()
получает новый параметр opener: базовый файловый дескриптор для файлового объекта затем получается путем вызова opener с помощью (file, flags). Его можно использовать для использования пользовательских флагов, таких как, например,os.O_CLOEXEC
. Добавлен режим'x'
: открыть для эксклюзивного создания, сбой, если файл уже существует.print()
: добавлен аргумент ключевого слова flush. Если аргумент ключевого слова flush равен true, поток принудительно очищается.hash()
: рандомизация хэша включена по умолчанию, смотритеobject.__hash__()
иPYTHONHASHSEED
.Тип
str
получает новый методcasefold()
: возвращает копию строки в сложенном виде, строки в сложенном виде могут использоваться для сопоставления без регистра. Например,'ß'.casefold()
возвращает'ss'
.Документация по последовательностям была существенно переработана, чтобы лучше объяснить различие между двоичной и текстовой последовательностями и предоставить специальные разделы документации для отдельных встроенных типов последовательностей (bpo-4966).
Новые модули¶
исправитель ошибок¶
Этот новый модуль отладки faulthandler
содержит функции для явного сброса результатов трассировки 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
ip-адрес¶
Новый модуль ipaddress
предоставляет инструменты для создания и управления объектами, представляющими адреса IPv4 и IPv6, сети и интерфейсы (т.е. IP-адрес, связанный с определенной IP-подсетью).
(Предоставлено Google и Питером Муди в статье PEP 3144.)
лзма¶
Недавно добавленный модуль lzma
обеспечивает сжатие и распаковку данных с использованием алгоритма LZMA, включая поддержку форматов файлов .xz
и .lzma
.
(Авторы: Надим Вауда и Пер Эйвинд Карлсен в статье bpo-6715.)
Улучшенные модули¶
азбука¶
Улучшена поддержка абстрактных базовых классов, содержащих дескрипторы, составленные с помощью абстрактных методов. Рекомендуемый подход к объявлению абстрактных дескрипторов теперь заключается в предоставлении __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.)
базовый уровень 64¶
Функции декодирования в современном интерфейсе base64
теперь принимают строки Юникода только в формате ASCII. Например, base64.b64decode('YWJj')
возвращает b'abc'
. (Автор: Каталин Якоб в статье bpo-13641.)
бинаскии¶
В дополнение к двоичным объектам, которые они обычно принимают, функции 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
теперь реализованы всеio.BufferedIOBase
API, за исключениемdetach()
иtruncate()
методов.
кодеки¶
Кодек mbcs
был переписан для корректной обработки обработчиков ошибок replace
и ignore
во всех версиях Windows. Кодек mbcs
теперь поддерживает все обработчики ошибок, а не только replace
для кодирования и ignore
для декодирования.
Добавлен новый кодек, предназначенный только для Windows: cp65001
(bpo-13216). Это кодовая страница Windows 65001 (Windows UTF-8, CP_UTF8
). Например, он используется sys.stdout
, если для кодовой страницы вывода консоли задано значение cp65001 (например, с помощью команды chcp 65001
).
Многобайтовые CJK-декодеры теперь выполняют повторную синхронизацию быстрее. Они игнорируют только первый байт недопустимой последовательности байтов. Например, b'\xff\n'.decode('gb2312', 'replace')
теперь возвращает \n
после заменяющего символа.
Инкрементные кодеры CJK-кодека больше не сбрасываются при каждом вызове их методов encode(). Например:
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'
В этом примере приведен b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'
для более старых версий Python.
Кодек unicode_internal
устарел.
коллекции¶
Добавлен новый класс ChainMap
, позволяющий рассматривать несколько отображений как единое целое. (Написано Раймондом Хеттингером для bpo-11089, опубликовано в bpo-11297.)
Абстрактные базовые классы были перенесены в новый модуль collections.abc
, чтобы лучше отличать абстрактные классы от конкретных коллекций. Псевдонимы для ABC по-прежнему присутствуют в модуле collections
, чтобы сохранить существующий импорт. (bpo-11085)
Класс Counter
теперь поддерживает унарные операторы +
и -
, а также встроенные операторы +=
, -=
, |=
и &=
. (Материал подготовлен Раймондом Хеттингером в bpo-13121.)
контекстная библиотека¶
ExitStack
теперь это прочная основа для программного управления контекстными менеджерами и аналогичной функциональности очистки. В отличие от предыдущего contextlib.nested
API (который был признан устаревшим и удален), новый API предназначен для корректной работы независимо от того, получают ли контекстные менеджеры свои ресурсы своим методом __init__
(например, файловые объекты) или своим методом __enter__
метод (например, объекты синхронизации из модуля threading
).
склеп¶
Добавление соли и модульного формата шифрования (метод хеширования), а также функции mksalt()
в модуль crypt
.
проклятия¶
Если модуль
curses
связан с библиотекой ncursesw, используйте функции Unicode при передаче строк или символов Unicode (например, c:func:waddwstr), а функции bytes - в противном случае (например, c:func:waddstr).Используйте языковую кодировку вместо
utf-8
для кодирования строк в Юникоде.curses.window
имеет новый атрибутcurses.window.encoding
.В классе
curses.window
есть новый методget_wch()
для получения расширенного символаВ модуле
curses
есть новая функцияunget_wch()
для ввода расширенного символа, поэтому следующийget_wch()
вернет его
(Автор - Иньиго Серна в bpo-6755.)
дата и время¶
Сравнение на равенство между экземплярами naive и aware
datetime
теперь возвращаетFalse
вместо повышенияTypeError
(bpo-15006).Новый метод
datetime.datetime.timestamp()
: Возвращает временную метку POSIX, соответствующую экземпляруdatetime
.Метод
datetime.datetime.strftime()
поддерживает форматирование старше 1000 лет.Метод
datetime.datetime.astimezone()
теперь можно вызывать без аргументов для преобразования экземпляра datetime в системный часовой пояс.
десятичный¶
- bpo-7652 - интегрируйте быструю встроенную десятичную арифметику.
C-модуль и libmpdec написаны Стефаном Крахом.
Новая версия десятичного модуля на языке Си интегрирует высокоскоростную библиотеку libmpdec для вычисления десятичных чисел с плавающей запятой произвольной точности с правильным округлением. libmpdec соответствует общей спецификации десятичной арифметики IBM.
Прирост производительности составляет от 10 раз для приложений баз данных до 100 раз для приложений с интенсивной вычислительной нагрузкой. Эти цифры являются ожидаемым приростом при стандартной точности, используемой в десятичной арифметике с плавающей запятой. Поскольку точность настраивается пользователем, точные цифры могут варьироваться. Например, в арифметике с целыми числами различия могут быть значительно выше.
Следующая таблица предназначена для иллюстрации. Контрольные показатели доступны по адресу https://www.bytereef.org/mpdecimal/quickstart.html.
decimal.py
_десятичный
ускорение
пи
42.02с
0,345с
120х
телефонная связь
172.19с
5,68с
30х
психопг
3,57с
0,29с
12 раз
Особенности¶
Сигнал
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()
, чтобы получить округленное или неточное значение.Функция степени в decimal.py всегда округляется правильно. В версии C она определяется в терминах функций
exp()
иln()
с правильным округлением, но конечный результат - это всего лишь «почти всегда правильно округленное значение».В версии C контекстным словарем, содержащим сигналы, является
MutableMapping
. Из соображений быстродействияflags
иtraps
всегда ссылаются на один и тот жеMutableMapping
, с помощью которого был инициализирован контекст. Если назначен новый словарь сигналов, тоflags
иtraps
обновляются новыми значениями, но они не ссылаются на словарь RHS.Обработка
Context
приводит к другому результату, чтобы иметь общий формат обмена для версий Python и C.Порядок аргументов в конструкторе
Context
был изменен в соответствии с порядком, отображаемым вrepr()
.Параметр
watchexp
в методеquantize()
устарел.
электронная почта¶
Политическая основа¶
Пакет электронной почты теперь имеет структуру policy
. Policy
- это объект с несколькими методами и свойствами, которые управляют поведением пакета электронной почты. Основной политикой для Python 3.3 является политика Compat32
, которая обеспечивает обратную совместимость с пакетом электронной почты в Python 3.2. policy
может быть указана, когда сообщение электронной почты анализируется с помощью parser
, или когда Message
создается объект или когда электронное письмо сериализуется с помощью generator
. Если политика, переданная parser
, не переопределена, она наследуется всеми объектами Message
и подобъектами, созданными parser
. По умолчанию generator
будет использовать политику объекта Message
, который он сериализует. Политика по умолчанию - compat32
.
Минимальный набор элементов управления, реализуемых всеми объектами policy
, составляет:
максимальная длина линии |
Максимальная длина, за исключением символов linesep, которую могут иметь отдельные строки при сериализации |
линейный шаг |
Символ, используемый для разделения отдельных строк при сериализации |
тип cte_type |
|
вызов_на_дефекта |
Вызывает ошибку |
Новый экземпляр политики с новыми настройками создается с использованием метода clone()
объектов политики. clone
принимает любой из вышеперечисленных элементов управления в качестве ключевых аргументов. Любой элемент управления, не указанный в вызове, сохраняет значение по умолчанию. Таким образом, вы можете создать политику, которая использует \r\n
символы linesep следующим образом:
mypolicy = compat32.clone(linesep='\r\n')
Политики могут быть использованы для упрощения создания сообщений в формате, необходимом вашему приложению. Вместо того, чтобы постоянно указывать linesep='\r\n'
во всех местах, где вы вызываете generator
, вы можете указать его один раз, когда устанавливаете политику, используемую parser
или Message
, в зависимости от того, что ваша программа использует для создания объектов Message
. С другой стороны, если вам нужно генерировать сообщения в нескольких формах, вы все равно можете указать параметры в соответствующем вызове generator
. Или вы можете создать пользовательские экземпляры политики для разных обращений и передать их при создании generator
.
Предварительная политика с новым API заголовков¶
Хотя структура политики полезна сама по себе, основной мотив для ее внедрения заключается в том, чтобы позволить создавать новые политики, которые реализуют новые функции для почтового пакета таким образом, чтобы обеспечить обратную совместимость для тех, кто не использует новые политики. Поскольку новые политики вводят новый API, мы выпускаем их в версии Python 3.3 в виде provisional policy. Если разработчики ядра сочтут это необходимым, могут произойти несовместимые изменения (вплоть до удаления кода).
Новые политики являются экземплярами EmailPolicy
и добавляют следующие дополнительные элементы управления:
переформатировать_источник |
Определяет, будут ли заголовки, обработанные с помощью |
заголовок_factory |
Вызываемый объект, который принимает |
header_factory
является ключом к новым функциям, предоставляемым новыми политиками. При использовании одной из новых политик любой заголовок, извлеченный из объекта Message
, является объектом, созданным header_factory
, и каждый раз, когда вы устанавливаете заголовок для Message
, он становится объектом, созданным header_factory
. Все такие объекты header имеют атрибут 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
объектов header для доступа к группам и отдельным адресам:
>>> 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
и завершения работы с Bytes API.
Новые полезные функции:
format_datetime()
: задано значениеdatetime
, создайте строку, отформатированную для использования в заголовке электронного письма.parsedate_to_datetime()
: получив строку даты из заголовка электронного письма, преобразуйте ее в значениеdatetime
или в значениеdatetime
, если смещение равно-0000
.localtime()
: Без аргумента возвращает текущее местное время в видеdatetime
, используя местноеtimezone
. Учитывая значениеdatetime
, преобразуйте его в значениеdatetime
, используя локальное значениеtimezone
.
ftplib (продолжение)¶
ftplib.FTP
теперь принимает аргумент ключевого словаsource_address
, чтобы указать(host, port)
, который будет использоваться в качестве исходного адреса в вызове bind при создании исходящего сокета. (Автор: Джампаоло Родола в bpo-8594.)Класс
FTP_TLS
теперь предоставляет новую функциюccc()
, позволяющую вернуть управление каналом обратно к открытому тексту. Это может быть полезно для использования преимуществ брандмауэров, которые знают, как обрабатывать NAT с незащищенным FTP, не открывая фиксированные порты. (Автор: Джампаоло Родола в bpo-12139.)Добавлен метод
ftplib.FTP.mlsd()
, который обеспечивает переносимый формат списка каталогов, и устаревшиеftplib.FTP.nlst()
иftplib.FTP.dir()
. (Добавлено Джампаоло Родолой в bpo-11072.)
функциональные средства¶
Декоратор functools.lru_cache()
теперь принимает аргумент ключевого слова typed
(который по умолчанию равен False
), чтобы гарантировать, что он кэширует значения разных типов, которые сравниваются одинаково, в отдельных ячейках кэша. (Материал подготовлен Раймондом Хеттингером в bpo-13227.)
gc (общий сбор)¶
Теперь можно регистрировать обратные вызовы, вызываемые сборщиком мусора до и после сбора, используя новый список callbacks
.
hmac (ВМС)¶
Добавлена новая функция compare_digest()
, предотвращающая атаки по сторонним каналам на дайджесты с помощью анализа времени. (Авторы Ник Коглан и Кристиан Хеймс в статье bpo-15061).
http¶
http.server.BaseHTTPRequestHandler
теперь заголовки буферизуются и записываются все сразу при вызове end_headers()
. Новый метод flush_headers()
может быть использован для непосредственного управления отправкой накопленных заголовков. (Автор: Эндрю Шааф в статье bpo-3709.)
http.server
теперь выдает корректный результат HTML 4.01 strict
. (Добавлено Эцио Мелотти в bpo-13295.)
http.client.HTTPResponse
теперь имеет метод readinto()
, что означает, что его можно использовать как класс io.RawIOBase
. (Автор Джон Кун в bpo-13464.)
HTML¶
html.parser.HTMLParser
теперь может анализировать неработающую разметку без возникновения ошибок, поэтому аргумент strict конструктора и исключение HTMLParseError
теперь устарели. Возможность разбора неработающей разметки является результатом ряда исправлений ошибок, которые также доступны в последних версиях Python 2.7/3.2. (Внесено Эцио Мелотти в bpo-15114, и bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)
В модуль html.entities
добавлен новый словарь html5
, который сопоставляет ссылки на именованные символы HTML5 с эквивалентными символами Unicode (например, html5['gt;'] == '>'
). Словарем теперь также пользуется HTMLParser
. (Автор Эцио Мелотти в bpo-11113 и bpo-15156.)
imaplib¶
Конструктор IMAP4_SSL
теперь принимает параметр SSLContext для управления параметрами защищенного канала.
(Автор: Сиджин Джозеф в bpo-8808.)
проверить¶
Добавлена новая функция getclosurevars()
. Эта функция сообщает о текущей привязке всех имен, на которые ссылается тело функции, и о том, где эти имена были разрешены, что упрощает проверку правильности внутреннего состояния при тестировании кода, который использует замыкания с отслеживанием состояния.
(Авторы - Меадор Инге и Ник Коглан в bpo-13062.)
Добавлена новая функция getgeneratorlocals()
. Эта функция отображает текущую привязку локальных переменных во фрейме стека генератора, что упрощает проверку корректности внутреннего состояния при тестировании генераторов.
(Автор: Меадор Инге в статье bpo-15153.)
ио¶
Функция open()
имеет новый режим 'x'
, который можно использовать исключительно для создания нового файла и создания FileExistsError
, если файл уже существует. Он основан на режиме C11 „x“ для fopen().
(Автор: Дэвид Тауншенд в bpo-12760.)
Конструктор класса TextIOWrapper
имеет новый необязательный аргумент write_through. Если значение write_through равно True
, вызовы write()
гарантированно не будут буферизованы: любые данные, записанные в объект TextIOWrapper
, немедленно передаются в его базовый двоичный буфер.
итеративные инструменты¶
accumulate()
теперь принимает необязательный аргумент func
для предоставления двоичной функции, предоставляемой пользователем.
регистрация¶
Функция basicConfig()
теперь поддерживает необязательный аргумент handlers
, который принимает повторяющийся набор обработчиков, добавляемых в корневой регистратор.
Атрибут уровня класса append_nul
был добавлен к SysLogHandler
, чтобы разрешить управление добавлением байта NUL
(\000
) к записям системного журнала, поскольку для некоторых демонов это требуется, в то время как для других он передается в журнал.
математика¶
В модуле math
появилась новая функция log2()
, которая возвращает логарифм x по основанию 2.
(Автор: Марк Дикинсон в bpo-11888.)
ммап¶
Метод 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
имеет новую функциюpipe2()
, которая позволяет создавать канал с флагамиO_CLOEXEC
илиO_NONBLOCK
, установленными атомарно. Это особенно полезно для предотвращения «гонки» в многопоточных программах.Модуль
os
имеет новую функциюsendfile()
, которая обеспечивает эффективный способ «нулевого копирования» данных из одного файлового дескриптора (или сокета) в другой. Фраза «нулевое копирование» относится к тому факту, что все копирование данных между двумя дескрипторами выполняется исключительно ядром, без копирования данных в буферы пользовательского пространства.sendfile()
может использоваться для эффективного копирования данных из файла на диске в сеть сокет, например, для загрузки файла.(Патч, представленный Россом Лагерволлом и Джампаоло Родолой в bpo-10882.)
Чтобы избежать таких проблем, как атаки символическими ссылками и проблемы с временными файлами и каталогами, надежнее (а также быстрее) манипулировать файловыми дескрипторами, а не именами файлов. Python 3.3 расширяет существующие функции и вводит новые возможности для работы с файловыми дескрипторами (bpo-4761, bpo-10755 и bpo-14626).
В модуле
os
есть новая функцияfwalk()
, аналогичная функцииwalk()
, за исключением того, что она также выдает файловые дескрипторы, относящиеся к посещаемым каталогам. Это особенно полезно, чтобы избежать расхождения символических ссылок.Следующие функции получают новые необязательные dir_fd (paths relative to directory descriptors) и/или follow_symlinks (not following symlinks):
access()
,chflags()
,chmod()
,chown()
,link()
,lstat()
,mkdir()
,mkfifo()
,mknod()
,open()
,readlink()
,remove()
,rename()
,replace()
,rmdir()
,stat()
,symlink()
,unlink()
,utime()
. Поддержку платформой использования этих параметров можно проверить с помощью наборовos.supports_dir_fd
иos.supports_follows_symlinks
.Следующие функции теперь поддерживают файловый дескриптор в качестве аргумента path:
chdir()
,chmod()
,chown()
,execve()
,listdir()
,pathconf()
,exists()
,stat()
,statvfs()
,utime()
. Поддержку платформы для этого можно проверить с помощью набораos.supports_fd
.
access()
принимает аргумент ключевого словаeffective_ids
, чтобы включить использование эффективного uid/gid, а не реального uid/gid при проверке доступа. Поддержка платформы для этого может быть проверена с помощью набораsupports_effective_ids
.Модуль
os
имеет две новые функции:getpriority()
иsetpriority()
. Они могут быть использованы для получения или установки точности/приоритета процесса способом, аналогичнымos.nice()
, но распространяющимся на все процессы, а не только на текущий.(Патч, представленный Джампаоло Родолой в bpo-10784.)
Новая функция
os.replace()
позволяет кроссплатформенно переименовывать файл с перезаписью назначения. С помощьюos.rename()
существующий целевой файл перезаписывается в POSIX, но выдает ошибку в Windows. (Автор: Антуан Питру в статье bpo-8828.)Семейство функций stat (
stat()
,fstat()
, иlstat()
) теперь поддерживает чтение временных меток файла с наносекундной точностью. Симметрично,utime()
теперь может записывать временные метки файлов с наносекундной точностью. (Добавлено Ларри Хастингсом в bpo-14127.)os.get_terminal_size`New << < 0>>> function queries the size of the terminal attached to a file descriptor. See also :func:`shutil.get_terminal_size()
. (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609.)
Новые функции для поддержки Linux extended attributes (bpo-12720):
getxattr()
,listxattr()
,removexattr()
,setxattr()
.Новый интерфейс для планировщика. These functions control how a process is allocated CPU time by the operating system. New functions:
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.
ре¶
str
регулярные выражения теперь поддерживают экранирование \u
и \U
.
(Автор: Сергей Сторчака в bpo-3665.)
схед¶
run()
теперь принимает параметр blocking, который, если ему присвоено значение false, заставляет метод выполнять запланированные события, срок действия которых истекает как можно скорее (если таковые имеются), а затем немедленно возвращаться. Это полезно, если вы хотите использоватьscheduler
в неблокирующих приложениях. (Добавлено Джампаоло Родолой в bpo-13449.)scheduler
класс теперь можно безопасно использовать в многопоточных средах. (Авторы: Джозия Карлсон и Джампаоло Родола в статье bpo-8684.)Параметры timefunc и delayfunct конструктора класса
scheduler
теперь необязательны и по умолчанию имеют значенияtime.time()
иtime.sleep()
соответственно. (Автор: Крис Кларк в статье bpo-13245.)enter()
иenterabs()
параметр argument теперь необязателен. (Добавлено Крисом Кларком в bpo-13245.)enter()
иenterabs()
теперь принимают параметр kwargs. (Добавлено Крисом Кларком в bpo-13245.)
выбирать¶
select.devpoll`Solaris и производные платформы имеют новый класс <<<0> > > для высокопроизводительных асинхронных сокетов через :file:
/dev/poll`. (Внесено Иисусом Сеа Авионом в bpo-6397.)
шлекс¶
Ранее недокументированная вспомогательная функция quote
из модулей pipes
была перенесена в модуль shlex
и задокументирована. quote()
корректно экранирует все символы в строке, которым в противном случае оболочка могла бы придать особое значение.
выключил¶
Новые функции:
disk_usage()
: предоставляет статистику общего количества используемого и свободного места на диске. (Добавлено Джампаоло Родолой в bpo-12442.)chown()
: позволяет изменять пользователя и/или группу по заданному пути, также указывая имена пользователей и групп, а не только их числовые идентификаторы. (Добавлено Сандро Тоси в bpo-12191.)shutil.get_terminal_size()
: возвращается размер терминального окна, к которому прилагается интерпретатор. (Contributed by Zbigniew Jędrzejewski-Szmek in 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()
, но с тайм-аутом.
Обработчик сигнала записывает номер сигнала в виде одного байта вместо нулевого байта в дескриптор файла пробуждения. Таким образом, можно ожидать более одного сигнала и знать, какие сигналы были поданы.
signal.signal()
иsignal.siginterrupt()
вызывают ошибку OSError вместо ошибки RuntimeError: ошибка OSError имеет атрибут errno.
smtpd - полиция¶
Модуль smtpd
теперь поддерживает RFC 5321 (расширенный SMTP) и RFC 1870 (расширение размера). Согласно стандарту, эти расширения включаются тогда и только тогда, когда клиент инициирует сеанс с помощью команды EHLO
.
(Первоначальная поддержка ELHO
была оказана Альберто Тревино. Юхана Яухиайнен увеличила размер. Существенная дополнительная работа над патчем была проделана Майклом Орром и Дэном Босуэллом. bpo-8739)
smtplib (ссылка)¶
Классы SMTP
, SMTP_SSL
, и LMTP
теперь принимают аргумент ключевого слова source_address
, чтобы указать (host, port)
, который будет использоваться в качестве исходного адреса в вызове bind при создании исходящего сокета. (Автор: Пауло Скардин в bpo-11281.)
SMTP
теперь поддерживается протокол управления контекстом, позволяющий использовать экземпляр SMTP
в инструкции with
. (Добавлено Джампаоло Родолой в bpo-11289.)
Конструктор SMTP_SSL
и метод starttls()
теперь принимают параметр SSLContext для управления параметрами защищенного канала. (Добавлено Касуном Хератом в bpo-8809.)
разъем¶
Класс
socket
теперь предоставляет дополнительные методы для обработки вспомогательных данных, если они поддерживаются базовой платформой:(Добавлено Дэвидом Уотсоном в bpo-6560, основано на более раннем патче Хайко Вундрама)
Класс
socket
теперь поддерживает семейство протоколов PF_CAN (https://en.wikipedia.org/wiki/Socketcan) в Linux (https://lwn.net/Articles/253425).(Автор - Маттиас Фукс, дополнено Тьяго Гонсалвесом в bpo-10141.)
Класс
socket
теперь поддерживает семейство протоколов PF_RDS (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets и https://oss.oracle.com/projects/rds).Класс
socket
теперь поддерживает семейство протоколовPF_SYSTEM
в OS X. (Добавлено Майклом Годербауэром в bpo-13777).Новая функция
sethostname()
позволяет задавать имя хоста в системах Unix, если вызывающий процесс обладает достаточными привилегиями. (Добавлено Россом Лагерволлом в bpo-10866.)
сокетсервер¶
BaseServer
теперь имеет переопределяемый метод service_actions()
, который вызывается методом serve_forever()
в цикле обслуживания. ForkingMixIn
теперь использует его для очистки дочерних процессов-зомби. (Автор: Джастин Уоркентин в статье bpo-11109.)
sqlite3¶
Новый sqlite3.Connection
метод set_trace_callback()
может быть использован для отслеживания всех sql-команд, обрабатываемых sqlite. (Добавлено Торстеном Ландшоффом в bpo-11688.)
протокол ssl¶
Модуль
ssl
имеет две новые функции случайной генерации:RAND_bytes()
: генерирует криптографически надежные псевдослучайные байты.RAND_pseudo_bytes()
: генерирует псевдослучайные байты.
(Автор: Виктор Стиннер в bpo-12049.)
Модуль
ssl
теперь предоставляет более детальную иерархию исключений, чтобы упростить проверку различных типов ошибок. (Добавлено Антуаном Питру в bpo-11183.)load_cert_chain()
теперь принимает аргумент пароль, который будет использоваться, если закрытый ключ зашифрован. (Добавлено Адамом Симпкинсом в bpo-12803.)Обмен ключами Диффи-Хеллмана, как на основе обычных, так и на основе эллиптических кривых, теперь поддерживается с помощью методов
load_dh_params()
иset_ecdh_curve()
. (Автор - Антуан Питру в bpo-13626 и bpo-13627.)SSL-сокеты имеют новый метод
get_channel_binding()
, позволяющий реализовать определенные механизмы аутентификации, такие как SCRAM-SHA-1-PLUS. (Автор: Яцек Конечны в статье bpo-12551).Вы можете запросить алгоритм сжатия SSL, используемый SSL-сокетом, благодаря его новому методу
compression()
. Новый атрибутOP_NO_COMPRESSION
можно использовать для отключения сжатия. (Автор Антуан Питру в статье bpo-13634).Добавлена поддержка следующего расширения для согласования протокола с использованием метода
ssl.SSLContext.set_npn_protocols()
. (Добавлено Колином Марком в bpo-14204.)Ошибки SSL теперь легче распознавать благодаря атрибутам
library
иreason
. (Автор - Антуан Питру (Antoine Pitrou) в статье bpo-14837).Функция
get_server_certificate()
теперь поддерживает IPv6. (Добавлено Шарлем-Франсуа Натали в bpo-11811.)Новый атрибут
OP_CIPHER_SERVER_PREFERENCE
позволяет настроить серверные сокеты SSLv3 таким образом, чтобы они использовали предпочтения сервера в порядке шифрования, а не клиента (bpo-13635).
статистика¶
Недокументированный tarfile.функция filemode была перенесена в stat.filemode()
. Ее можно использовать для преобразования режима файла в строку вида „-rwxrwxrwx“.
(Автор: Джампаоло Родола в bpo-14807.)
структура¶
Модуль struct
теперь поддерживает : c:type:ssize_t и size_t
с помощью новых кодов n
и N
соответственно. (Автор: Антуан Питру в bpo-3163.)
подпроцесс¶
Командные строки теперь могут быть объектами bytes на платформах posix. (Автор: Виктор Стиннер в bpo-8513.)
Новая константа DEVNULL
позволяет подавлять вывод независимо от платформы. (Добавлено Россом Лагерволлом в bpo-5870.)
sys¶
В модуле sys
появился новый thread_info
named tuple содержащий информацию о реализации потока (bpo-11223).
архивный файл¶
tarfile
теперь поддерживается кодирование lzma
с помощью модуля lzma
. (Добавлено Ларсом Густабелем в bpo-5689.)
временный файл¶
Метод tempfile.SpooledTemporaryFile
в truncate()
теперь принимает параметр size
. (Добавлено Райаном Келли в bpo-9957.)
текстовая обертка¶
В модуле textwrap
добавлен новый indent()
, который упрощает добавление общего префикса к выбранным строкам в текстовом блоке (bpo-13857).
нарезание резьбы¶
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
, также должен быть изменен для использования нового общедоступного интерфейса.
время¶
В 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)
единичный тест¶
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 project и gvfs-open, который является обработчиком URI по умолчанию для GNOME 3. (Первый был представлен Арно Кальметтом в bpo-13620, второй - Маттиасом Клозе в bpo-14493.)
xml.etree.Элементное дерево¶
Модуль xml.etree.ElementTree
теперь импортирует свой ускоритель C по умолчанию; больше нет необходимости явно импортировать xml.etree.cElementTree
(этот модуль остается для обеспечения обратной совместимости, но теперь устарел). Кроме того, семейство методов iter
из Element
было оптимизировано (переписано на C). Документация модуля также была значительно улучшена за счет добавления примеров и более подробных ссылок.
злиб¶
Новый атрибут 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 раз быстрее.
Изменения в сборке и C API¶
Изменения в процессе сборки Python и в C API включают:
Новая функция, связанная с PEP 3118:
PEP 393 добавлены новые типы, макросы и функции в Юникоде:
Высокоуровневый API:
Низкоуровневый API:
PyASCIIObject
иPyCompactUnicodeObject
структурыPyUnicode_DATA
,PyUnicode_1BYTE_DATA
,PyUnicode_2BYTE_DATA
,PyUnicode_4BYTE_DATA
PyUnicode_KIND
сPyUnicode_Kind
перечислением:PyUnicode_WCHAR_KIND
,PyUnicode_1BYTE_KIND
,PyUnicode_2BYTE_KIND
,PyUnicode_4BYTE_KIND
PyArg_ParseTuple
теперь принимаетbytearray
для форматаc
(bpo-12380).
Осуждаемый¶
Неподдерживаемые операционные системы¶
OS/2 и виртуальные машины больше не поддерживаются из-за отсутствия сопровождающего.
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: Windows bytes API устарел в модуле
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. Все функции, использующие этот тип, являются устаревшими:
Функции и методы Unicode, использующие типы Py_UNICODE
и Py_UNICODE*:
PyUnicode_FromUnicode
: используйтеPyUnicode_FromWideChar()
илиPyUnicode_FromKindAndData()
PyUnicode_AS_UNICODE
,PyUnicode_AsUnicode()
,PyUnicode_AsUnicodeAndSize()
: используйтеPyUnicode_AsWideCharString()
PyUnicode_AS_DATA
: используйтеPyUnicode_DATA
сPyUnicode_READ
иPyUnicode_WRITE
PyUnicode_GET_SIZE
,PyUnicode_GetSize()
: используйтеPyUnicode_GET_LENGTH
илиPyUnicode_GetLength()
PyUnicode_GET_DATA_SIZE
: использоватьPyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
(работать только с готовыми строками)PyUnicode_AsUnicodeCopy()
: используйтеPyUnicode_AsUCS4Copy()
илиPyUnicode_AsWideCharString()
PyUnicode_GetMax()
Функции и макросы, манипулирующие строками Py_UNICODE*:
Py_UNICODE_strlen()
: используйтеPyUnicode_GetLength()
илиPyUnicode_GET_LENGTH
Py_UNICODE_strcat()
: используйтеPyUnicode_CopyCharacters()
илиPyUnicode_FromFormat()
Py_UNICODE_strcpy()
,Py_UNICODE_strncpy()
,Py_UNICODE_COPY()
: используйтеPyUnicode_CopyCharacters()
илиPyUnicode_Substring()
Py_UNICODE_strcmp()
: используйтеPyUnicode_Compare()
Py_UNICODE_strncmp()
: используйтеPyUnicode_Tailmatch()
Py_UNICODE_strchr()
,Py_UNICODE_strrchr()
: используйтеPyUnicode_FindChar()
Py_UNICODE_FILL()
: используйтеPyUnicode_Fill()
Py_UNICODE_MATCH
Кодирующие устройства:
PyUnicode_Encode()
: используйтеPyUnicode_AsEncodedObject()
PyUnicode_EncodeUTF7()
PyUnicode_EncodeUTF8()
: используйтеPyUnicode_AsUTF8()
илиPyUnicode_AsUTF8String()
PyUnicode_EncodeUTF32()
PyUnicode_EncodeUTF16()
PyUnicode_EncodeUnicodeEscape()
используйтеPyUnicode_AsUnicodeEscapeString()
PyUnicode_EncodeRawUnicodeEscape()
используйтеPyUnicode_AsRawUnicodeEscapeString()
PyUnicode_EncodeLatin1()
: используйтеPyUnicode_AsLatin1String()
PyUnicode_EncodeASCII()
: используйтеPyUnicode_AsASCIIString()
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeMBCS()
: используйтеPyUnicode_AsMBCSString()
илиPyUnicode_EncodeCodePage()
(сCP_ACP
кодовой страницей)PyUnicode_EncodeDecimal()
,PyUnicode_TransformDecimalToASCII()
Устаревшие функции¶
Код формата 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
теперь вызывается, если функции Cgmtime()
илиlocaltime()
завершились ошибкой.Средства поиска по умолчанию, используемые при импорте, теперь используют кэш того, что содержится в определенном каталоге. Если вы создаете исходный файл Python или файл байт-кода без исходного кода, обязательно вызовите
importlib.invalidate_caches()
, чтобы очистить кэш, чтобы поисковики заметили новый файл.ImportError
теперь используется полное имя модуля, который была предпринята попытка импортировать. Необходимо обновить тесты, которые проверяют сообщение ImportErrors, чтобы использовать полное имя модуля, а не только конец имени.Аргумент index для
__import__()
теперь по умолчанию имеет значение 0 вместо -1 и больше не поддерживает отрицательные значения. При внедрении PEP 328 было допущено упущение, что значение по умолчанию осталось равным -1. Если вам нужно продолжить выполнение относительного импорта, за которым следует абсолютный импорт, выполните относительный импорт с индексом 1, за которым следует другой импорт с индексом 0. Однако предпочтительнее использоватьimportlib.import_module()
, а не вызывать__import__()
напрямую.__import__()
больше не позволяет использовать значение индекса, отличное от 0, для модулей верхнего уровня. Например,__import__('sys', level=1)
теперь является ошибкой.Поскольку
sys.meta_path
иsys.path_hooks
теперь по умолчанию помечены пальцами, вы, скорее всего, захотите использоватьlist.insert()
вместоlist.append()
для добавления в эти списки.Поскольку
None
теперь вставляется вsys.path_importer_cache
, если вы удаляете записи в словаре путей, для которых нет finder, вам нужно будет удалить ключи, связанные со значениямиNone
** и***.imp.NullImporter
для обеспечения обратной совместимости. Это приведет к дополнительным затратам на более старые версии Python, которые повторно вставляютNone
вsys.path_importer_cache
, где это представляет собой использование неявных средств поиска, но семантически это ничего не должно изменить.importlib.abc.Finder
больше не указывает абстрактный методfind_module()
, который должен быть реализован. Если вы полагались на подклассы для реализации этого метода, сначала убедитесь, что он существует. Однако в случае работы с path entry finders вы, вероятно, захотите сначала проверить наличиеfind_loader()
.pkgutil
был преобразован для внутреннего использованияimportlib
. Это устраняет множество крайних случаев, когда старое поведение эмуляции импорта PEP 302 не соответствовало поведению реальной системы импорта. Сама эмуляция импорта по-прежнему присутствует, но теперь устарела. Функцииpkgutil.iter_importers()
иpkgutil.walk_packages()
являются особым случаем стандартных перехватчиков импорта, поэтому они по-прежнему поддерживаются, даже если они не предоставляют нестандартный методiter_modules()
.Исправлена давняя ошибка, связанная с соблюдением требований RFC (bpo-1079) при синтаксическом анализе, выполненном
email.header.decode_header()
. Код, который использует стандартную идиому для преобразования закодированных заголовков в unicode (str(make_header(decode_header(h))
), не увидит изменений, но код, который просматривает отдельные кортежи, возвращаемые decode_header, увидит, что пробелы, которые предшествуют или следуют за разделамиASCII
, теперь включены вASCII
раздел. Код, который создает заголовки с использованиемmake_header
, также должен продолжать работать без изменений, посколькуmake_header
продолжает добавлять пробелы между разделамиASCII
и разделами, отличными отASCII
, если они еще не присутствуют во входных данных струны.email.utils.formataddr()
как правильно передается кодировка содержимого при передаче не-ASCII
отображаемых имен. Любой код, который зависел от предыдущего ошибочного поведения и сохранял не``ASCII`` юникод в отформатированной выходной строке, необходимо будет изменить (bpo-1690608).poplib.POP3.quit()
теперь может вызывать ошибки протокола, как и все другие методыpoplib
. Код, который предполагает, чтоquit
не вызывает ошибокpoplib.error_proto
, возможно, потребуется изменить, если конкретное приложение обнаружит ошибки вquit
(bpo-11291).Аргумент
strict
дляemail.parser.Parser
, который устарел начиная с версии Python 2.4, наконец-то был удален.Устаревший метод
unittest.TestCase.assertSameElements
был удален.Устаревшая переменная
time.accept2dyear
была удалена.Устаревший атрибут
Context._clamp
был удален из модуляdecimal
. Ранее он был заменен атрибутом publicclamp
. (см. bpo-8540).Недокументированный внутренний вспомогательный класс
SSLFakeFile
был удален изsmtplib
, поскольку его функциональность уже давно обеспечивается непосредственноsocket.socket.makefile()
.Передача отрицательного значения в
time.sleep()
в Windows теперь приводит к возникновению ошибки, а не к вечному отключению. В posix это всегда приводило к ошибке.Константа
ast.__version__
была удалена. Если вам нужно принять решение, зависящее от версии AST, используйтеsys.version_info
для принятия решения.Код, который раньше обходил тот факт, что модуль
threading
использовал заводские функции путем создания подклассов закрытых классов, нужно будет изменить, чтобы создать подклассы для открытых классов.Недокументированный механизм отладки в модуле threading был удален, что упростило код. Это не должно повлиять на рабочий код, но упоминается здесь на случай, если с ним взаимодействовали какие-либо платформы отладки приложений (bpo-13550).
Перенос кода на C¶
В ходе изменений в buffer API недокументированный
smalltable
элемент структурыPy_buffer
был удален, а расположениеPyMemoryViewObject
изменилось.Все расширения, использующие соответствующие части в
memoryobject.h
илиobject.h
, должны быть перестроены.Из-за PEP 393 тип
Py_UNICODE
и все функции, использующие этот тип, устарели (но будут доступны как минимум в течение пяти лет). Если вы использовали низкоуровневые API-интерфейсы Unicode для создания объектов unicode и доступа к ним и хотите воспользоваться преимуществами сокращения объема памяти, предоставляемого 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, автор - Эрик Араужо.)
При запуске python с помощью
-S
,import site
больше не будут добавляться пути, относящиеся к конкретному сайту, в пути поиска модуля. В предыдущих версиях это было возможно.(bpo-11591, подготовлено Карлом Мейером при участии Эрика Араужо.)