Что нового в Python 3.4
Автор: | Р. Дэвид Мюррей (редактор) |
---|
В данной статье объясняются новые возможности Python 3.4 по сравнению с 3.3. Python 3.4 был выпущен 16 марта 2014 г. Для получения полной информации см. новости.
См.также
PEP 429 – Расписание релиза Python 3.4
Резюме – Основные моменты релиза
Новые возможности синтаксиса:
- В Python 3.4 не было добавлено никаких новых синтаксических функций.
Другие новые функции:
- pip всегда должен быть доступен (PEP 453).
- Вновь созданные файловые дескрипторы не подлежат наследованию (PEP 446).
- Параметр командной строки для изолированного режима (bpo-16499).
- улучшения в обработке кодеков, которые не являются текстовыми кодировками (множество проблем).
- Тип ModuleSpec для системы импорта (PEP 451). (Касается авторов-импортеров.)
- Формат
marshal
был преобразован для компактности и эффективности (bpo-16475).
Новые модули библиотеки:
asyncio
: Новый предварительный API для асинхронного ввода-вывода (PEP 3156).ensurepip
: Начальная загрузка установщика pip (PEP 453).enum
: Поддержка типов перечисления (PEP 435).pathlib
: Пути объектно-ориентированной файловой системы (PEP 428).selectors
: Высокоуровневое и эффективное мультиплексирование ввода/вывода, созданный на основе примитивов модуляselect
(часть PEP 3156).statistics
: базовая библиотека численно устойчивой статистики (PEP 450).tracemalloc
: Отслеживание выделение памяти Python (PEP 454).
Значительно улучшены модули библиотеки:
- Общие функции с одной отправкой в
functools
(PEP 443). - Новый
pickle
протокол 4 (PEP 3154). multiprocessing
теперь имеет возможность избежать использования os.fork в Unix (bpo-8713).- У модуля
email
появился новый подмодульcontentmanager
и новый подклассMessage
(EmailMessage
), упрощающий MIME обработку (bpo-18891). - Модули
inspect
иpydoc
теперь способны правильно анализировать гораздо более широкий спектр вызываемых объектов, что улучшает вывод Python системыhelp()
. - API модуля
ipaddress
объявлен стабильным.
Улучшения безопасности:
- Безопасный и взаимозаменяемый алгоритм хеширования (PEP 456).
- Выполняет вновь созданные файловые дескрипторы ненаследуемыми (PEP 446), чтобы избежать утечки файловых дескрипторов дочерним процессам.
- Новый параметр командной строки для изолированного режима, (bpo-16499).
multiprocessing
теперь имеет возможность избежать использования os.fork в Unix. spawn и forkserver более безопасны, потому что они избегают обмена данными с дочерними процессами.multiprocessing
дочерние процессы в Windows больше не наследуют все наследуемые дескрипторы родителя, а только необходимые.- Новая функция
hashlib.pbkdf2_hmac()
предоставляет PKCS#5 функция получения ключа на основе пароля 2. - Поддержка TLSv1.1 и TLSv1.2 для
ssl
. - Поддержка получения сертификатов из системного хранилища сертификатов Windows для
ssl
. - Поддержка SNI (указание имени сервера) на стороне сервера для
ssl
. - Класс
ssl.SSLContext
получил множество улучшений. - Все модули в стандартной библиотеке, поддерживающие SSL, теперь поддерживают
проверку сертификата сервера, включая сопоставление имени хоста
(
ssl.match_hostname()
) и CRL (списки отзыва сертификатов, см.ssl.SSLContext.load_verify_locations()
).
Улучшения реализации CPython:
- Безопасная финализация объекта (PEP 442).
- Использование PEP 442, в большинстве случаев глобальные переменные модуля больше не устанавливаются в None во время финализации (bpo-18214).
- Настраиваемые распределители памяти (PEP 445).
- Клиники споров (PEP 436).
Пожалуйста, ознакомьтесь с полным списком пользовательских изменений, включая множество других небольших улучшений — оптимизацию CPython, устаревание и потенциальные проблемы переноса.
Новые особенности
PEP 453: Явная начальная загрузка PIP в установках Python
Начальная загрузка по умолчанию
Новый модуль ensurepip
(определённый в PEP 453) предоставляет
стандартный кроссплатформенный механизм для начальной загрузки установщика pip
в установки Python и виртуальные среды. Версия pip
, включённая в Python
3.4.0, — это pip
1.5.4, а будущие релизы обслуживания 3.4.x будут обновлять
связанную версию до последней версии pip
, доступной на момент создания
кандидата на релиз.
По умолчанию команды pipX
и pipX.Y
будут установлены на всех платформах
(где XY обозначает версию установки Python) вместе с Python пакетом pip
и
его зависимостями. В Windows и в виртуальных средах на всех платформах также
будет установлена неверсионная команда pip
. На других платформах
общесистемная неверсионная команда pip
обычно относится к отдельно
установленной версии Python 2.
Утилита командной строки pyvenv
и модуль venv
используют модуль
ensurepip
, чтобы сделать pip
легко доступным в виртуальных средах.
При использовании утилиты командной строки pip
устанавливается по
умолчанию, а при использовании модуля venv
API установка
pip
должна быть запрошена явно.
Для CPython исходники сборки на системах POSIX
команды make install
и make altinstall
по умолчанию загружают pip
.
Этим поведением можно управлять с помощью параметров конфигурации и
переопределять с помощью параметров Makefile.
В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают
pip
вместе с самим CPython (пользователи могут отказаться от его установки
в процессе установки). Пользователям Windows необходимо согласиться на
автоматические модификации PATH
, чтобы pip
был доступен из командной
строки по умолчанию, в противном случае к нему по-прежнему можно получить
доступ через запускальщик Python для Windows как py -m pip
.
Как обсуждалось в PEP, упаковщики платформ могут не устанавливать данные команды по умолчанию, если при вызове они предоставляют чёткие и простые инструкции по их установке на этой платформе (обычно с помощью системного диспетчера пакетов).
Примечание
Чтобы избежать конфликтов между параллельными установками Python 2 и Python
3, только версионные команды pip3
и pip3.4
загружаются по умолчанию,
когда ensurepip
вызывается напрямую — параметр --default-pip
необходим, чтобы также запросить команду pip
без версии. pyvenv
и установщик Windows обеспечивают доступность неполной команды pip
в
данных средах, а pip
всегда можно вызвать с помощью опции
-m
, а не напрямую, чтобы избежать неоднозначности в системах с
несколькими установками Python.
Изменения в документации
В рамках этого изменения разделы документации Установка модулей Python и Распространение модулей Python были полностью переработаны в виде краткого руководства по началу работы и часто задаваемых вопросов. Большая часть документации по упаковке теперь перемещена в Руководство пользователя по пакетизации Python, а также документация по отдельным проектам.
Однако, поскольку миграция в настоящее время все ещё не завершена, устаревшие версии данных руководств остаются доступными как Установка модулей Python (устаревшая версия) и Распространение Python модулей (устаревшая версия).
См.также
- PEP 453 – Явная загрузка pip в установках Python
- PEP, написан Дональдом Стаффтом и Ником Когланом, реализован Дональдом Стаффтом, Ником Когланом, Мартином фон Лёвисом и Недом Дейли.
PEP 446: Вновь созданные файловые дескрипторы не подлежат наследованию
PEP 446 создаёт вновь созданные файловые дескрипторы не наследуемыми. В общем, это то поведение, которое желательно приложению: при запуске нового процесса открытые в данный момент файлы также открыты в новом процессе, что может привести к всевозможным трудным для поиска ошибкам и, возможно, к проблемам безопасности.
Однако бывают случаи, когда требуется наследование. Для поддержки данных случаев доступны следующие новые функции и методы:
os.get_inheritable()
,os.set_inheritable()
os.get_handle_inheritable()
,os.set_handle_inheritable()
socket.socket.get_inheritable()
,socket.socket.set_inheritable()
См.также
- PEP 446 – Сделать вновь созданные файловые дескрипторы ненаследуемыми
- PEP написан и реализован Виктором Стиннером.
Улучшения в обработке кодеков
С момента своего первого появления модуль codecs
всегда предназначался
для работы в качестве независимой от типа системы динамического кодирования и
декодирования. Однако его тесная связь с текстовой моделью Python, особенно с
ограниченными по типам удобными методами для встроенных типов str
,
bytes
и bytearray
, исторически скрывала данный факт.
В качестве ключевого шага в прояснении ситуации вспомогательные функции
codecs.encode()
и codecs.decode()
теперь должным образом
задокументированы в Python 2.7, 3.3 и 3.4. Данные функции существовали в модуле
codecs
(и были покрыты набором регрессионных тестов) начиная с Python
2.4, но ранее их можно было обнаружить только посредством самоанализа во время
выполнения.
В отличие от вспомогательных методов в str
, bytes
и
bytearray
, вспомогательные функции codecs
поддерживают
произвольные кодеки как в Python 2, так и в Python 3, а не ограничиваются
текстовыми Юникод кодировками (в Python 3) или преобразованиями basestring
<-> basestring
(в Python 2).
В Python 3.4 интерпретатор может идентифицировать известные нетекстовые кодировки, представленные в стандартной библиотеке, и при необходимости направлять пользователей к удобным функциям общего назначения:
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
>>> "hello".encode("rot13")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
В связанном изменении, когда это возможно без нарушения обратной совместимости, исключения, возникающие во время операций кодирования и декодирования, заключаются в связанное исключение того же типа, в котором упоминается имя кодека, ответственного за создание ошибки:
>>> import codecs
>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found
Вышеупомянутое исключение было прямой причиной следующего исключения:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
return (bz2.compress(input), len(input))
File "/usr/lib/python3.4/bz2.py", line 498, in compress
return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface
Вышеупомянутое исключение было прямой причиной следующего исключения:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
Наконец, как показывают приведённые выше примеры, данные улучшения позволили восстановить удобные псевдонимы для кодеков, отличных от Юникода, которые сами были восстановлены в Python 3.2. Это означает, что кодирование двоичных данных в шестнадцатеричное представление и обратно (например) теперь можно записать так:
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
Двоичные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в Бинарные преобразования и Текстовые преобразования.
(Предоставлено Ником Когланом в bpo-7475, bpo-17827, bpo-17828 и bpo-19619.)
PEP 451: тип ModuleSpec для системы импорта
PEP 451 обеспечивает инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (т. е. спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько связанных с импортом API. Это изменение также является ступенькой для нескольких будущих улучшений, связанных с импортом.
Общедоступные изменения из PEP полностью совместимы с предыдущими версиями. Кроме того, они должны быть прозрачными для всех, кроме авторов-импортеров. Методы поиска ключей и загрузчика устарели, но они продолжат работать. Новые импортёры должны использовать новые методы, описанные в PEP. Существующие импортёры должны быть обновлены для реализации новых методов. См. в разделе Устарело список методов, которые следует заменить, и их замены.
Другие языковые изменения
Некоторые небольшие изменения, внесённые в основной язык Python:
- База данных Юникод обновлена до UCD версии 6.3.
min()
иmax()
теперь принимают только ключевой аргумент default, который можно использовать для указания возвращаемого значения, если вычисляемая итерация, не имеет элементов. (Предоставлено Джулианом Берманом в bpo-18111.)- Объекты модуля теперь поддерживают
weakref
. - Атрибуты модуля
__file__
(и связанные значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением__main__.__file__
, когда сценарий был выполнен непосредственно с использованием относительного пути. (Предоставлено Бреттом Кэнноном в bpo-18416.) - Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты во время
кодирования и декодирования, если только не используется обработчик ошибок
surrogatepass
, за исключением декодера UTF-16 (принимающий допустимые пары суррогатов) и UTF-16 кодировщик (создаёт их при кодировании символов, отличных от BMP). (Предоставлено Виктором Стиннером, Канг-Хао (Кенни) Лу и Сергеем Сторчакой в bpo-12892.) - Новый немецкий EBCDIC кодек
cp273
. (Предоставлено Майклом Биренфельдом и Эндрю Кухлингом в bpo-1097797.) - Новый украинский кодек
cp1125
. (Предоставил Сергей Сторчака в bpo-19668.) bytes
.join() иbytearray
.join() теперь принимают произвольные объекты буфера в качестве аргументов. (Предоставлено Антуаном Питру в bpo-15958.)- Конструктор
int
теперь принимает любой объект, который имеет метод__index__
в качестве аргумента base. (Предоставлено Марком Дикинсоном в bpo-16772.) - Объекты фрейма теперь имеют метод
clear()
, который удаляет все ссылки на локальные переменные из фрейма. (Предоставлено Антуаном Питру в bpo-17934.) memoryview
теперь зарегистрирован какSequence
и поддерживает встроенныйreversed()
. (Предоставлено Ником Когланом и Клаудиу Попа в bpo-18690 и bpo-19078.)- Сигнатуры, сообщаемые
help()
, были изменены и улучшены в нескольких случаях в результате введения Клиники споров и других изменений в модулиinspect
иpydoc
. __length_hint__()
теперь является частью спецификации формального языка (см. PEP 424). (Предоставлено Армином Ронахером в bpo-16148.)
Новые модули
asyncio
Новый модуль asyncio
(определённый в PEP 3156) предоставляет
стандартную подключаемую модель цикла обработки событий для Python, обеспечивая
надежную поддержку асинхронного ввода-вывода в стандартной библиотеке и упрощая
взаимодействие других реализаций цикла обработки событий со стандартной
библиотекой и друг с другом.
Для Python 3.4 этот модуль считается предварительным API.
См.также
- PEP 3156 – Поддержка асинхронного ввода-вывода перезагружена: модуль «asyncio»
- Написано PEP, а внедрение возглавил Гвидо ван Россумом.
ensurepip
Новый модуль ensurepip
является основной инфраструктурой для реализации
PEP 453. При обычном развитии событий конечным пользователям не нужно будет
взаимодействовать с этим модулем, но его можно использовать для ручной загрузки
pip
, если автоматическая загрузка в установку или виртуальную среду была
отклонена.
ensurepip
включает связанную копию pip
, актуальную на момент первого
кандидата на релиз релиза CPython, с которым он поставляется (это относится как
к отладочным выпускам, так и к выпускам функций). ensurepip
не имеет
доступа к Интернету. Если установка имеет доступ к Интернету, после запуска
ensurepip
связанный pip
можно использовать для обновления pip
до
более позднего релиза, чем связанный. (Обратите внимание, что такая обновленная
версия pip
считается отдельно установленным пакетом и не будет удалена при
удалении Python.)
Модуль называется ensurepip, потому что при вызове он ничего не делает,
когда уже pip
установлен. Он также имеет параметр --upgrade
, который
заставит его установить связанную копию pip
, если существующая
установленная версия pip
старше, чем связанная копия.
enum
Новый модуль enum
(определённый в PEP 435) обеспечивает стандартную
реализацию типов перечисления, позволяя другим модулям (таким как
socket
) предоставлять более информативные сообщения об ошибках и
улучшенную поддержку отладки за счёт замены непрозрачных целочисленных констант
обратно совместимыми значениями перечисления.
См.также
- PEP 435 – Добавление типа Enum в стандартную библиотеку Python
- PEP, написанный Барри Варшавой, Эли Бендерски и Итаном Фурманом реализован Итаном Фурманом.
pathlib
Новый модуль pathlib
предлагает классы, представляющие пути файловой
системы с семантикой, подходящей для разных операционных систем. Классы путей
делятся на чистые пути, обеспечивающие чисто вычислительные операции без
ввода-вывода, и наследуемые от чистых путей пути, также
реализующие операции ввода-вывода.
Для Python 3.4 данный модуль считается предварительным API.
См.также
- PEP 428 – Модуль pathlib – пути объектно-ориентированной файловой системы
- PEP написан и реализован Антуаном Питру.
selectors
Новый модуль selectors
(созданный как часть реализации PEP 3156)
обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода,
основанное на примитивах модуля select
.
statistics
Новый модуль statistics
(определённый в PEP 450) предлагает некоторые
основные функции статистики непосредственно в стандартной библиотеке. Данный
модуль поддерживает расчёт среднего значения, медианы, моды, дисперсии и
стандартного отклонения ряда данных.
См.также
- PEP 450 – Добавление модуля Statistics в стандартную библиотеку
- PEP написан и реализован Стивеном Д’Апрано
tracemalloc
Новый модуль tracemalloc
(определённый в PEP 454) — это инструмент
отладки для отслеживания блоков памяти, выделенных Python. Он предоставляет
следующую информацию:
- Отслеживание, где был размещён объект
- Статистика по выделенным блокам памяти по имени файла и по номеру строки: общий размер, количество и средний размер выделенных блоков памяти
- Вычисляет различия между двумя снимками для обнаружения утечек памяти
См.также
- PEP 454 – Добавлен новый модуль tracemalloc для отслеживания распределения памяти Python
- PEP написан и реализован Виктором Стиннером
Улучшенные модулей
abc
Новую функцию abc.get_cache_token()
можно использовать, чтобы узнать,
когда делать недействительными кэши, на которые влияют изменения в графе
объектов. (Предоставлено Лукашем Лангой в bpo-16832.)
Новый класс ABC
имеет метакласс ABCMeta
.
Использование ABC
в качестве базового класса по существу предоставляет тот
же эффект, что и указание metaclass=abc.ABCMeta
, но его проще набирать и
легче читать. (Предоставлено Бруно Дюпюи в bpo-16049.)
aifc
Метод getparams()
теперь возвращает именованный кортеж, а не
простой кортеж. (Предоставлено Клаудиу Попа в bpo-17818.)
aifc.open()
теперь поддерживает протокол управления контекстом: при
использовании в блоке with
метод возвращаемого объекта
close()
будет вызываться автоматически в конце блока.
(Предоставил Сергей Сторчача в bpo-16486.)
Методы writeframesraw()
и writeframes()
теперь принимают любой байтоподобный объект.
(Предоставил Сергей Сторчака в bpo-8311.)
argparse
Класс FileType
теперь принимает аргументы encoding и
errors, которые передаются в open()
. (Предоставлено Лукасом Майстре в
bpo-11175.)
audioop
audioop
теперь поддерживает 24-битные выборки. (Предоставлено Сергеем
Сторчакой в bpo-12866.)
Новая функция byteswap()
преобразует образцы с прямым порядком
байтов в прямой и наоборот. (Предоставлено Сергеем Сторчакой в bpo-19641.)
Все функции audioop
теперь принимают любой байтоподобный объект.
Строки не принимаются: раньше не работали, теперь сразу выдают ошибку. (Предоставил Сергей Сторчака в
bpo-16685.)
base64
Функции кодирования и декодирования в base64
теперь принимают
любой байтоподобный объект
в тех случаях, когда ранее требовался экземпляр bytes
или
bytearray
. (Предоставлено Ником Когланом в bpo-17839.)
Новые функции a85encode()
, a85decode()
,
b85encode()
и b85decode()
позволяют кодировать и
декодировать двоичные данные из/в форматы Ascii85
и git/mercurial
Base85
соответственно. Функции a85
имеют параметры, которые можно
использовать для обеспечения их совместимости с вариантами кодировки
Ascii85
, включая вариант Adobe. (Предоставили Мартин Моррисон, проект
Mercurial, Сергей Сторчака и Антуан Питру в bpo-17618.)
collections
Метод ChainMap.new_child()
теперь принимает аргумент m, указывающий
дочернее отображение для добавления в цепочку. Это позволяет использовать
существующее отображение и/или пользовательский тип отображения для
дочернего элемента. (Предоставлено Винаем Саджипом в bpo-16613.)
colorsys
Количество цифр в коэффициентах для преобразования RGB — YIQ было расширено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов должно быть менее 1% и может лучше совпадать с результатами, полученными в других местах. (Предоставлено Брайаном Ландерсом и Сергеем Сторчакой в bpo-14323.)
contextlib
Новый менеджер контекста contextlib.suppress
помогает прояснить
назначение кода, намеренно подавляющего исключения из одного оператора.
(Предоставлено Рэймондом Хеттингером в bpo-15806 и Зеро Пирей в
bpo-19266.)
Новый менеджер контекста contextlib.redirect_stdout()
упрощает для
служебных сценариев обработку негибких API, которые записывают свои выходные
данные в sys.stdout
и не предоставляют никаких параметров для его
перенаправления. С помощью менеджера контекста вывод sys.stdout
можно
перенаправить в любой другой поток или, в сочетании с io.StringIO
, в
строку. Последнее может быть особенно полезно, например, для захвата вывода
функции, написанной для реализации интерфейса командной строки. Рекомендуется
только для служебных сценариев, поскольку влияет на глобальное состояние
sys.stdout
. (Предоставлено Рэймондом Хеттингером в bpo-15805.)
Документация contextlib
также была обновлена, чтобы включить
обсуждение различий между
одноразовыми, повторно используемыми и реентерабельными менеджерами контекста.
dbm
Объекты dbm.open()
теперь поддерживают протокол управления контекстом.
При использовании в операторе with
метод close
объекта базы
данных будет вызываться автоматически в конце блока. (Предоставлено Клаудиу
Попа и Ником Когланом в bpo-19282.)
dis
Функции show_code()
, dis()
, distb()
и
disassemble()
теперь принимают только ключевой аргумент file,
который управляет тем, куда они записывают свои выходные
данные.
Модуль dis
теперь построен на основе класса Instruction
,
который обеспечивает объектно-ориентированный доступ к деталям каждой отдельной
операции с байт-кодом.
Новый метод get_instructions()
предоставляет итератор, который
вызывает поток инструкций для данного фрагмента Python кода. Таким образом,
теперь можно написать программу, которая проверяет объект байт-кода и
манипулирует им способами, отличными от тех, что предоставляет сам модуль
dis
. Например:
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
Различные инструменты отображения в модуле dis
были переписаны для
использования данных новых компонентов.
Кроме того, новый удобный для приложений класс Bytecode
предоставляет объектно-ориентированный API для проверки байт-кода как в
удобочитаемой форме, так и для повторения инструкций. Конструктор
Bytecode
принимает те же аргументы, что и
get_instruction()
(плюс необязательный current_offset), и
результирующий объект можно повторять для создания объектов
Instruction
. Но у него также есть метод dis
,
эквивалентный вызову dis
в аргументе конструктора, но возвращаемый
как многострочная строка:
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
У Bytecode
также есть метод класса
from_traceback()
, который обеспечивает возможность
управления трассировкой (т. е. print(Bytecode.from_traceback(tb).dis())
эквивалентен distb(tb)
).
(Предоставили Ник Коглан, Райан Келли и Томас Клюйвер в bpo-11816 и Клаудиу Попа в bpo-17916.)
Новая функция stack_effect()
вычисляет влияние заданного кода
операции и аргумента на стек Python, информация, которая иначе недоступна.
(Предоставлено Ларри Гастингсом в bpo-19722.)
doctest
Новый флаг опции, FAIL_FAST
останавливает выполнение теста, как только обнаруживается первый сбой.
(Предоставлено Р. Дэвидом Мюрреем и Дэниелом Урбаном в bpo-16522.)
Интерфейс командной строки doctest
теперь использует argparse
и
имеет два новых параметра: -o
и -f
. -o
позволяет указать
опции doctest в командной строке, а -f
является
сокращением для -o FAIL_FAST
(для параллелизма аналогичной опции,
поддерживаемой интерфейсом командной строки unittest
). (Предоставлено Р.
Дэвидом Мюрреем в bpo-11390.)
doctest
теперь находит доктесты в строках модуля расширения
__doc__
. (Предоставлено Закари Уэр в bpo-3158.)
as_string()
теперь принимает аргумент policy,
чтобы переопределить политику сообщения по умолчанию при создании его
строкового представления. Это означает, что as_string
теперь можно
использовать в большем количестве случаев, вместо того, чтобы создавать и
использовать generator
для передачи параметров форматирования в
его метод flatten
. (Предоставлено Р. Дэвидом Мюрреем в bpo-18600.)
Добавлен новый метод as_bytes()
для создания
байтового представления сообщения аналогично тому, как as_string
создаёт
строковое представление. Он не принимает аргумент maxheaderlen, но принимает
аргументы unixfrom и policy. Метод Message
__bytes__()
вызывает его, а это означает, что
bytes(mymsg)
теперь вызывает интуитивно понятный результат: байтовый объект,
содержащий полностью отформатированное сообщение. (Предоставлено Р. Дэвидом
Мюрреем в bpo-18600.)
Сообщение Message.set_param()
теперь принимает ключевой аргумент
replace. Если указано, связанный заголовок будет обновлён без изменения его
положения в списке заголовков. Для обратной совместимости по умолчанию
используется False
. (Предоставлено Р. Дэвидом Мюрреем в bpo-18891.)
Добавлена пара новых подклассов Message
(EmailMessage
и MIMEPart
), а также новый подмодуль
contentmanager
и новый атрибут policy
content_manager
. Вся документация в настоящее
время находится в новом модуле, который добавляется как часть нового модуля
электронной почты предварительного API.
Данные классы предоставляют ряд новых методов, которые
значительно упрощают извлечение содержимого и вставку содержимого в сообщения
электронной почты. Дополнительные сведения см. в документации
contentmanager
и email: примеры. Данные добавления API
завершают большую часть работы, запланированной в рамках проекта email6.
Планируется, что текущий предварительный API станет окончательным в Python 3.5
(возможно, с несколькими незначительными дополнениями в области обработки
ошибок). (Предоставлено Р. Дэвидом Мюрреем в bpo-18891.)
filecmp
Новая функция clear_cache()
позволяет очистить кэш сравнения
filecmp
, который использует информацию os.stat()
, чтобы
определить, изменился ли файл с момента последнего сравнения. Это можно
использовать, например, если файл мог быть изменён и перепроверен за меньшее
время, чем разрешение поля времени модификации файла файловой
системы. (Предоставлено Марком Левиттом в bpo-18149.)
Новый атрибут модуля DEFAULT_IGNORES
предоставляет список
каталогов, которые используются в качестве значения по умолчанию для параметра
ignore функции dircmp()
. (Предоставлено Эли Бендерски в
bpo-15442.)
functools
Новый дескриптор partialmethod()
обеспечивает применение
частичных аргументов к дескрипторам точно так же, как
partial()
обеспечивает обычные вызываемые объекты. Новый
дескриптор также упрощает получение произвольных вызываемых объектов (включая
экземпляры partial()
), чтобы они вели себя как обычные методы
экземпляра при включении в определение класса. (Предоставлено Алоном Хоревым и
Ником Когланом в bpo-4331.)
Новый декоратор singledispatch()
обеспечивает поддержку
универсальных функций с одной отправкой в стандартной библиотеке Python. В то
время как объектно-ориентированное программирование фокусируется на
группировании нескольких операций с общим набором данных в класс, универсальная
функция фокусируется на группировании нескольких реализаций операции, что
позволяет ей работать с разными типами данных.
См.также
- PEP 443 – Общие функции с одиночной диспетчеризацией
- PEP написан и реализован Лукашем Лангой.
total_ordering()
теперь поддерживает возвращаемое значение
NotImplemented
из базовой функции сравнения. (Предоставлено Кэти
Миллер в bpo-10042.)
Версия функции partial()
для чистого Python теперь находится в
stdlib; в CPython он переопределяется ускоренной версией C, но доступен для
использования другими реализациями. (Предоставлено Брайаном Торном в
bpo-12428.)
gc
Новая функция get_stats()
возвращает список из трёх словарей для
каждого поколения, содержащих статистику коллекций с момента запуска
интерпретатора. (Предоставлено Антуаном Питру в bpo-16351.)
glob
Новая функция escape()
позволяет экранировать специальные символы в
имени файла, чтобы они не становились частью подстановочного расширения, а
вместо этого сопоставлялись буквально. (Предоставил Сергей Сторчака в
bpo-8402.)
hashlib
Новая функция hashlib.pbkdf2_hmac()
предоставляет
PKCS#5 функцию получения ключа на основе пароля 2.
(Предоставлено Кристианом Хеймсом в bpo-18582.)
Атрибут name
хеш-объектов hashlib
теперь является
официально поддерживаемым интерфейсом. Он всегда существовал в hashlib
CPython (хотя не возвращал имена в нижнем регистре для всех поддерживаемых
хэшей), но атрибут не был общедоступным интерфейсом, поэтому другие
реализации Python ранее его не поддерживали. (Предоставлено Джейсоном Р.
Кумбсом в bpo-18532.)
hmac
hmac
теперь принимает bytearray
, а также bytes
для аргумента
key функции new()
, а параметр msg как для функции
new()
, так и для метода update()
теперь принимает
любой тип, поддерживаемый модулем hashlib`3. (Предоставлено Йонасом
Боргстрёмом в :issue:`18240
.)
Аргумент digestmod функции hmac.new()
теперь может быть любым именем
хеш-дайджеста, распознаваемым hashlib
. Кроме того, текущее поведение,
при котором значение digestmod по умолчанию равно MD5
, устарело: в
будущей версии Python не будет значения по умолчанию. (Предоставлено Кристианом
Хеймсом в bpo-17276.)
С добавлением атрибутов block_size
и name
(и формальной документации атрибута digest_size
) модуль
hmac
теперь полностью соответствует API PEP 247. (Предоставлено
Кристианом Хеймсом в bpo-18775.)
html
Новая функция unescape()
преобразует ссылки на символы
HTML5 в соответствующие Юникод символы. (Предоставлено Эцио Мелотти в
bpo-2927.)
HTMLParser
принимает новый ключевой аргумент
convert_charrefs, который при True
автоматически преобразует все ссылки
на символы. Для обратной совместимости его значение по умолчанию равно
False
, но оно изменится на True
в будущей версии Python, поэтому вам
предлагается установить его явно и обновить свой код, чтобы использовать эту
новую функцию. (Предоставлено Эцио Мелотти в bpo-13633.)
Аргумент strict HTMLParser
теперь устарел.
(Предоставлено Эцио Мелотти в bpo-15114.)
http
send_error()
теперь принимает
необязательный дополнительный параметр explain, который можно использовать
для предоставления расширенного описания ошибки, переопределяя жёстко заданное
значение по умолчанию, если оно есть. Это расширенное описание ошибки будет
отформатировано с использованием атрибута
error_message_format
и отправлено как тело ответа об
ошибке. (Предоставлено Карлом Коу в bpo-12921.)
http.server
интерфейс командной строки теперь имеет
параметр -b/--bind
, который заставляет сервер прослушивать определённый
адрес. (Предоставлено Мальте Сварт в bpo-17764.)
idlelib и IDLE
Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для
импорта другими программами, с каждым выпуском он совершенствуется. См.
Lib/idlelib/NEWS.txt
для получения сводного списка изменений с версии
3.3.0, а также изменений, внесенных в будущие версии 3.4.x. Данный файл также
доступен в диалоговом окне IDLE .
importlib
InspectLoader
ABC определяет новый метод
source_to_code()
, который принимает исходные
данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна
compile(data, path, 'exec', dont_inherit=True)
. (Предоставлено Эриком Сноу
и Бреттом Кэнноном в bpo-15627.)
InspectLoader
также теперь имеет реализацию по
умолчанию для метода get_code()
. Однако
обычно желательно переопределить реализацию по умолчанию из соображений
производительности. (Предоставлено Бреттом Кэнноном в bpo-18072.)
Функция reload()
была перемещена из imp
в
importlib
в связи с прекращением поддержки модуля imp
.
(Предоставлено Беркером Пексагом в bpo-18193.)
importlib.util
теперь имеет атрибут
MAGIC_NUMBER
, обеспечивающий доступ к номеру версии
байт-кода. Это заменяет функцию get_magic()
в устаревшем модуле
imp
. (Предоставлено Бреттом Кэнноном в bpo-18192.)
Новые функции importlib.util
cache_from_source()
и
source_from_cache()
заменяют одноименные функции в
устаревшем модуле imp
. (Предоставлено Бреттом Кэнноном в
bpo-18194.)
Начальная загрузка importlib
NamespaceLoader
теперь
соответствует InspectLoader
ABC, что означает, что runpy
и
python -m
теперь можно использовать с пакетами пространства имён.
(Предоставлено Бреттом Кэнноном в bpo-18058.)
importlib.util
имеет новую функцию
decode_source()
, которая декодирует исходный текст из
байтов, используя универсальную обработку новой строки. Это полезно для
реализации методов InspectLoader.get_source()
.
importlib.machinery.ExtensionFileLoader
теперь имеет метод
get_filename()
. Это было
непреднамеренно пропущено в исходной реализации. (Предоставлено Эриком Сноу в
bpo-19152.)
inspect
Модуль inspect
теперь предлагает базовый
интерфейс командной строки
для быстрого отображения исходного кода и другой
информации для модулей, классов и функций. (Предоставлено Клаудиу Попа и Ником
Когланом в bpo-18626.)
unwrap()
упрощает распутывание цепочек функций-оболочек,
созданных functools.wraps()
(и любым другим API, который устанавливает
атрибут __wrapped__
для функции-оболочки). (Предоставлено Дэниелом Урбаном,
Аароном Айлсом и Ником Когланом в bpo-13266.)
В рамках реализации нового модуля enum
модуль inspect
теперь
значительно лучше поддерживает пользовательские методы __dir__
и атрибуты
динамического класса, предоставляемые через метаклассы. (Предоставлено Этаном
Фурманом в bpo-18929 и bpo-19030.)
getfullargspec()
и getargspec()
теперь используют
API signature()
. Это позволяет им поддерживать гораздо более
широкий спектр вызываемых объектов, в том числе с атрибутами __signature__
,
с метаданными, предоставленными клиникой аргументов, объектами
functools.partial()
и другими. Обратите внимание, что, в отличие от
signature()
, данные функции по-прежнему игнорируют атрибуты
__wrapped__
и сообщают об уже связанном первом аргументе для связанных
методов, поэтому по-прежнему необходимо обновить код, чтобы использовать
signature()
напрямую, если данные функции желательны.
(Предоставил Юрий Селиванов в bpo-17481.)
signature()
теперь поддерживает утиные типы функций CPython, что
добавляет поддержку функций, скомпилированных с помощью Cython. (Предоставили
Стефан Бенель и Юрий Селиванов в bpo-17159.)
ipaddress
ipaddress
был добавлен в стандартную библиотеку Python 3.3 как предварительный API. С
выпуском Python 3.4 данная квалификация была удалена: ipaddress
теперь
считается стабильным API, на который распространяются обычные требования
стандартной библиотеки для обеспечения обратной совместимости.
Новое свойство is_global
— True
, если адрес
является глобально маршрутизируемым. (Предоставлено Питером Муди в
bpo-17400.)
logging
TimedRotatingFileHandler
имеет новый параметр
atTime, который можно использовать для указания времени дня, когда должен
произойти перенос. (Предоставлено Рональдом Уссореном в bpo-9556.)
SocketHandler
и
DatagramHandler
теперь поддерживают сокеты домена
Unix (путём установки port на None
). (Внесено Винаем Саджипом в коммит
ce46195b56a9.)
fileConfig()
теперь принимает экземпляр подкласса
configparser.RawConfigParser
для параметра fname. Это упрощает
использование файла конфигурации, когда конфигурация журналирования является лишь
частью общей конфигурации приложения или когда приложение изменяет конфигурацию
перед передачей её в fileConfig()
. (Предоставлено Винаем
Саджипом в bpo-16110.)
Данные конфигурации логгирования, полученные из сокета через функцию
logging.config.listen()
, теперь можно проверить перед обработкой, указав
функцию проверки в качестве аргумента для нового ключевого аргумента verify.
(Предоставлено Винаем Саджипом в bpo-15452.)
marshal
Версия marshal
по умолчанию была увеличена до 3. Код, реализующий новую
версию, восстанавливает поведение Python2, записывая только одну копию
интернированных строк и сохраняя интернирование при десериализации, и расширяет
эту возможность «одной копии» для любого типа объекта (включая обработку
рекурсивные ссылки). Это уменьшает как размер файлов .pyc
, так и объём
памяти, который модуль занимает в памяти, когда он загружается из файла
.pyc
(или .pyo
). (Предоставлено Кристьяном Валуром Йонссоном в
bpo-16475, с дополнительным ускорением Антуаном Питру в bpo-19219.)
multiprocessing
В Unix были добавлены два новых
метода запуска,
spawn
и forkserver
для запуска процессов с использованием
multiprocessing
. Это делает смешивание процессов с потоками более
надежным, а метод spawn
соответствует семантике, которую многопроцессорная
обработка всегда использовала в Windows. Новая функция
get_all_start_methods()
сообщает обо всех методах
запуска, доступных на платформе, get_start_method()
сообщает о текущем методе запуска, а set_start_method()
устанавливает метод запуска. (Предоставлено Ричардом Оудкерком в
bpo-8713.)
У multiprocessing
также теперь есть концепция context
, которая
определяет, как создаются дочерние процессы. Новая функция
get_context()
возвращает контекст, который использует
указанный метод запуска. Она имеет тот же API, что и сам модуль
multiprocessing
, поэтому вы можете использовать её для создания
Pool
и других объектов, которые будут работать
в этом контексте. Это позволяет платформе и приложению или различным частям
одного и того же приложения использовать многопроцессорность, не мешая друг
другу. (Предоставлено Ричардом Аудкерком в bpo-18999.)
За исключением использования старого метода запуска fork, дочерние процессы больше не наследуют ненужные обработчики/дескрипторы файлов от своих родителей (часть bpo-8713).
multiprocessing
теперь использует runpy
(который реализует
переключатель -m
) для правильной инициализации __main__
в дочерних
процессах при использовании методов запуска spawn
или forkserver
. Это
устраняет некоторые крайние случаи, когда сочетание многопроцессорности,
переключателя командной строки -m
и явного относительного импорта может
привести к скрытым сбоям в дочерних процессах. (Предоставлено Ником Когланом в
bpo-19946.)
operator
Новая функция length_hint()
обеспечивает реализацию
спецификации использования специального метода __length_hint__()
в рамках формальной спецификации PEP 424 данной языковой функции.
(Предоставлено Армином Ронахером в bpo-16148.)
Теперь доступна версия модуля operator
на чистом Python, доступная для
справки и для использования в альтернативных реализациях Python. (Предоставлено
Захари Уэр в bpo-16694.)
os
Появились новые функции для получения и установки
наследуемого флага дескриптора файла (os.get_inheritable()
,
os.set_inheritable()
) или дескриптора Windows
(os.get_handle_inheritable()
, os.set_handle_inheritable()
).
Новая функция cpu_count()
сообщает о количестве ЦПУ, доступных на
платформе, на которой работает Python (или None
, если число не может быть
определено). Функция multiprocessing.cpu_count()
теперь реализована в
терминах этой функции. (Предоставлено Трентом Нельсоном, Йогешем Чаудхари,
Виктором Стиннером и Шарлем-Франсуа Натали в bpo-17914.)
os.path.samestat()
теперь доступна на платформе Windows (а реализация
os.path.samefile()
теперь совместно используется Unix и Windows).
(Предоставлено Брайаном Кертином в bpo-11939.)
os.path.ismount()
теперь распознает тома, смонтированные ниже корня диска
в Windows. (Предоставлено Тимом Голденом в bpo-9035.)
os.open()
поддерживает два новых флага на платформах, которые их
предоставляют: O_PATH
(дескриптор неоткрытого файла) и
O_TMPFILE
(безымянный временный файл; с версии 3.4.0 доступен
только в системах Linux с версией ядра 3.11 или новее, которые имеют заголовки
uapi). (Предоставлено Кристианом Хеймсом в bpo-18673 и Бенджамином
Петерсоном соответственно.)
pdb
pdb
был улучшен для более удобной обработки генераторов,
yield
и yield from
. Это особенно полезно при отладке программ на
основе asyncio
. (Предоставлено Андреем Светловым и Ксавьером де Гэем в
bpo-16596.)
Команда print
удалена из pdb
, восстановив доступ к функции Python
print()
из командной строки pdb. В Python2 pdb
не было команды
print
; вместо этого при вводе print
выполняется оператор print
. В
Python3 print
был ошибочно сделан псевдонимом для команды pdb p
.
p
, однако, печатает repr
своего аргумента, а не str
, как это
сделала команда Python2 print
. Хуже того, команда Python3 pdb print
затеняла функцию Python3 print
, делая её недоступной в командной строке
pdb
. (Предоставлено Коннором Осборном в bpo-18764.)
pickle
pickle
теперь поддерживает (но не использует по умолчанию) новый
протокол pickle 4. Новый протокол решает ряд проблем,
присутствовавших в предыдущих протоколах, таких как сериализация вложенных
классов, очень большие строки и контейнеры, а также классы чей метод
__new__()
принимает только ключевые аргументы. Он
также обеспечивает некоторые улучшения эффективности.
См.также
- PEP 3154 – Pickle протокол 4
- PEP, написанный Антуаном Питру и реализованный Александром Вассалотти.
plistlib
plistlib
теперь имеет API, аналогичный стандартному шаблону для
протоколов сериализации stdlib, с новыми функциями load()
,
dump()
, loads()
и dumps()
.
(Старый API устарел.) В дополнение к уже поддерживаемому формату списка XML
(FMT_XML
) теперь также поддерживается двоичный формат списка
(FMT_BINARY
). (Предоставлено Рональдом Уссореном и другими в
bpo-14455.)
poplib
В poplib
добавлены два новых метода: capa()
,
возвращающий список возможностей, объявленных POP-сервером, и
stls()
, переключающий сеанс POP3 с открытым текстом на
сеанс POP3 с шифрованием, если POP-сервер его поддерживает. (Предоставлено
Лоренцо Катуччи в bpo-4473.)
pprint
Класс PrettyPrinter
модуля pprint
и его функции
pformat()
и pprint()
имеют новую опцию compact,
которая управляет форматированием вывода. В настоящее время установка compact
на True
означает, что последовательности будут напечатаны с таким
количеством элементов последовательности, которое поместится в width в каждой
(с отступом) строке. (Предоставлено Сергеем Сторчакой в bpo-19132.)
Длинные строки теперь переносятся с использованием обычного синтаксиса продолжения строки Python. (Предоставлено Антуаном Питру в bpo-17150.)
pty
pty.spawn()
теперь возвращает значение состояния из os.waitpid()
дочернего процесса вместо None
. (Предоставлено Грегори П. Смитом)
pydoc
Модуль pydoc
теперь основан непосредственно на API самоанализа
inspect.signature()
, что позволяет ему предоставлять информацию о
сигнатуре для более широкого спектра вызываемых объектов. Это изменение также
означает, что атрибуты __wrapped__
теперь учитываются при отображении
справочной информации. (Предоставлено Ларри Гастингсом в bpo-19674.)
Модуль pydoc
больше не отображает параметр self
для уже привязанных
методов. Вместо этого он стремится всегда отображать точную текущую сигнатуру
предоставленного вызываемого объекта. (Предоставлено Ларри Гастингсом в
bpo-20710.)
В дополнение к изменениям, которые были внесены непосредственно в pydoc
,
его обработка пользовательских методов __dir__
и различных вариантов
поведения дескрипторов также была существенно улучшена благодаря базовым
изменениям в модуле inspect
.
Поскольку встроенный help()
основан на pydoc
, вышеуказанные
изменения также влияют на поведение help()
.
re
Новая функция fullmatch()
и метод regex.fullmatch()
закрепляют
шаблон на обоих концах строки для соответствия. Это предоставляет возможность
явно указать цель сопоставления, что позволяет избежать класса незаметных
ошибок, когда символы $
теряются во время изменения кода или добавления
альтернатив к существующему регулярному выражению. (Предоставлено Мэтью
Барнеттом в bpo-16203.)
repr объектов регулярных выражений теперь включает шаблон и флаги; repr сопоставляемых объектов теперь включает начало, конец и совпавшую часть строки. (Предоставлено Хьюго Лопесом Таваресом и Сергеем Сторчакой в bpo-13592 и bpo-17087.)
resource
Новая функция prlimit()
, доступная на платформах Linux с
версией ядра 2.6.36 или более поздней и glibc версии 2.13 или более поздней,
предоставляет возможность запрашивать или устанавливать ограничения ресурсов
для процессов, отличных от того, который выполняет вызов. (Предоставлено
Кристианом Хеймсом в bpo-16595.)
В ядре Linux версии 2.6.36 или более поздней версии также есть некоторые новые
константы Linux: RLIMIT_MSGQUEUE
,
RLIMIT_NICE
, RLIMIT_RTPRIO
,
RLIMIT_RTTIME
и RLIMIT_SIGPENDING
.
(Предоставлено Кристианом Хеймсом в bpo-19324.)
Во FreeBSD версии 9 и более поздних есть несколько новых специфичных для
FreeBSD констант: RLIMIT_SBSIZE
,
RLIMIT_SWAP
и RLIMIT_NPTS
. (Предоставлено
Клаудиу Попа в bpo-19343.)
select
Объекты epoll
теперь поддерживают протокол управления
контекстом. При использовании в операторе with
метод
close()
будет вызываться автоматически в конце блока.
(Предоставил Сергей Сторчака в bpo-16488.)
Объекты devpoll
теперь имеют методы
fileno()
и close()
, а также новый
атрибут closed
. (Предоставлено Виктором Стиннером в
bpo-18794.)
shelve
Экземпляры Shelf
теперь могут использоваться в операторах
with
и будут автоматически закрываться в конце блока
with
. (Предоставлено Филипом Грущинским в bpo-13896.)
shutil
copyfile()
теперь вызывает определённый подкласс
Error
, SameFileError
, когда исходный и целевой
файлы являются одним и тем же файлом, что позволяет приложению предпринимать
соответствующие действия в отношении данной ошибки. (Предоставлено
Ацуо Исимото и Хайнеком Шлаваком в bpo-1492704.)
smtpd
Классы SMTPServer
и SMTPChannel
теперь
принимают ключевой аргумент map, который, если он указан, передаётся в
asynchat.async_chat
в качестве его аргумента map. Это позволяет
приложению избежать влияния на глобальную карту сокетов. (Предоставлено Винаем
Саджипом в bpo-11959.)
smtplib
SMTPException
теперь является подклассом OSError
,
позволяющий перехватывать как ошибки уровня сокета, так и ошибки уровня
протокола SMTP в одном операторе try/except с помощью кода, который заботится
только о том, произошла ошибка или нет. (Предоставлено Недом Джексоном Лавли в
bpo-2118.)
socket
Модуль socket теперь поддерживает протокол CAN_BCM
на
платформах, которые его поддерживают. (Предоставлено Брайаном Торном в
bpo-15359.)
Объекты сокетов имеют новые методы для получения или установки своих
наследуемых флагов,
get_inheritable()
и
set_inheritable()
.
Константы socket.AF_*
и socket.SOCK_*
теперь являются значениями
перечисления с использованием нового модуля enum
. Это позволяет печатать
осмысленные имена во время отладки вместо целых «магических чисел».
Константа AF_LINK
теперь доступна в BSD и OSX.
inet_pton()
и inet_ntop()
теперь поддерживаются в
Windows. (Предоставлено Ацуо Исимото в bpo-7171.)
sqlite3
Новый логический параметр функции connect()
, uri, может
использоваться для указания того, что параметр database является uri
(см.
Документацию по URI SQLite). (Предоставлено
poq в bpo-13773.)
ssl
Добавлены PROTOCOL_TLSv1_1
и PROTOCOL_TLSv1_2
(поддержка TLSv1.1 и TLSv1.2); поддержка данных протоколов доступна только в
том случае, если Python связан с OpenSSL 1.0.1 или более поздней версии.
(Предоставлено Мишель Орру и Антуаном Питру в bpo-16692.)
Новая функция create_default_context()
предоставляет стандартный
способ получения SSLContext
, настройки которого обеспечивают
разумный баланс между совместимостью и безопасностью. Данные параметры являются
более строгими, чем значения по умолчанию, предоставленные конструктором
SSLContext
, и могут быть скорректированы в будущем без
предварительного устаревания, если изменятся передовые требования безопасности.
Новая рекомендуемая передовая практика использования библиотек stdlib,
поддерживающих SSL, заключается в использовании
create_default_context()
для получения объекта
SSLContext
, изменении его при необходимости, а затем передаче в
качестве аргумента context соответствующего API stdlib. (Предоставлено
Кристианом Хеймсом в bpo-19689.)
Метод SSLContext
load_verify_locations()
принимает новый необязательный аргумент cadata, который можно использовать
для предоставления сертификатов в кодировке PEM или DER напрямую через строки
или байты соответственно. (Предоставлено Кристианом Хеймсом в bpo-18138.)
Новая функция get_default_verify_paths()
возвращает именованный
кортеж путей и переменных среды, который метод
set_default_verify_paths()
использует для установки
значений по умолчанию cafile
и capath
OpenSSL. Это может помочь в
устранении проблем с проверкой по умолчанию. (Предоставлено Кристианом Хеймсом
в bpo-18143.)
У SSLContext
появился новый метод
cert_store_stats()
, сообщающий количество
загруженных сертификатов X.509
, сертификатов X.509 CA
и списков отзыва
сертификатов (crl
), а также метод get_ca_certs()
,
возвращающий список загруженных сертификатов CA
. (Предоставлено
Кристианом Хеймсом в bpo-18147.)
Если доступен OpenSSL 0.9.8 или более поздней версии, SSLContext
имеет новый атрибут verify_flags
, который можно
использовать для управления процессом проверки сертификата, установив для него
некоторую комбинацию новых констант VERIFY_DEFAULT
,
VERIFY_CRL_CHECK_LEAF
, VERIFY_CRL_CHECK_CHAIN
или
VERIFY_X509_STRICT
. OpenSSL по умолчанию не выполняет проверку
CRL. (Предоставлено Кристианом Хеймсом в bpo-8813.)
Новый метод SSLContext
load_default_certs()
загружает множество сертификатов центра сертификации (CA) по умолчанию из
расположений по умолчанию, которые различаются в зависимости от платформы. Его
можно использовать для загрузки как сертификатов проверки подлинности
веб-сервера TLS (purpose=
SERVER_AUTH
), которые клиент
может использовать для проверки сервера, так и сертификатов, используемые
сервером для проверки сертификатов клиентов
(purpose=
CLIENT_AUTH
). (Предоставлено Кристианом
Хеймсом в bpo-19292.)
Две новые функции только для Windows, enum_certificates()
и
enum_crls()
, позволяют извлекать сертификаты, информацию о
сертификатах и CRL из хранилища сертификатов Windows. (Предоставлено Кристианом
Хеймсом в bpo-17134.)
Поддержка SNI на стороне сервера (указание имени сервера) с использованием
нового метода ssl.SSLContext.set_servername_callback()
. (Предоставлено
Дэниелом Блэком в bpo-8109.)
Словарь, возвращённый SSLSocket.getpeercert()
, содержит дополнительные
элементы расширения X509v3
: URI crlDistributionPoints
, calIssuers
и
OCSP
. (Предоставлено Кристианом Хеймсом в bpo-18379.)
stat
Модуль stat
теперь поддерживается реализацией C в _stat
.
Требуется реализация C, т. к. большинство значений не стандартизированы и
зависят от платформы. (Предоставлено Кристианом Хеймсом в bpo-11016.)
Модуль поддерживает новые флаги ST_MODE
, S_IFDOOR
,
S_IFPORT
и S_IFWHT
. (Предоставлено Кристианом
Химсом в bpo-11016.)
struct
Новая функция iter_unpack
и новый метод
struct.Struct.iter_unpack()
для скомпилированных форматов обеспечивают
потоковую распаковку буфера, содержащего повторяющиеся экземпляры заданного
формата данных. (Предоставлено Антуаном Питру в bpo-17804.)
subprocess
check_output()
теперь принимает аргумент input, который
можно использовать для предоставления содержимого stdin
для выполняемой
команды. (Предоставлено Заком Вайнбергом в bpo-16624.)
getstatus()
и getstatusoutput()
теперь
работают в Windows. Это изменение было фактически непреднамеренно сделано в
3.3.4. (Предоставлено Тимом Голденом в bpo-10197.)
sunau
Метод getparams()
теперь возвращает именованный кортеж, а не
простой кортеж. (Предоставлено Клаудиу Попа в bpo-18901.)
sunau.open()
теперь поддерживает протокол управления контекстом: при
использовании в блоке with
метод возвращаемого объекта close
будет вызываться автоматически в конце блока. (Предоставлено Сергеем Сторчакой
в bpo-18878.)
AU_write.setsampwidth()
теперь поддерживает 24-битные сэмплы, тем самым
добавляя поддержку записи 24-битных семплов с помощью модуля. (Предоставил
Сергей Сторчака в bpo-19261.)
Методы writeframesraw()
и
writeframes()
теперь принимают любой
байтоподобный объект. (Предоставил Сергей Сторчака в bpo-8311.)
sys
Новая функция sys.getallocatedblocks()
возвращает текущее количество
блоков, выделенных интерпретатором. (В CPython с настройкой по умолчанию
--with-pymalloc
это распределение осуществляется через API
PyObject_Malloc()
.) Это может быть полезно для отслеживания утечек
памяти, особенно если они автоматизированы с помощью набора тестов.
(Предоставлено Антуаном Питру в bpo-13390.)
Когда интерпретатор Python запускается в
интерактивном режиме, он проверяет наличие атрибута __interactivehook__
в
модуле sys
. Если атрибут существует, его значение вызывается без
аргументов непосредственно перед запуском интерактивного режима. Проверка
производится после того, как прочитан файл PYTHONSTARTUP
, поэтому его
можно установить там. Модуль site
устанавливает его
для функции, которая включает tab-автодополнение и сохранение истории (в
~/.python-history
), если платформа поддерживает readline
. Если
вам не нужно это (новое) поведение, вы можете переопределить его в
PYTHONSTARTUP
, sitecustomize
или usercustomize
, удалив
данный атрибут из sys
(или установив для него какой-либо другой
вызываемый объект). (Предоставлено Эриком Араужо и Антуаном Питру в
bpo-5845.)
tarfile
Модуль tarfile
теперь поддерживает простой Интерфейс командной строки
при вызове скрипта напрямую или через -m
. Это можно использовать для
создания и извлечения архивов tarfile. (Предоставлено Беркером Пексагом в
bpo-13477.)
textwrap
Класс TextWrapper
имеет два новых атрибута/аргумента
конструктора: max_lines
, ограничивающий
количество строк в выходных данных, и
placeholder
, представляющий собой строку, которая
появится в конце выходных данных, если она была усечена из-за max_lines.
Основываясь на данных возможностях, новая удобная функция
shorten()
сворачивает все пробелы во входных данных в одиночные
пробелы и создаёт одну строку заданного width, которая заканчивается
placeholder (по умолчанию [...]
). (Предоставлено Антуаном Питру и Сергеем
Сторчакой в bpo-18585 и bpo-18725.)
threading
Объект Thread
, представляющий основной поток, можно
получить из новой функции main_thread()
. В обычных условиях
это поток, из которого был запущен интерпретатор Python. (Предоставлено
Адреем Светловым в bpo-18882.)
traceback
Новая функция traceback.clear_frames()
берёт объект трассировки и очищает
локальные переменные во всех фреймах, на которые он ссылается, уменьшая объём
потребляемой памяти. (Предоставлено Эндрю Кучлингом в bpo-1565525.)
types
Новый дескриптор DynamicClassAttribute()
предоставляет способ
определения атрибута, работающий нормально при поиске через экземпляр
объекта, но направляемый к class __getattr__
при поиске через
класс. Это позволяет иметь активные свойства в классе и иметь виртуальные
атрибуты в классе с тем же именем (см. Enum
для примера). (Предоставлено
Итаном Фурманом в bpo-19030.)
urllib
urllib.request
теперь поддерживает URL-адреса data:
через класс
DataHandler
. (Предоставлено Матиасом Панзенбеком в
bpo-16423.)
Метод http, который будет использоваться классом
Request
, теперь можно указать, установив атрибут
класса method
в подклассе. (Предоставлено
Джейсоном Р. Кумбсом в bpo-18978.)
Объекты Request
теперь можно использовать повторно:
при изменении атрибутов full_url
или
data
обновляются все соответствующие внутренние
свойства. Это означает, например, что теперь можно использовать один и тот же
объект Request
более чем в одном вызове
OpenerDirector.open()
с разными аргументами data или изменить url
Request
вместо того, чтобы пересчитывать его с нуля.
Существует также новый метод remove_header()
,
который можно использовать для удаления заголовков из файла
Request
. (Предоставлено Алексеем Качаевым в
bpo-16464, Даниэлем Возняком в bpo-17485 и Дэмиеном Брехтом и
Сентилом Кумараном в bpo-17272.)
Объекты HTTPError
теперь имеют атрибут
headers
, предоставляющий доступ к заголовкам
ответов HTTP, связанным с ошибкой. (Предоставлено Беркером Пексагом в
bpo-15701.)
unittest
У класса TestCase
появился новый метод
создающий менеджер контекста subTest()
, блок
with
которого становится «подтестом». Данный менеджер контекста
позволяет тестовому методу динамически генерировать подтесты, например, вызывая
менеджер контекста subTest
внутри цикла. Таким образом, один метод
тестирования может создать неопределенное количество отдельно
идентифицированных и отдельно подсчитанных тестов, все из которых будут
выполняться, даже если один или несколько из них не пройдут. Например:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
приведёт к шести подтестам, каждый из которых указан в подробном выводе
модульного теста с меткой, состоящей из имени переменной i
и
значения этой переменной (i=0
, i=1
и т. д.). Полную версию этого
примера см. в Различение итераций теста с помощью подтестов. (Предоставлено Антуаном Питру в bpo-16997.)
unittest.main()
теперь принимает итерацию имён тестов для defaultTest,
тогда как ранее он принимал только одно имя теста в виде строки. (Предоставлено
Юрки Пуллиайненом в bpo-15132.)
Если SkipTest
вызывается во время обнаружения тестов (т. е.
на уровне модуля в тестовом файле), теперь это сообщается как пропуск, а не как
ошибка. (Предоставлено Заком Уэром в bpo-16935.)
discover()
теперь сортирует обнаруженные файлы,
чтобы обеспечить согласованное упорядочение тестов. (Предоставлено Мартином
Мелином и Джеффом Рамнани в bpo-16709.)
TestSuite
теперь удаляет ссылки на тесты, как только тест
был запущен, если тест прошел успешно. В интерпретаторах Python, выполняющих
сборку мусора, это позволяет выполнять сборку мусора для тестов, если ничто
другое не содержит ссылку на тест. Это поведение можно переопределить, создав
подкласс TestSuite
, определяющий пользовательский метод
_removeTestAtIndex
. (Предоставлено Томом Уордиллом, Мэттом МакКлюром и
Эндрю Светловым в bpo-11798.)
Новый менеджер контекста тестовых утверждений,
assertLogs()
, гарантирует, что данный блок кода
вызывает сообщение журналирования, используя модуль logging
. По умолчанию
сообщение может исходить от любого логгера и иметь приоритет INFO
или выше,
но можно указать как имя логгера, так и альтернативный минимальный уровень
ведения журнала. Объект, возвращённый менеджером контекста, можно запросить
для LogRecord
’ов и/или отформатированных сообщений, которые
были залоггированы. (Предоставлено Антуаном Питру в bpo-18937.)
Тестовое обнаружение теперь работает с пакетами пространств имён (предоставлено Клаудиу Попа в bpo-17457.)
Объекты unittest.mock
теперь проверяют свои сигнатуры спецификации при
сопоставлении вызовов, что означает, что аргумент теперь может сопоставляться
либо по положению, либо по имени, а не только по положению. (Предоставлено
Антуаном Питру в bpo-17015.)
Объекты mock_open()
теперь имеют методы readline
и
readlines
. (Предоставлено Тошио Куратоми в bpo-17467.)
venv
venv
теперь включает сценарии активации для оболочек csh
и fish
.
(Предоставлено Эндрю Светловым в bpo-15417.)
EnvBuilder
и вспомогательная функция create()
принимают новый ключевой аргумент with_pip, по умолчанию равный
False
, определяющий, гарантирует ли EnvBuilder
, что
pip
установлен в виртуальной среде. (Предоставлено Ником Когланом в
bpo-19552 как часть реализации PEP 453.)
wave
Метод getparams()
теперь возвращает именованный кортеж, а не
простой кортеж. (Предоставлено Клаудиу Попа в bpo-17487.)
wave.open()
теперь поддерживает протокол управления контекстом.
(Предоставлено Клаудиу Попа в bpo-17616.)
wave
теперь может
записывать вывод в недоступные для поиска файлы.
(Предоставлено Дэвидом Джонсом, Гильерме Поло и Сергеем Сторчакой в
bpo-5202.)
Методы writeframesraw()
и
writeframes()
теперь принимают любой
байтоподобный объект. (Предоставил
Сергей Сторчака в bpo-8311.)
weakref
Новый класс WeakMethod
имитирует слабые ссылки на связанные
методы. (Предоставлено Антуаном Питру в bpo-14631.)
Новый класс finalize
позволяет зарегистрировать обратный
вызов, который будет вызываться при сборке мусора, без необходимости
тщательного управления жизненным циклом самой слабой ссылки. (Предоставлено
Ричардом Оудкерком в bpo-15528.)
Обратный вызов, если таковой имеется, связанный с ref
, теперь
отображается через атрибут __callback__
. (Предоставлено
Марком Дикинсоном в bpo-17643.)
xml.etree
Новый парсер XMLPullParser
позволяет неблокирующим приложениям анализировать XML-документы. Пример можно
увидеть по адресу Pull API для неблокирующего парсинга. (Предоставлено Антуаном
Питру в bpo-17741.)
Функции xml.etree.ElementTree
tostring()
и
tostringlist()
, а также метод
ElementTree
write()
теперь имеют
short_empty_elements только ключевой параметр,
обеспечивающий контроль над тем, записываются ли элементы без содержимого в
сокращенной (<tag />
) или расширенной (<tag></tag>
) форме.
(Предоставлено Ариэлем Поляком и Сергеем Сторчакой в bpo-14377.)
zipfile
Метод writepy()
класса PyZipFile
имеет новый параметр filterfunc, который можно использовать для управления
тем, какие каталоги и файлы добавляются в архив. Например, это может быть
использовано для исключения тестовых файлов из архива. (Предоставлено
Кристианом Тисмером в bpo-19274.)
Параметр allowZip64 для ZipFile
и
PyZipfile
теперь по умолчанию равен True
. (Предоставлено
Уильямом Маллардом в bpo-17201.)
Изменения реализации CPython
PEP 445: Настройка распределителей памяти CPython
PEP 445 добавляет новые интерфейсы уровня C для настройки распределения памяти в интерпретаторе CPython.
См.также
- PEP 445 — Добавлены новые API для настройки распределителей памяти Python
- PEP написан и реализован Виктором Стиннером.
PEP 442: Завершение безопасного объекта
PEP 442 устраняет текущие ограничения и особенности финализации объектов в
CPython. С его помощью объекты с методами __del__()
, а также генераторы с
предложениями finally
могут быть финализированы, когда они являются
частью ссылочного цикла.
В рамках этого изменения глобальные переменные модуля больше не устанавливаются
принудительно в None
во время завершения работы интерпретатора в
большинстве случаев, вместо этого полагаясь на нормальную работу циклического
сборщика мусора. Это позволяет избежать целого класса ошибок времени завершения
работы интерпретатора, обычно связанных с методами __del__
, которые
преследовали Python с тех пор, как впервые был представлен циклический сборщик
мусора.
См.также
- PEP 442 – Завершение безопасного объекта
- PEP написан и реализован Антуаном Питру.
PEP 456: Безопасный и взаимозаменяемый алгоритм хеширования
PEP 456 продолжает более раннюю работу по исправлению безопасности, выполненную для хеш-алгоритма Python для защиты от определённых DOS-атак, которым могут подвергаться общедоступные API-интерфейсы, поддерживаемые поиском по словарю. (См. bpo-14621, чтобы узнать о начале текущего раунда улучшений.) PEP унифицирует хеш-код CPython, чтобы упаковщику было проще заменить другой хэш-алгоритм, и переключает реализацию Python по умолчанию на реализацию SipHash на платформах с 64-разрядной архитектурой. тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV незначительны.
PEP добавляет дополнительные поля в именованный кортеж sys.hash_info
для описания алгоритма хеширования, используемого исполняемым в данный момент
двоичным файлом. В противном случае PEP не изменяет существующие API-интерфейсы
CPython.
PEP 436: Клиника споров
«Клиника споров» (PEP 436) теперь является частью процесса сборки CPython и может использоваться для упрощения процесса определения и поддержки точных сигнатур для встроенных функций и модулей расширения стандартной библиотеки, реализованных на C.
Некоторые стандартные модули расширения библиотеки были преобразованы для
использования Клиники споров в Python 3.4, а pydoc
и inspect
были обновлены соответствующим образом.
Ожидается, что метаданные сигнатуры для программной самоанализа будут добавлены к доп. вызываемым реализованным на C объектам, как часть отладочных релизов Python 3.4.
Примечание
PEP Клиники споров (Argument Clinic) не полностью соответствует состоянию реализации. В данном случае менеджер по выпуску и основная группа разработчиков сочли это приемлемым, поскольку Клиники споров не будет доступна в качестве общедоступного API для использования третьими сторонами в Python 3.4.
См.также
- PEP 436 – DSL Клиники споров
- PEP написан и реализован Ларри Хастингсом.
Другие изменения сборки и C API
- В стабильный ABI добавлена новая функция
PyType_GetSlot()
, позволяющая извлекать указатели функций из слотов именованных типов при использовании ограниченного API. (Предоставлено Мартином фон Лёвисом в bpo-17162.) - Новый API-интерфейс предварительной инициализации
Py_SetStandardStreamEncoding()
позволяет приложениям, в которые встроен интерпретатор CPython, надежно принудительно применять определённую кодировку и обработчик ошибок для стандартных потоков. (Предоставлено Бастьеном Маунтином и Ником Когланом в bpo-16129.) - Большинство API-интерфейсов Python C, которые не изменяют строковые
аргументы, теперь правильно помечены как принимающие
const char *
, а неchar *
. (Предоставлено Сергеем Сторчакой в bpo-1772673.) - Новую версию оболочки
python-config
можно использовать, даже если интерпретатор Python недоступен (например, в сценариях кросс-компиляции). PyUnicode_FromFormat()
теперь поддерживает спецификации ширины и точности для%s
,%A
,%U
,%V
,%S
и%R
. (Предоставлено Юсджи Рей и Виктором Стиннером в bpo-7330.)- Новая функция
PyStructSequence_InitType2()
дополняет существующую функциюPyStructSequence_InitType()
. Разница в том, что он возвращает0
в случае успеха и-1
в случае неудачи. - Исходный код CPython теперь может быть скомпилирован с использованием функций проверки правильности адресов последних версий GCC и clang: ложные тревоги в распределителе малых объектов были отключены. (Предоставлено Дхиру Холиа в bpo-18596.)
- Сборка Windows теперь использует Рандомизацию макета адресного пространства и Предотвращение выполнения данных. (Предоставлено Кристианом Хеймсом в bpo-16632.)
- Новая функция
PyObject_LengthHint()
является эквивалентомoperator.length_hint()
в C API. (Предоставлено Армином Ронахером в bpo-16148.)
Другие улучшения
- У команды python появилась новая
опция,
-I
, что заставляет его работать в «изолированном режиме», что означает, чтоsys.path
не содержит ни каталога скрипта, ни каталога пользователяsite-packages
, а все переменные средыPYTHON*
игнорируются (подразумевается как-s
, так и-E
). Другие ограничения также могут быть применены в будущем с целью изолировать выполнение скрипта от пользовательской среды. Это уместно, например, когда Python используется для запуска системного скрипта. В большинстве систем POSIX его можно и нужно использовать в строке системных скриптов#!
. (Предоставлено Кристианом Хеймсом в bpo-16499.) - Завершение с помощью табуляции теперь включено по умолчанию в интерактивном
интерпретаторе в системах, поддерживающих
readline
. История также включена по умолчанию и записывается (и читается) в файл~/.python- history
. (Предоставлено Антуаном Питру и Эриком Араужо в bpo-5845.) - Вызов интерпретатора Python с
--version
теперь выводит версию в стандартный вывод вместо стандартной ошибки (bpo-18338). Аналогичные изменения были внесены вargparse
(bpo-18920) и другие модули, которые имеют возможности вызова, подобные сценариям (bpo-18922). - Установщик CPython для Windows теперь добавляет
.py
в переменнуюPATHEXT
при регистрации расширений, что позволяет пользователям запускать скрипт Python в командной строке Windows, просто вводя его имя без расширения.py
. (Предоставлено Полом Муром в bpo-18569.) - Новая цель
make
coverage-report будет собирать Python, запускать множество тестов и генерировать отчёт о покрытии HTML для кодовой базы C с использованиемgcov
и lcov. - Параметр
-R
для множество регрессионных тестов Python теперь также проверяет наличие утечек памяти, используяsys.getallocatedblocks()
. (Предоставлено Антуаном Питру в bpo-13390.) python -m
теперь работает с пакетами пространства имён.- Модуль
stat
теперь реализован на C, что означает, что он получает значения своих констант из заголовочных файлов C, вместо того, чтобы иметь значения, жёстко закодированные в модуле python, как это было раньше. - Загрузка нескольких модулей Python из одного модуля ОС (
.so
,.dll
) теперь работает корректно (ранее автоматически возвращался первый модуль Python в файле). (Предоставлено Вацлавом Шмилауэром в bpo-16421.) - Добавлен новый код операции
LOAD_CLASSDEREF
для исправления ошибки загрузки свободных переменных в телах классов, которая могла быть вызвана определенным использованием __prepare__. (Предоставлено Бенджамином Петерсоном в bpo-17853.) - Ряд сбоев, связанных с MemoryError, был обнаружен и исправлен Виктором
Стиннером с помощью его инструмента
pyfailmalloc
на основе PEP 445 (bpo-18408, bpo-18520). - Команда
pyvenv
теперь принимает параметр--copies
для использования копий, а не символических ссылок, даже в системах, где символические ссылки используются по умолчанию. (Предоставлено Винаем Саджипом в bpo-18807.) - Команда
pyvenv
также принимает параметр--without-pip
для подавления автоматической загрузки pip в виртуальную среду. (Предоставлено Ником Когланом в bpo-19552 как часть реализации PEP 453.) - Имя кодировки теперь является необязательным в множестве значений для
переменной среды
PYTHONIOENCODING
. Это позволяет установить только обработчик ошибок без изменения кодировки по умолчанию. (Предоставил Сергей Сторчака в bpo-18818.) - Функции модуля
bz2
,lzma
иgzip
open
теперь поддерживают режимx
(эксклюзивное создание). (Предоставлено Тимом Хини и Ваджраски Коком в bpo-19201, bpo-19222 и bpo-19223.)
Значительные оптимизации
- Декодер UTF-32 теперь работает в 3-4 раза быстрее. (Предоставил Сергей Сторчака в bpo-14625.)
- Стоимость коллизий хэшей для множеств теперь снижена. Каждое зондирование хеш-таблицы теперь проверяет ряд последовательных смежных пар ключ/хэш, прежде чем продолжать делать случайные зондирования через хеш-таблицу. Это использует локальность кеша, чтобы сделать разрешение коллизий менее затратным. Схему разрешения коллизий можно описать как гибрид линейного зондирования и открытой адресации. Количество дополнительных линейных датчиков по умолчанию равно девяти. Это можно изменить во время компиляции, определив LINEAR_PROBES как любое значение. Устанавливает LINEAR_PROBES=0, чтобы полностью отключить линейное измерение. (Предоставлено Рэймондом Хеттингером в bpo-18771.)
- Интерпретатор запускается примерно на 30% быстрее. Пара мер приводит к
ускорению. Интерпретатор загружает меньше модулей при запуске, например
модули
re
,collections
иlocale
и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен, чтобы быстрее загружать скомпилированный код Python. (Предоставлено Антуаном Питру, Кристианом Хеймсом и Виктором Стиннером в bpo-19219, bpo-19218, bpo-19209, bpo-19205 и bpo-9548.) bz2.BZ2File
теперь работает так же быстро или быстрее, чем версия Python2 в большинстве случаев.lzma.LZMAFile
также был оптимизирован. (Предоставлено Сергеем Сторчакой и Надимом Вавдой в bpo-16034.)random.getrandbits()
на 20-40% быстрее для небольших целых чисел (наиболее распространенный вариант использования). (Предоставлено Сергеем Сторчакой в bpo-16674.)- Благодаря новому формату хранения строк обработка строк теперь выполняется значительно быстрее. (Предоставлено Виктором Стиннером и Антуаном Питру в bpo-15596.)
- Проблема с производительностью в
io.FileIO.readall()
решена. Это особенно влияет на Windows и значительно ускоряет передачу значительных объемов данных черезsubprocess
. (Предоставлено Ричардом Оудкерком в bpo-15758.) html.escape()
теперь в 10 раз быстрее. (Предоставлено Мэттом Брайантом в bpo-18020.)- В Windows теперь используется родной
VirtualAlloc
вместо CRTmalloc
вobmalloc
. Искусственные тесты показывают около 3% экономии памяти. os.urandom()
теперь использует постоянный файловый дескриптор с отложенным открытием, чтобы избежать использования множества файловых дескрипторов при параллельном запуске из нескольких потоков. (Предоставлено Антуаном Питру в bpo-18756.)
Устарело
В этом разделе рассматриваются различные API и другие функции, которые устарели
в Python 3.4 и будут удалены в Python 3.5 или более поздних версиях. В
большинстве (но не во всех) случаях использование устаревших API приведёт к
появлению DeprecationWarning
, когда интерпретатор запускается с
включенными предупреждениями об устаревании (например, при использовании
-Wd
).
Устаревшие в Python API
- Как упоминалось в PEP 451: тип ModuleSpec для системы импорта, ряд методов и функций
importlib
устарели:importlib.find_loader()
заменён наimportlib.util.find_spec()
;importlib.machinery.PathFinder.find_module()
заменён наimportlib.machinery.PathFinder.find_spec()
;importlib.abc.MetaPathFinder.find_module()
заменён наimportlib.abc.MetaPathFinder.find_spec()
;importlib.abc.PathEntryFinder.find_loader()
иfind_module()
заменены наimportlib.abc.PathEntryFinder.find_spec()
; все методыxxxLoader
ABCload_module
(importlib.abc.Loader.load_module()
,importlib.abc.InspectLoader.load_module()
,importlib.abc.FileLoader.load_module()
,importlib.abc.SourceLoader.load_module()
) больше не должны реализовываться, вместо этого загрузчики должны реализовывать методexec_module
(importlib.abc.Loader.exec_module()
,importlib.abc.InspectLoader.exec_module()
,importlib.abc.SourceLoader.exec_module()
); и пусть система импорта позаботится обо всем остальном; а такжеimportlib.abc.Loader.module_repr()
,importlib.util.module_for_loader()
,importlib.util.set_loader()
иimportlib.util.set_package()
больше не нужны, поскольку теперь их функции автоматически обрабатываются системой импорта. - Модуль
imp
считается устаревшим. Чтобы сохранить совместимость с кодовыми базами Python 2/3, удаление модуля в настоящее время не запланировано. - Модуль
formatter
ожидает устаревания и планируется удалить в Python 3.6. MD5
в качестве digestmod по умолчанию для функцииhmac.new()
устарел. Python 3.6 потребует явного имени дайджеста или конструктора в качестве аргумента digestmod.- Внутренний класс
Netrc
в модулеftplib
уже довольно давно задокументирован как устаревший в строке документации. Теперь он вызываетDeprecationWarning
и будет полностью удалён в Python 3.5. - Недокументированный аргумент endtime для
subprocess.Popen.wait()
не должен был быть раскрыт и, надеюсь, не используется; он устарел и, скорее всего, будет удалён в Python 3.5. - Аргумент strict для
HTMLParser
устарел. - Функции
plistlib
readPlist()
,writePlist()
,readPlistFromBytes()
иwritePlistToBytes()
устарели в пользу соответствующих новых функцийload()
,dump()
,loads()
иdumps()
.Data()
устарел, вместо него используется только конструкторbytes
. - Ключ
sysconfig
SO
устарел, он был заменён наEXT_SUFFIX
. - Режим
U
, принимаемый различными функциямиopen
, устарел. В Python3 он не делает ничего полезного и должен быть заменён соответствующим использованиемio.TextIOWrapper
(при необходимости) и его аргумента newline. - Аргумент parser
xml.etree.ElementTree.iterparse()
устарел, как и аргумент htmlXMLParser()
. Чтобы подготовиться к удалению последнего, все аргументыXMLParser
должны передаваться по ключевому слову.
Удаления
Операционные системы больше не поддерживаются
Поддержка следующих операционных систем была удалена из исходного кода и инструментов сборки:
Удаление API и функций
Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:
- Неподдерживаемые каталоги
Misc/TextMate
иMisc/vim
были удалены (см. devguide для предложений о том, что использовать вместо этого). - Удалён макрос makefile
SO
(он был заменён макросамиSHLIB_SUFFIX
иEXT_SUFFIX
) (bpo-16754). - Поле
PyThreadState.tick_counter
удалено; его значение было бессмысленным, начиная с Python 3.2, когда был представлен «новый GIL» (bpo-19199). PyLoader
иPyPycLoader
были удалены изimportlib
. (Предоставлено Тарасом Ляпуном в bpo-15641.)- Аргумент strict для
HTTPConnection
иHTTPSConnection
был удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются. - Устаревшие методы получения и установки
urllib.request.Request
add_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
иis_unverifiable
были удалены (атрибут прямого доступа был удалён вместо этого). - Поддержка загрузки устаревшего
TYPE_INT64
удалена изmarshal
. (Предоставлено Дэном Рити в bpo-15480.) inspect.Signature
: позиционные параметры теперь должны иметь допустимое имя.object.__format__()
больше не принимает непустые строки формата, теперь вместо этого вызываетсяTypeError
. Использование непустой строки устарело, начиная с Python 3.2. Это изменение было сделано для предотвращения ситуации, когда ранее работающий (но неверный) код начинал давать сбой, если объект получал метод __format__. А это означает, что ваш код может вызыватьTypeError
, если вы используете код формата's'
с не содержащими метода __format__ объектами. Справочную информацию см. в bpo-7994.difflib.SequenceMatcher.isbjunk()
иdifflib.SequenceMatcher.isbpopular()
устарели в версии 3.2 и теперь удалены: используйтеx in sm.bjunk
иx in sm.bpopular
, где sm — это объектSequenceMatcher
(bpo-13248).
Очистка кода
- Неиспользуемый и недокументированный внутренний класс
Scanner
был удалён из модуляpydoc
. - Частный и фактически неиспользуемый модуль
_gestalt
был удалён вместе с частными функциямиplatform
_mac_ver_lookup
,_mac_ver_gstalt
и_bcd2str
, которые когда-либо вызывались только в сильно сломанных системах OSX (см. bpo-18393). - Жёстко запрограммированные копии некоторых констант
stat
, которые были включены в пространство имён модуляtarfile
, были удалены.
Портирование на Python 3.4
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении команды «python»
- В оболочке posix установка переменной среды
PATH
в пустое значение эквивалентна тому, что она вообще не устанавливается. Однако установкаPYTHONPATH
в пустое значение не была эквивалентна тому, чтобы не устанавливать её вообще: установкаPYTHONPATH
в пустое значение была эквивалентна установке.
, что приводит к путанице при рассуждениях по аналогии с тем, как работаетPATH
. Теперь поведение соответствует соглашению posix дляPATH
. - Вывод [X refs, Y blocks] отладочной (
--with-pydebug
) сборки интерпретатора CPython теперь отключён по умолчанию. Его можно повторно включить с помощью параметра-X showrefcount
. (Предоставлено Эцио Мелотти в bpo-17323.) - Команда python и большинство сценариев stdlib (а также
argparse
) теперь выводят информацию--version
вstdout
вместоstderr
(список проблем см. Другие улучшения выше).
Изменения в API Python
ABC, определённые в
importlib.abc
, теперь либо вызывают соответствующее исключение, либо возвращают значение по умолчанию вместо того, чтобы слепо вызыватьNotImplementedError
. Это повлияет только на код, вызывающийsuper()
и проходящий до ABC. Для совместимости перехватите какNotImplementedError
, так и соответствующее исключение по мере необходимости.Тип модуля теперь инициализирует атрибуты
__package__
и__loader__
значениемNone
по умолчанию. Чтобы определить, были ли данные атрибуты установлены с обратной совместимостью, используйте, например.getattr(module, '__loader__', None) is not None
. (bpo-17115.)importlib.util.module_for_loader()
теперь безоговорочно устанавливает__loader__
и__package__
для правильной поддержки перезагрузки. Если это нежелательно, вам нужно будет установить данные атрибуты вручную. Вы можете использоватьimportlib.util.module_to_load()
для управления модулями.Импорт теперь безоговорочно сбрасывает соответствующие атрибуты (например,
__name__
,__loader__
,__package__
,__file__
,__cached__
) при перезагрузке. Обратите внимание, что это восстанавливает поведение до версии 3.3, поскольку это означает, что модуль повторно обнаруживается при повторной загрузке (bpo-19413).Замороженные пакеты больше не устанавливают
__path__
в список, содержащий имя пакета, теперь они устанавливают его в пустой список. Предыдущее поведение могло привести к тому, что система импорта неправильно выполняла импорт подмодулей, если существовал каталог с тем же именем, что и у замороженного пакета. Правильный способ определить, является модуль пакетом или нет,— использоватьhasattr(module, '__path__')
(bpo-18065).Замороженные модули больше не определяют атрибут
__file__
. Для замороженных модулей семантически неверно устанавливать атрибут, поскольку они не загружаются из какого-либо явного места. Если вы должны знать, что модуль исходит из замороженного кода, вы можете увидеть, установлен ли__spec__.location
модуля в'frozen'
, проверить, является ли загрузчик подклассомimportlib.machinery.FrozenImporter
, или если необходима совместимость с Python 2, вы можете использоватьimp.is_frozen()
.py_compile.compile()
теперь вызываетFileExistsError
, если путь к файлу, в который он записывает, является символической ссылкой или нестандартным файлом. Это должно действовать как предупреждение о том, что импорт перезапишет данные файлы обычным файлом независимо от того, какой тип пути к файлу они были изначально.importlib.abc.SourceLoader.get_source()
больше не вызываетImportError
, когда загружаемый исходный код вызываетSyntaxError
илиUnicodeDecodeError
. ПосколькуImportError
предназначен для вызова только тогда, когда исходный код не может быть найден, но должен быть, было сочтено чрезмерным охватом / перегрузкой этого значения, когда исходный код найден, но неправильно структурирован. Если вы раньше перехватывали ImportError и хотите продолжать игнорировать проблемы с синтаксисом или декодированием, перехватите все три исключения сейчас.functools.update_wrapper()
иfunctools.wraps()
теперь корректно устанавливают атрибут__wrapped__
для оборачиваемой функции, даже если для функции также был установлен атрибут__wrapped__
. Это означает, что атрибуты__wrapped__
теперь правильно связывают стек оформленных функций, а не каждый атрибут__wrapped__
в цепочке, относящийся к самой внутренней функции. Библиотеки самоанализа, предполагающие, что предыдущее поведение было преднамеренным, могут использоватьinspect.unwrap()
для доступа к первой функции в цепочке, у которой нет атрибута__wrapped__
.inspect.getfullargspec()
был повторно реализован поверхinspect.signature()
и, следовательно, обрабатывает гораздо более широкий спектр вызываемых объектов, чем в прошлом. Ожидается, что дополнительные вызовы встроенных и расширенных модулей получат метаданные сигнатуре в ходе серии Python 3.4. Код, который предполагает, чтоinspect.getfullargspec()
не будет работать с вызываемыми объектами, отличными от Python, может потребовать соответствующей корректировки.importlib.machinery.PathFinder
теперь передаёт текущий рабочий каталог объектам вsys.path_hooks
для пустой строки. Это приводит к тому, чтоsys.path_importer_cache
никогда не содержит''
, поэтому повторениеsys.path_importer_cache
на основеsys.path
не найдёт всех ключей.__file__
модуля при импорте в текущий рабочий каталог теперь также будет иметь абсолютный путь, в том числе при использовании-m
с интерпретатором (за исключением__main__.__file__
, когда сценарий был выполнен напрямую с использованием относительного пути) (предоставлено Бреттом Кэнноном в bpo-18416). (bpo-18416).Удаление аргумента strict на
HTTPConnection
иHTTPSConnection
изменяет значение остальных аргументов, если вы указываете их позиционно, а не по ключевому. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать любые дополнительные аргументы с помощью ключевых.Строки между операторами
from __future__ import ...
теперь всегда вызываютSyntaxError
. Раньше, если не было ведущей строки документации, промежуточная строка иногда игнорировалась. Это приводит CPython в соответствие со спецификацией языка; Jython и PyPy уже были. (bpo-17434).ssl.SSLSocket.getpeercert()
иssl.SSLSocket.do_handshake()
теперь вызываютOSError
сENOTCONN
, когдаSSLSocket
не подключён, вместо предыдущего поведения, когда вызывалсяAttributeError
. Кроме того,getpeercert()
вызоветValueError
, если рукопожатие ещё не было выполнено.base64.b32decode()
теперь вызываетbinascii.Error
, когда входная строка содержит символы, отличные от алфавита b32, вместоTypeError
. ДанноеTypeError
пропускалось, когда другиеTypeError
были преобразованы. (Предоставлено Сергеем Сторчакой в bpo-18011.) Примечание. Это изменение также было непреднамеренно применено в Python 3.3.3.Атрибут
file
теперь автоматически закрывается, когда создающий экземплярcgi.FieldStorage
подвергается сборке мусора. Если вы извлекали файловый объект отдельно от экземпляраcgi.FieldStorage
и не поддерживали экземпляр в рабочем состоянии, вам следует либо сохранить весь экземплярcgi.FieldStorage
, либо прочитать содержимое файла до того, как экземплярcgi.FieldStorage
будет удалён сборщиком мусора.Вызов
read
илиwrite
на закрытом сокете SSL теперь вызывает информативноеValueError
, а не ранее более загадочноеAttributeError
(bpo-9177).slice.indices()
больше не создаётOverflowError
для огромных значений. В результате этого исправленияslice.indices()
теперь вызываетValueError
, если ему задана отрицательная длина; ранее он возвращал бессмысленные значения (bpo-14794).Конструктор
complex
, в отличие от функцийcmath
, неправильно принимал значенияfloat
, если специальный метод объекта__complex__
возвращал единицу. Теперь вызываетTypeError
. (bpo-16290.)Конструктор
int
в версиях 3.2 и 3.3 ошибочно принимает значенияfloat
для параметра base. Вряд ли кто-то этим занимался, но если так, то сейчас вызываетсяTypeError
(bpo-16772).Значения по умолчанию для только ключевых аргументов, теперь вычисляются по умолчанию после обычных ключевых аргументов, а не раньше. Надеюсь, никто не написал код, зависящий от предыдущего ошибочного поведения (bpo-16967).
Устаревшие состояния потоков теперь очищаются после
fork()
. Это может привести к высвобождению некоторых системных ресурсов, которые ранее ошибочно сохранялись постоянно активными (например, соединения с базой данных хранились в локальном хранилище потока). (bpo-17094.)Имена параметров в
__annotations__
словари теперь правильно искажены, как и в__kwdefaults__
. (Предоставил Юрий Селиванов в bpo-20625.)hashlib.hash.name
теперь всегда возвращает идентификатор в нижнем регистре. Раньше некоторые встроенные хэши имели имена в верхнем регистре, но теперь, когда это официальный общедоступный интерфейс, имена стали согласованными (bpo-18532).Поскольку
unittest.TestSuite
теперь отбрасывает ссылки на тесты после их выполнения, множества тестов, которые повторно используютTestSuite
для повторного запуска набора тестов, могут дать сбой. Тесты не следует повторно использовать таким образом, поскольку это означает, что состояние сохраняется между запусками тестов, что нарушает изоляцию тестов, для обеспечения которой разработанunittest
. Однако, если отсутствие изоляции считается приемлемым, старое поведение можно восстановить, создав подклассTestSuite
, определяющий метод_removeTestAtIndex
, который ничего не делает (см.TestSuite.__iter__()
) (bpo-11798).unittest
теперь используетargparse
для парсинга командной строки. Существуют определённые недопустимые формы команд, которые раньше работали, но теперь запрещены; теоретически это не должно вызывать проблем с обратной совместимостью, поскольку запрещённые формы команд не имеют никакого смысла и вряд ли будут использоваться.Функции
audioop
теперь сразу же вызывают ошибку, если им передаётся строковый ввод, вместо случайного сбоя позже (bpo-16685).Новый аргумент convert_charrefs для
HTMLParser
в настоящее время по умолчанию имеет значениеFalse
для обратной совместимости, но в конечном итоге будет изменён на значение по умолчаниюTrue
. Рекомендуется добавить его как ключевой аргумент с соответствующим значением ко всем вызовамHTMLParser
в вашем коде (bpo-13633).Поскольку аргумент digestmod функции
hmac.new()
в будущем не будет иметь значения по умолчанию, все вызовыhmac.new()
следует изменить, чтобы явно указать digestmod (bpo-17276).Вызов
sysconfig.get_config_var()
с ключомSO
или поискSO
в результатах вызоваsysconfig.get_config_vars()
не рекомендуется. Данный ключ следует заменить наEXT_SUFFIX
илиSHLIB_SUFFIX
, в зависимости от контекста (bpo-19555).Любые вызовы функций
open
, которые указываютU
, должны быть изменены.U
неэффективен в Python3 и в конечном итоге вызовет ошибку, если его использовать. В зависимости от функции эквивалент её старого поведения Python2 может быть достигнут либо с помощью аргумента newline, либо, при необходимости, путём переноса потока вTextIOWrapper
для использования его аргумента newline (bpo-15204).Если вы используете
pyvenv
в сценарии и хотите, чтобы pip не был установлен, вы должны добавить--without-pip
к вызову команды.Поведение по умолчанию
json.dump()
иjson.dumps()
при указании отступа изменилось: он больше не создаёт пробелы после элемента, разделяющего запятые в конце строк. Это будет иметь значение только в том случае, если у вас есть тесты, выполняющие сравнения такого вывода с учётом пробелов (bpo-16333).doctest
теперь ищет доктесты в строках модуля расширения__doc__
, поэтому, если обнаружение теста доктест включает в себя модули расширения, содержащие похожие на доктесты строки, вы можете увидеть сбои тестов, которых вы никогда раньше не видели при выполнении тестов (bpo-3158).Модуль
collections.abc
был немного переработан в рамках улучшений запуска Python. Как следствие этого, при импортеcollections
больше не происходит автоматического импортаcollections.abc
. Если ваша программа зависела от (недокументированного) неявного импорта, вам нужно добавить явныйimport collections.abc
(bpo-20784).
Изменения в C API
PyEval_EvalFrameEx()
,PyObject_Repr()
иPyObject_Str()
, наряду с некоторыми другими внутренними C API, теперь включают отладочное утверждение, которое гарантирует, что они не используются в ситуациях, когда они могут молча отклонить активное в данный момент исключение. В тех случаях, когда отбрасывание активного исключения ожидается и желательно (например, потому что оно уже было локально сохранено сPyErr_Fetch()
или намеренно заменяется другим исключением), потребуется явный вызовPyErr_Clear()
, чтобы избежать срабатывания утверждения при вызове данных операции (прямо или косвенно) и работающие с версией Python, скомпилированной с включенными утверждениями.PyErr_SetImportError()
теперь устанавливаетTypeError
, когда его аргумент msg не установлен. Ранее возвращался толькоNULL
без набора исключений.- Результатом обратного вызова
PyOS_ReadlineFunctionPointer
теперь должна быть строка, выделеннаяPyMem_RawMalloc()
илиPyMem_RawRealloc()
, илиNULL
, если произошла ошибка, вместо строки, выделеннойPyMem_Malloc()
илиPyMem_Realloc()
(bpo-16742) PyThread_set_key_value()
теперь всегда устанавливайте значение. В Python 3.3 функция ничего не делала, если ключ уже существовал (если текущее значение не являетсяNULL
указателем).- Поле
f_tstate
(состояние потока) структурыPyFrameObject
было удалено, чтобы исправить ошибку: объяснение см. в bpo-14432.
Изменено в 3.4.3
PEP 476: Включение проверки сертификата по умолчанию для stdlib http-клиентов
http.client
и использующие его модули
urllib.request
и xmlrpc.client
, теперь будут проверять, что
сервер представляет подписанный CA сертификат в хранилище доверенных
сертификатов платформы и чье имя хоста соответствует запрашиваемому имени хоста
по умолчанию. Что значительно улучшает безопасность для многих приложений.
Для приложений, которым требуется старое поведение, они могут передавать альтернативный контекст:
import urllib.request
import ssl
# Отключает все проверки
context = ssl._create_unverified_context()
# Позволяет использовать специальный сертификат для хоста, который не требует
# быть в доверенном хранилище
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)