Содержание страницы
Что нового в Python 3.4¶What’s New In Python 3.4
- Автор
R. David Murray <rdmurray@bitdance.com> (Редактор)
Эта статья описывает новые возможности в Python 3.4 по сравнению с 3.3. Python 3.4 был выпущен 16 марта 2014 г. Для получения полной информации см. список изменений.
См. также
PEP 429 – График выпуска Python 3.4
Краткий обзор – Основные моменты выпуска¶Summary – Release Highlights
Новые синтаксические возможности:
В Python 3.4 не было добавлено новых синтаксических возможностей.
Другие новые возможности:
Вновь созданные файловые дескрипторы не наследуются (PEP 446).
параметр командной строки для изолированного режима (bpo-16499).
улучшения в обработке кодеков , которые не являются текстовыми кодировками (множество проблем).
Тип ModuleSpec для системы импорта (PEP 451). (Влияет на авторов импортёров.)
Формат
marshalбыл сделан более компактным и эффективным (bpo-16475).
Новые модули библиотеки:
asyncio: Новый временный API для асинхронного ввода-вывода (PEP 3156).pathlib: Объектно-ориентированные пути файловой системы (PEP 428).selectors: Высокоуровневая и эффективная мультиплексация ввода-вывода, построенная на примитивах модуляselect(часть PEP 3156).statistics: Базовая численно устойчивая библиотека статистики (PEP 450).
Значительно улучшенные библиотечные модули:
Обобщённые функции с одиночной диспетчеризацией в
functools(PEP 443).Новый
pickleпротокол 4 (PEP 3154).multiprocessingтеперь имеет опцию для избежания использования os.fork на Unix (bpo-8713).emailимеет новый подмодульcontentmanagerи новый подклассMessage(EmailMessage), которые упрощают обработку MIME (bpo-18891).Модули
inspectиpydocтеперь могут корректно выполнять интроспекцию гораздо более широкого множества вызываемых объектов, что улучшает вывод системыhelp()Python.API модуля
ipaddressобъявлен стабильным.
Улучшения в области безопасности:
Безопасный и взаимозаменяемый алгоритм хеширования (PEP 456).
Сделать вновь созданные файловые дескрипторы ненаследуемыми (PEP 446), чтобы избежать утечки файловых дескрипторов в дочерние процессы.
Новая опция командной строки для изолированного режима, (bpo-16499).
multiprocessingтеперь имеет опцию, позволяющую избежать использования os.fork в Unix. Методы spawn и forkserver более безопасны, поскольку не разделяют данные с дочерними процессами.multiprocessingдочерние процессы в Windows больше не наследуют все наследуемые дескрипторы родительского процесса, а только необходимые.Новая функция
hashlib.pbkdf2_hmac()предоставляет функцию формирования ключа на основе пароля PKCS#5 версии 2.Поддержка извлечения сертификатов из хранилища сертификатов системы Windows для
ssl.Поддержка SNI (Server Name Indication) на стороне сервера для
ssl.Класс
ssl.SSLContextполучил много улучшений.Все модули стандартной библиотеки, поддерживающие SSL, теперь поддерживают проверку сертификатов сервера, включая проверку имени узла (
ssl.match_hostname()) и списков отзыва сертификатов (CRL, см.ssl.SSLContext.load_verify_locations()).
Улучшения реализации CPython:
Используя PEP 442, в большинстве случаев глобальные переменные модуля больше не устанавливаются в None во время финализации (bpo-18214).
Читайте далее полный список изменений, влияющих на пользователей, включая множество других небольших улучшений, оптимизаций CPython, устаревших возможностей и потенциальных проблем при переносе.
Новые возможности¶New Features
PEP 453: Явная начальная загрузка PIP в установках Python¶PEP 453: Explicit Bootstrapping of PIP in Python Installations
Автоматическая установка pip по умолчанию¶Bootstrapping pip By Default
Новый модуль ensurepip (определённый в PEP 453) предоставляет стандартный
кроссплатформенный механизм для начальной загрузки установщика pip в установки
Python и виртуальные окружения. Версия pip, включённая
в Python 3.4.0, – pip 1.5.4, и в будущих выпусках 3.4.x
будет обновляться до последней версии pip, доступной
на момент создания кандидата в релиз.
По умолчанию команды pipX и pipX.Y будут установлены на всех
платформах (где X.Y обозначает версию установки Python),
вместе с пакетом Python pip и его зависимостями. В Windows и
в виртуальных окружениях на всех платформах также будет установлена
команда pip без указания версии. На других платформах
команда pip без указания версии обычно ссылается на отдельно установленную
версию Python 2.
Утилита командной строки pyvenv и модуль venv
используют модуль ensurepip, чтобы сделать pip
легкодоступным в виртуальных окружениях. При использовании утилиты командной строки
pip устанавливается по умолчанию, а при использовании модуля venv
API установка pip должна быть запрошена явно.
Для сборок CPython из исходного кода на системах POSIX
команды make install и make altinstall по умолчанию выполняют начальную загрузку pip.
Это поведение можно контролировать с помощью опций configure
и переопределять с помощью опций Makefile.
В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают
pip вместе с самим CPython (пользователи могут отказаться от его установки
в процессе установки). Пользователям Windows потребуется согласиться на автоматическое
изменение PATH, чтобы pip был доступен из командной строки
по умолчанию; в противном случае его можно запустить через Python launcher для Windows как py -m pip.
Как обсуждается в PEP, разработчики дистрибутивов могут принять решение не устанавливать эти команды по умолчанию, при условии, что при их вызове они предоставляют четкие и простые инструкции по их установке на этой платформе (обычно с помощью системного менеджера пакетов).
Примечание
Чтобы избежать конфликтов между параллельными установками Python 2 и Python 3,
только команды с указанием версии pip3 и pip3.4 загружаются по
умолчанию при прямом вызове ensurepip – опция --default-pip
необходима для дополнительного запроса команды pip без указания версии.
pyvenv и установщик Windows гарантируют, что команда pip без квалификатора
доступна в этих средах, а pip всегда можно
вызвать через ключ -m, а не напрямую, чтобы избежать неоднозначности в
системах с несколькими установками Python.
Изменения в документации¶Documentation Changes
В рамках этого изменения разделы Установка модулей Python и Распространение модулей Python документации были полностью переработаны в короткие вводные руководства и FAQ. Большая часть документации по упаковке теперь перенесена в Руководство пользователя по упаковке Python, поддерживаемое Python Packaging Authority, и в документацию отдельных проектов.
Однако, поскольку этот переход в настоящее время всё ещё не завершён, устаревшие версии этих руководств остаются доступными как Installing Python Modules (Legacy version) и Distributing Python Modules (Legacy version).
См. также
- PEP 453 – Явная автоматическая установка pip в дистрибутивах Python
PEP написан Donald Stufft и Nick Coghlan, реализован Donald Stufft, Nick Coghlan, Martin von Löwis и Ned Deily.
PEP 446: Вновь созданные файловые дескрипторы являются ненаследуемыми¶PEP 446: Newly Created File Descriptors Are Non-Inheritable
PEP 446 делает вновь созданные файловые дескрипторы ненаследуемыми. В целом, это поведение, которое нужно приложению: при запуске нового процесса наличие открытых файлов также открытыми в новом процессе может привести к всевозможным труднонаходимым ошибкам и потенциально к проблемам безопасности.
Однако бывают случаи, когда наследование желательно. Для поддержки этих случаев доступны следующие новые функции и методы:
См. также
- PEP 446 – Сделать вновь созданные файловые дескрипторы ненаследуемыми
PEP написан и реализован Victor Stinner.
Улучшения в работе с кодеками¶Improvements to Codec Handling
С момента своего появления модуль 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, а не ограничиваются кодировками Unicode (в 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
The above exception was the direct cause of the following exception:
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
The above exception was the direct cause of the following exception:
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'
Двоичные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в Двоичные преобразования и Текстовые преобразования.
(Автор: Nick Coghlan в bpo-7475, bpo-17827, bpo-17828 и bpo-19619.)
PEP 451: Тип ModuleSpec для системы импорта¶PEP 451: A ModuleSpec Type for the Import System
PEP 451 предоставляет инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (то есть спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько API, связанных с импортом. Это изменение также является ступенькой к нескольким будущим улучшениям импорта.
Изменения, видимые публично, полностью обратно совместимы. Более того, они должны быть незаметны для всех, кроме авторов импортеров. Ключевые методы finder и loader объявлены устаревшими, но продолжат работать. Новые импортеры должны использовать новые методы, описанные в PEP. Существующие импортеры следует обновить для реализации новых методов. См. раздел Устаревшее со списком методов, которые следует заменить, и их замен.
Прочие изменения языка ¶Other Language Changes
Некоторые небольшие изменения, внесённые в ядро языка Python:
База данных Unicode обновлена до версии UCD 6.3.
min()иmax()теперь принимают аргумент default, передаваемый только по ключу, который можно использовать для указания значения, возвращаемого, если итерируемый объект, который они вычисляют, не содержит элементов. (Автор: Julian Berman в bpo-18111.)Объекты модулей теперь
weakref'уемы.Атрибуты модуля
__file__(и связанные с ними значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением__main__.__file__, когда скрипт был выполнен напрямую с использованием относительного пути. (Автор: Brett Cannon в bpo-18416.)Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты как при кодировании, так и при декодировании, если только не используется обработчик ошибок
surrogatepass, за исключением декодера UTF-16 (который принимает допустимые суррогатные пары) и кодера UTF-16 (который создает их при кодировании символов вне BMP). (Авторы: Victor Stinner, Kang-Hao (Kenny) Lu и Serhiy Storchaka в bpo-12892.)Новый кодек для немецкого EBCDIC
cp273. (Авторы: Michael Bierenfeld и Andrew Kuchling в bpo-1097797.)Новый кодек украинского
cp1125. (Автор: Serhiy Storchaka в bpo-19668.)bytes.join() иbytearray.join() теперь принимают произвольные буферные объекты в качестве аргументов. (Автор: Antoine Pitrou в bpo-15958.)Конструктор
intтеперь принимает любой объект, имеющий метод__index__, для своего аргумента base. (Автор: Mark Dickinson в bpo-16772.)Объекты фреймов теперь имеют метод
clear(), который очищает все ссылки на локальные переменные из фрейма. (Автор: Antoine Pitrou в bpo-17934.)memoryviewтеперь зарегистрирован какSequenceи поддерживает встроенную функциюreversed(). (Авторы: Nick Coghlan и Claudiu Popa в bpo-18690 и bpo-19078.)Сигнатуры, сообщаемые
help(), были изменены и улучшены в ряде случаев в результате внедрения Argument Clinic и других изменений в модулиinspectиpydoc.__length_hint__()теперь является частью формальной спецификации языка (см. PEP 424). (Автор: Armin Ronacher в bpo-16148.)
Новые модули¶New Modules
asyncio¶
Новый модуль asyncio (определённый в PEP 3156) предоставляет стандартную подключаемую модель цикла событий для Python, обеспечивая надежную поддержку асинхронного ввода-вывода в стандартной библиотеке и упрощая взаимодействие других реализаций цикла событий со стандартной библиотекой и друг с другом.
Для Python 3.4 этот модуль считается временным API.
См. также
- PEP 3156 – Асинхронный ввод-вывод: перезагрузка: модуль «asyncio»
PEP написан, реализацией руководил Гвидо ван Россум.
ensurepip¶
Новый модуль ensurepip – это основная инфраструктура для реализации
PEP 453. В обычной ситуации конечным пользователям не нужно
взаимодействовать с этим модулем, но его можно использовать для ручной начальной загрузки
pip, если автоматическая начальная загрузка в установку или виртуальное
окружение была отклонена.
ensurepip включает в себя встроенную копию pip, актуальную на момент первого кандидата в релизы (release candidate) того выпуска 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 написан и реализован Antoine Pitrou.
selectors¶
Новый модуль selectors (созданный в рамках реализации PEP 3156)
позволяет высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на
примитивах модуля select.
statistics¶
Новый модуль statistics (определённый в PEP 450) предлагает некоторую основную
статистическую функциональность прямо в стандартной библиотеке. Этот модуль
поддерживает вычисление среднего, медианы, моды, дисперсии и стандартного
отклонения ряда данных.
См. также
- PEP 450 – Добавление модуля статистики в стандартную библиотеку
PEP написан и реализован Стивеном Д’Апрано
tracemalloc¶
Новый модуль tracemalloc (определённый в PEP 454) – это инструмент отладки для
отслеживания блоков памяти, выделенных Python. Он предоставляет следующую информацию:
Отслеживание места выделения объекта
Статистика по выделенным блокам памяти для каждого имени файла и номера строки: общий размер, количество и средний размер выделенных блоков памяти
Вычисление различий между двумя снимками для обнаружения утечек памяти
См. также
- PEP 454 – Добавление нового модуля tracemalloc для отслеживания выделений памяти Python
Автор PEP и разработчик: Victor Stinner
Улучшенные модули¶Improved Modules
abc ¶
Новая функция abc.get_cache_token() может использоваться для определения момента, когда нужно аннулировать
кэши, затронутые изменениями в графе объектов. (Вклад
Лукаша Ланги в bpo-16832.)
Новый класс ABC имеет ABCMeta в качестве своего метакласса.
Использование ABC в качестве базового класса даёт по сути тот же эффект, что и указание
metaclass=abc.ABCMeta, но проще в наборе и легче читается.
(Вклад Бруно Дюпюи в bpo-16049.)
aifc¶
Метод getparams() теперь возвращает namedtuple вместо обычного
кортежа. (Вклад Клаудиу Попа в bpo-17818.)
aifc.open() теперь поддерживает протокол управления контекстом: при использовании в блоке
with метод close() возвращённого
объекта будет вызван автоматически в конце блока. (Вклад
Сергия Сторчаки в bpo-16486.)
Методы writeframesraw() и writeframes()
теперь принимают любой объект, подобный bytes. (Вклад Сергия
Сторчаки в bpo-8311.)
argparse¶
Класс FileType теперь принимает аргументы encoding и
errors, которые передаются в open(). (Автор: Lucas Maystre в bpo-11175.)
audioop¶
audioop теперь поддерживает 24-битные семплы. (Автор: Serhiy Storchaka
в bpo-12866.)
Новая функция byteswap() преобразует big-endian семплы в
little-endian и обратно. (Автор: Serhiy Storchaka в
bpo-19641.)
Все функции audioop теперь принимают любой bytes-like object. Строки
не принимаются: раньше они не работали, теперь сразу вызывают ошибку.
(Автор: Serhiy Storchaka в bpo-16685.)
base64¶
Функции кодирования и декодирования в base64 теперь принимают любой
bytes-like object в тех случаях, когда раньше требовался экземпляр
bytes или bytearray. (Автор: Nick Coghlan в
bpo-17839.)
New functions a85encode(), a85decode(),
b85encode(), and b85decode() provide the ability to
encode and decode binary data from and to Ascii85 and the git/mercurial
Base85 formats, respectively. The a85 functions have options that can
be used to make them compatible with the variants of the Ascii85 encoding,
including the Adobe variant. (Contributed by Martin Morrison, the Mercurial
project, Serhiy Storchaka, and Antoine Pitrou in bpo-17618.)
collections¶
Метод ChainMap.new_child() теперь принимает аргумент m, задающий
дочернее отображение для добавления в цепочку. Это позволяет использовать
существующее отображение и/или пользовательский тип отображения в качестве
дочернего. (Автор: Vinay Sajip в bpo-16613.)
colorsys¶
Количество цифр в коэффициентах для преобразований RGB – YIQ было увеличено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов должно быть менее 1% и может лучше соответствовать результатам, полученным в других местах. (Авторы: Brian Landers и Serhiy Storchaka в bpo-14323.)
contextlib¶
Новый менеджер контекста contextlib.suppress помогает прояснить намерение кода,
который намеренно подавляет исключения из одного оператора.
(Авторы: Raymond Hettinger в bpo-15806 и Zero Piraeus
в bpo-19266.)
Новый менеджер контекста contextlib.redirect_stdout() упрощает для служебных скриптов
работу с негибкими API, которые записывают свой вывод в sys.stdout и не
предоставляют возможностей для его перенаправления. Используя менеджер
контекста, вывод sys.stdout можно перенаправить на любой другой поток или,
совместно с io.StringIO, в строку. Последнее может быть особенно полезно,
например, для захвата вывода функции, написанной для реализации
интерфейса командной строки. Рекомендуется использовать только в
служебных скриптах, поскольку это влияет на глобальное состояние
sys.stdout. (Автор: Raymond Hettinger в bpo-15805.)
Документация contextlib также была обновлена и теперь включает
обсуждение различий между одноразовыми, многократно
используемыми и реентерабельными менеджерами контекста.
dbm¶
Объекты dbm.open() теперь поддерживают протокол управления контекстом.
При использовании в операторе with метод close объекта базы данных
будет вызываться автоматически в конце блока. (Авторы: Claudiu Popa
и Nick Coghlan в 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(), который позволяет манипулировать traceback (то есть
print(Bytecode.from_traceback(tb).dis()) эквивалентно distb(tb)).
(Авторы: Nick Coghlan, Ryan Kelly и Thomas Kluyver в bpo-11816 и Claudiu Popa в bpo-17916.)
Новая функция stack_effect() вычисляет влияние на стек Python
заданного опкода и аргумента – информацию, которая иначе недоступна.
(Автор: Larry Hastings в bpo-19722.)
doctest¶
Новый флаг опции, FAIL_FAST, останавливает
выполнение теста сразу после обнаружения первого сбоя. (Авторы: R.
David Murray и Daniel Urban в bpo-16522.)
Интерфейс командной строки doctest теперь использует argparse,
и имеет две новые опции: -o и -f. -o позволяет
указывать опции doctest в командной строке,
а -f является сокращением для -o FAIL_FAST (по аналогии с подобной
опцией, поддерживаемой CLI unittest). (Автор: R. David Murray в
bpo-11390.)
doctest теперь будет находить doctests в строках __doc__
модулей расширения. (Автор: Zachary Ware в bpo-3158.)
email¶
as_string() теперь принимает аргумент policy для
переопределения политики по умолчанию сообщения при создании его строкового
представления. Это означает, что as_string теперь можно использовать в большем
числе случаев, вместо того чтобы создавать и использовать generator для
передачи параметров форматирования его методу flatten. (Автор: R. David Murray, bpo-18600.)
Добавлен новый метод as_bytes() для создания байтового
представления сообщения, аналогично тому, как as_string
создаёт строковое представление. Он не принимает аргумент maxheaderlen,
но принимает аргументы unixfrom и policy. Метод
Message __bytes__()
вызывает его, что означает, что bytes(mymsg) теперь будет давать интуитивно понятный
результат: объект bytes, содержащий полностью отформатированное сообщение. (Автор:
R. David Murray, bpo-18600.)
Сообщение Message.set_param() теперь принимает именованный аргумент replace.
При его указании соответствующий заголовок будет обновлён без изменения
его положения в списке заголовков. Для обратной совместимости по умолчанию
используется False. (Автор: R. David Murray, bpo-18891.)
Добавлены два новых подкласса Message
(EmailMessage и MIMEPart), а также новый подмодуль
contentmanager и новый атрибут policy
content_manager. Вся документация
находится в новом модуле, который добавляется как часть нового
временного API email. Эти классы предоставляют ряд новых методов, которые
значительно упрощают извлечение содержимого из сообщений электронной почты и вставку в них. Подробнее см. документацию contentmanager и
email: Примеры. Эти дополнения API завершают
основную часть работы, запланированной в рамках проекта email6. Данный
временный API планируется сделать окончательным в Python 3.5 (возможно, с несколькими
небольшими дополнениями в области обработки ошибок). (Автор: R. David
Murray, bpo-18891.)
filecmp¶
Новая функция clear_cache() позволяет очищать
кеш сравнения filecmp, который использует информацию os.stat() для
определения того, изменился ли файл с момента последнего сравнения. Это может быть использовано,
например, если файл мог быть изменён и проверен повторно за время меньшее, чем
разрешение поля времени модификации файла конкретной файловой системы.
(Автор: Mark Levitt, bpo-18149.)
Новый атрибут модуля DEFAULT_IGNORES предоставляет список
каталогов, используемых в качестве значения по умолчанию для параметра ignore функции
dircmp(). (Автор: Eli Bendersky, bpo-15442.)
functools¶
Новый дескриптор partialmethod() реализует частичное применение
аргументов для дескрипторов, так же как partial() предоставляет
для обычных вызываемых объектов. Новый дескриптор также упрощает заставление
произвольных вызываемых объектов (включая экземпляры partial())
вести себя как обычные методы экземпляра при включении в определение класса.
(Авторы: Alon Horev и Nick Coghlan, bpo-4331.)
Новый декоратор singledispatch() добавляет поддержку
однодиспетчерских обобщённых функций в стандартную библиотеку Python. В то время как
объектно-ориентированное программирование фокусируется на группировке нескольких операций над
общим набором данных в класс, обобщённая функция фокусируется на группировке
нескольких реализаций операции, что позволяет ей работать с
различными видами данных.
См. также
- PEP 443 – Однодиспетчерские обобщённые функции
PEP написан и реализован Лукашем Лангой.
total_ordering() теперь поддерживает возвращаемое значение
NotImplemented из базовой функции сравнения. (Автор: Katie Miller, bpo-10042.)
Чисто-питоновская версия функции partial() теперь находится в
стандартной библиотеке; в CPython она переопределена C-ускоренной версией, но она
доступна для других реализаций. (Автор: Brian Thorne, bpo-12428.)
gc¶
Новая функция get_stats() возвращает список из трёх словарей по поколениям,
содержащих статистику сборок мусора с момента запуска интерпретатора.
(Автор: Antoine Pitrou, bpo-16351.)
glob¶
Новая функция escape() позволяет экранировать специальные символы
в имени файла, чтобы они не участвовали в раскрытии шаблона, а
соответствовали буквально. (Автор: Serhiy Storchaka, bpo-8402.)
hashlib¶
Новая функция hashlib.pbkdf2_hmac() предоставляет
функцию формирования ключа на основе пароля PKCS#5 версии 2. (Автор: Christian
Heimes, bpo-18582.)
Атрибут name объектов хеша hashlib теперь является
официально поддерживаемым интерфейсом. Он всегда существовал в CPython's
hashlib (хотя не возвращал имена в нижнем регистре для всех поддерживаемых
хешей), но не был публичным интерфейсом, поэтому некоторые другие реализации Python
ранее его не поддерживали. (Автор: Jason R. Coombs, bpo-18532.)
hmac¶
hmac теперь принимает bytearray, а также bytes для аргумента key
функции new(), а параметр msg как для функции
new(), так и для метода update() теперь
принимает любой тип, поддерживаемый модулем hashlib. (Автор: Jonas Borgström, bpo-18240.)
Аргумент digestmod функции hmac.new() теперь может быть любым именем
дайджеста хеша, распознаваемым hashlib. Кроме того, текущее поведение, при
котором значение digestmod по умолчанию равно MD5, является устаревшим: в
будущей версии Python значения по умолчанию не будет. (Автор: Christian Heimes, bpo-17276.)
С добавлением атрибутов block_size и name
(и формальной документации атрибута digest_size)
модуль hmac теперь полностью соответствует API PEP 247.
(Автор: Christian Heimes, bpo-18775.)
html¶
Новая функция unescape() преобразует символьные ссылки HTML5 в
соответствующие символы Unicode. (Автор: Ezio Melotti, bpo-2927.)
HTMLParser принимает новый именованный аргумент
convert_charrefs, который при значении True автоматически преобразует все символьные
ссылки. Для обратной совместимости его значение по умолчанию равно False, но
оно изменится на True в будущей версии Python, поэтому рекомендуется
явно установить его и обновить свой код для использования этой новой возможности. (Автор:
Ezio Melotti, bpo-13633.)
Аргумент strict функции HTMLParser теперь устарел.
(Автор: Ezio Melotti, bpo-15114.)
http¶
send_error() теперь принимает необязательный дополнительный параметр explain, который можно использовать для предоставления расширенного описания ошибки, переопределяя жёстко заданное значение по умолчанию, если таковое имеется. Это расширенное описание ошибки будет отформатировано с использованием атрибута error_message_format и отправлено в качестве тела ответа об ошибке. (Предложено Karl Cow в bpo-12921.)
В http.server интерфейсе командной строки теперь есть
опция -b/--bind, которая заставляет сервер прослушивать определённый адрес.
(Автор: Malte Swart в bpo-17764.)
idlelib и IDLE¶idlelib and IDLE
Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для
импорта другими программами, он получает улучшения с каждым релизом. См.
Lib/idlelib/NEWS.txt для сводного списка изменений, начиная с 3.3.0,
а также изменений, внесённых в будущих выпусках 3.4.x. Этот файл также доступен
из диалога IDLE .
importlib¶
Абстрактный класс InspectLoader определяет новый метод,
source_to_code(), который принимает исходные
данные и путь и возвращает объект кода. Реализация по умолчанию
эквивалентна compile(data, path, 'exec', dont_inherit=True).
(Авторы: Eric Snow и Brett Cannon в bpo-15627.)
InspectLoader также теперь имеет реализацию по умолчанию
для метода get_code(). Однако
обычно желательно переопределить реализацию по умолчанию
по соображениям производительности. (Автор: Brett Cannon в bpo-18072.)
Функция reload() была перемещена из imp в
importlib в рамках устаревания модуля imp. (Автор:
Berker Peksag в bpo-18193.)
importlib.util теперь имеет атрибут MAGIC_NUMBER,
предоставляющий доступ к номеру версии байт-кода. Это заменяет
функцию get_magic() в устаревшем модуле imp.
(Автор: Brett Cannon в bpo-18192.)
Новые функции importlib.util cache_from_source()
и source_from_cache() заменяют одноимённые функции
в устаревшем модуле imp. (Автор: Brett Cannon в
bpo-18194.)
Загрузчик importlib NamespaceLoader теперь соответствует
абстрактному классу InspectLoader, что означает, что runpy и
python -m теперь можно использовать с пространственно-именованными пакетами. (Автор:
Brett Cannon в bpo-18058.)
importlib.util имеет новую функцию decode_source(),
которая декодирует исходный код из байтов с использованием универсальной обработки перевода строки. Это
полезно для реализации методов InspectLoader.get_source().
importlib.machinery.ExtensionFileLoader теперь имеет
метод get_filename(). Он был
случайно пропущен в первоначальной реализации. (Автор: Eric
Snow в bpo-19152.)
inspect¶
Модуль inspect теперь предлагает базовый интерфейс командной строки для быстрого отображения исходного кода и другой
информации о модулях, классах и функциях. (Авторы: Claudiu Popa
и Nick Coghlan в bpo-18626.)
unwrap() упрощает распутывание цепочек функций-обёрток,
созданных с помощью functools.wraps() (и любого другого API, который устанавливает
атрибут __wrapped__ на функцию-обёртку). (Авторы:
Daniel Urban, Aaron Iles и Nick Coghlan в bpo-13266.)
В рамках реализации нового модуля enum, модуль
inspect теперь имеет существенно лучшую поддержку пользовательских
методов __dir__ и динамических атрибутов классов, предоставляемых через
метаклассы. (Автор: Ethan Furman в bpo-18929 и
bpo-19030.)
getfullargspec() и getargspec()
теперь используют API signature(). Это позволяет им
поддерживать гораздо более широкий спектр вызываемых объектов, в том числе с
атрибутами __signature__, с метаданными, предоставленными argument clinic,
объектами functools.partial() и многим другим. Обратите внимание, что, в отличие от
signature(), эти функции по-прежнему игнорируют атрибуты __wrapped__
и сообщают уже связанный первый аргумент для связанных методов,
поэтому по-прежнему необходимо обновить ваш код, чтобы использовать
signature() напрямую, если эти функции желательны.
(Автор: Yury Selivanov в bpo-17481.)
signature() теперь поддерживает утиные типы функций CPython,
что добавляет поддержку функций, скомпилированных с Cython. (Авторы:
Stefan Behnel и Yury Selivanov в bpo-17159.)
ipaddress ¶
ipaddress был добавлен в стандартную библиотеку в Python 3.3 как
временный API. С выходом Python 3.4 этот статус
был снят: ipaddress теперь считается стабильным API, подпадающим
под обычные требования стандартной библиотеки по поддержанию обратной
совместимости.
Новое свойство is_global – True, если
адрес является глобально маршрутизируемым. (Автор: Peter Moody в
bpo-17400.)
logging¶
Класс TimedRotatingFileHandler имеет новый параметр atTime,
который можно использовать для указания времени суток, когда должен
произойти переворот. (Автор: Ronald Oussoren в bpo-9556.)
SocketHandler и
DatagramHandler теперь поддерживают доменные сокеты Unix (устанавливая
параметр port в None). (Автор: Vinay Sajip в коммите
ce46195b56a9.)
fileConfig() теперь принимает
экземпляр подкласса configparser.RawConfigParser для параметра fname.
Это упрощает использование файла конфигурации, когда конфигурация логирования
является лишь частью общей конфигурации приложения, или когда
приложение изменяет конфигурацию перед передачей её в
fileConfig(). (Автор: Vinay Sajip в
bpo-16110.)
Данные конфигурации логирования, полученные из сокета через
функцию logging.config.listen(), теперь могут быть проверены до
обработки путём передачи функции проверки в качестве аргумента нового
именованного аргумента verify. (Автор: Vinay Sajip в bpo-15452.)
marshal¶
Версия по умолчанию для marshal была повышена до 3. Код, реализующий
новую версию, восстанавливает поведение Python2, записывая только одну копию
интернированных строк и сохраняя интернирование при десериализации, и расширяет
эту способность «одна копия» на любой тип объекта (включая обработку рекурсивных
ссылок). Это уменьшает как размер файлов .pyc, так и объём
памяти, занимаемый модулем при загрузке из файла .pyc (или
.pyo). (Автор: Kristján Valur Jónsson в bpo-16475,
с дополнительными ускорениями от Antoine Pitrou в bpo-19219.)
mmap¶
Объекты mmap теперь можно weakref'овать. (Автор: Valerie Lambert, bpo-4885.)
multiprocessing¶
В Unix два новых метода запуска,
spawn и forkserver, были добавлены для запуска процессов с помощью
multiprocessing. Они делают смешивание процессов с потоками более
надёжным, а метод spawn соответствует семантике, которую multiprocessing всегда
использовал в Windows. Новая функция
get_all_start_methods() сообщает все методы запуска,
доступные на платформе, get_start_method() сообщает
текущий метод запуска, а set_start_method() устанавливает
метод запуска. (Автор: Richard Oudkerk в bpo-8713.)
У multiprocessing теперь появилось понятие context, определяющее, как создаются дочерние процессы. Новая функция get_context() возвращает контекст, использующий указанный метод запуска. Он имеет тот же API, что и сам модуль multiprocessing, поэтому его можно использовать для создания Pool и других объектов, работающих в этом контексте. Это позволяет фреймворку и приложению (или разным частям одного приложения) использовать multiprocessing, не мешая друг другу. (Автор: Richard Oudkerk, bpo-18999.)
За исключением старого метода запуска fork, дочерние процессы больше не наследуют от родителей ненужные дескрипторы/файловые дескрипторы (часть bpo-8713).
multiprocessing теперь полагается на runpy (реализующий флаг -m) для корректной инициализации __main__ в дочерних процессах при использовании методов запуска spawn или forkserver. Это устраняет некоторые пограничные случаи, когда сочетание multiprocessing, флага командной строки -m и явных относительных импортов могло приводить к трудноуловимым ошибкам в дочерних процессах. (Автор: Nick Coghlan, bpo-19946.)
operator¶
Новая функция length_hint() реализует спецификацию использования специального метода __length_hint__() в рамках формальной спецификации этой языковой возможности PEP 424. (Автор: Armin Ronacher, bpo-16148.)
Теперь доступна чисто-питоновская версия модуля operator для ознакомления и использования в альтернативных реализациях Python. (Автор: Zachary Ware, 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() теперь реализована через эту функцию. (Авторы: Trent Nelson, Yogesh Chaudhari, Victor Stinner и Charles-François Natali, bpo-17914.)
os.path.samestat() теперь доступен на платформе Windows (а реализация os.path.samefile() теперь общая для Unix и Windows). (Автор: Brian Curtin, bpo-11939.)
os.path.ismount() теперь распознаёт тома, смонтированные ниже корня диска в Windows. (Автор: Tim Golden, bpo-9035.)
os.open() поддерживает два новых флага на платформах, которые их предоставляют: O_PATH (неоткрытый файловый дескриптор) и O_TMPFILE (безымянный временный файл; на момент выхода 3.4.0 доступен только в Linux с ядром версии 3.11 или новее, имеющим заголовки uapi). (Авторы: Christian Heimes, bpo-18673, и Benjamin Peterson, соответственно.)
pdb¶
pdb была улучшена для более удобной работы с генераторами, yield и yield from. Это особенно полезно при отладке программ на основе asyncio. (Авторы: Andrew Svetlov и Xavier de Gaye, bpo-16596.)
Команда print была удалена из pdb, что восстановило доступ к функции Python print() из командной строки pdb. В Python2 в pdb не было команды print; вместо этого ввод print выполнял оператор print. В Python3 print ошибочно стала псевдонимом команды p. Однако p выводит repr своего аргумента, а не str, как это делала команда print в Python2. Более того, команда pdb print в Python3 затеняла функцию print, делая её недоступной в приглашении pdb. (Автор: Connor Osborn, bpo-18764.)
pickle¶
pickle теперь поддерживает (но по умолчанию не использует) новый протокол pickle – протокол 4. Этот новый протокол решает ряд проблем, существовавших в предыдущих протоколах, таких как сериализация вложенных классов, очень больших строк и контейнеров, а также классов, у которых метод __new__() принимает только именованные аргументы. Он также даёт некоторые улучшения производительности.
См. также
- PEP 3154 – протокол pickle 4
PEP написан Антуаном Питрой (Antoine Pitrou), реализован Александром Валсалотти (Alexandre Vassalotti).
plistlib¶
plistlib теперь имеет API, похожее на стандартный шаблон протоколов сериализации в stdlib, с новыми функциями load(), dump(), loads() и dumps(). (Старый API теперь устарел.) В дополнение к уже поддерживаемому формату XML plist (FMT_XML) теперь поддерживается также бинарный формат plist (FMT_BINARY). (Авторы: Ronald Oussoren и другие, bpo-14455.)
poplib¶
В poplib добавлено два новых метода: capa(), возвращающий список возможностей, объявленных POP-сервером, и stls(), переключающий сеанс POP3 в открытом тексте на зашифрованный сеанс POP3, если POP-сервер это поддерживает. (Автор: Lorenzo Catucci, bpo-4473.)
pprint¶
У класса PrettyPrinter модуля pprint и его функций pformat() и pprint() появилась новая опция compact, управляющая форматированием вывода. В настоящее время установка compact в True означает, что последовательности будут выводиться с максимально возможным количеством элементов, умещающихся в width на каждой (с отступом) строке. (Автор: Serhiy Storchaka, bpo-19132.)
Длинные строки теперь переносятся с использованием обычного синтаксиса продолжения строки в Python. (Автор: Antoine Pitrou, bpo-17150.)
pty¶
pty.spawn() теперь возвращает значение статуса от os.waitpid() для дочернего процесса вместо None. (Автор: Gregory P. Smith.)
pydoc¶
Модуль pydoc теперь напрямую основан на API интроспекции inspect.signature(), что позволяет ему предоставлять информацию о сигнатурах для более широкого круга вызываемых объектов. Это изменение также означает, что атрибуты __wrapped__ теперь учитываются при отображении справки. (Автор: Larry Hastings, bpo-19674.)
Модуль pydoc больше не отображает параметр self для уже связанных методов. Вместо этого он стремится всегда показывать точную текущую сигнатуру переданного вызываемого объекта. (Автор: Larry Hastings, bpo-20710.)
Помимо изменений, внесённых непосредственно в pydoc, обработка пользовательских методов __dir__ и различных видов поведения дескрипторов также была существенно улучшена благодаря базовым изменениям в модуле inspect.
Поскольку встроенная функция help() основана на pydoc, описанные выше изменения также влияют на поведение help().
re¶
Новая функция fullmatch() и метод regex.fullmatch() закрепляют шаблон на обоих концах строки для поиска соответствия. Это позволяет явно указать цель сопоставления, что предотвращает класс тонких ошибок, когда символы $ теряются при изменениях кода или добавлении альтернатив в существующее регулярное выражение. (Автор: Matthew Barnett в bpo-16203.)
repr объектов регулярных выражений теперь включает шаблон и флаги; repr объектов совпадений теперь включает начальную и конечную позиции, а также сопоставленную часть строки. (Авторы: Hugo Lopes Tavares и Serhiy Storchaka в bpo-13592 и bpo-17087.)
resource¶
Новая функция prlimit(), доступная на платформах Linux с версией ядра 2.6.36 или новее и glibc 2.13 или новее, позволяет запрашивать или устанавливать ограничения ресурсов для процессов, отличных от вызывающего. (Автор: Christian Heimes в bpo-16595.)
В Linux с версией ядра 2.6.36 или новее также появились некоторые новые константы, специфичные для Linux: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME и RLIMIT_SIGPENDING. (Автор: Christian Heimes в bpo-19324.)
В FreeBSD версии 9 и более новых появились некоторые новые константы, специфичные для FreeBSD: RLIMIT_SBSIZE, RLIMIT_SWAP и RLIMIT_NPTS. (Автор: Claudiu Popa в bpo-19343.)
select¶
Объекты epoll теперь поддерживают протокол управления контекстом. При использовании в инструкции with метод close() будет вызываться автоматически в конце блока. (Автор: Serhiy Storchaka в bpo-16488.)
Объекты devpoll теперь имеют методы fileno() и close(), а также новый атрибут closed. (Автор: Victor Stinner в bpo-18794.)
shelve¶
Экземпляры Shelf теперь можно использовать в инструкциях with; они будут автоматически закрыты в конце блока with. (Автор: Filip Gruszczyński в bpo-13896.)
shutil¶
copyfile() теперь вызывает конкретный подкласс Error, SameFileError, когда исходный и целевой файлы совпадают, что позволяет приложению предпринять соответствующие действия при этой конкретной ошибке. (Авторы: Atsuo Ishimoto и Hynek Schlawack в bpo-1492704.)
smtpd¶
Классы SMTPServer и SMTPChannel теперь принимают именованный аргумент map, который, если указан, передаётся в asynchat.async_chat в качестве его аргумента map. Это позволяет приложению не затрагивать глобальную карту сокетов. (Автор: Vinay Sajip в bpo-11959.)
smtplib¶
SMTPException теперь является подклассом OSError, что позволяет перехватывать как ошибки на уровне сокетов, так и ошибки на уровне протокола SMTP в одном операторе try/except в коде, которому важно лишь, произошла ошибка или нет. (Автор: Ned Jackson Lovely в bpo-2118.)
socket¶
Модуль socket теперь поддерживает протокол CAN_BCM на платформах, которые его поддерживают. (Автор: Brian Thorne в bpo-15359.)
Объекты сокетов получили новые методы для получения или установки их наследуемого флага, get_inheritable() и set_inheritable().
Константы socket.AF_* и socket.SOCK_* теперь являются значениями перечисления с использованием нового модуля enum. Это позволяет выводить осмысленные имена при отладке вместо целочисленных «магических чисел».
Константа AF_LINK теперь доступна на BSD и OSX.
inet_pton() и inet_ntop() теперь поддерживаются в Windows. (Автор: Atsuo Ishimoto в bpo-7171.)
sqlite3¶
Новый логический параметр uri функции connect() можно использовать для указания того, что параметр database является uri (см. документацию SQLite URI). (Автор: poq в bpo-13773.)
ssl¶
Добавлены PROTOCOL_TLSv1_1 и PROTOCOL_TLSv1_2 (поддержка TLSv1.1 и TLSv1.2); поддержка этих протоколов доступна только если Python собран с OpenSSL 1.0.1 или новее. (Авторы: Michele Orrù и Antoine Pitrou в bpo-16692.)
Новая функция create_default_context() предоставляет стандартный способ получения SSLContext, настройки которого предназначены для достижения разумного баланса между совместимостью и безопасностью. Эти настройки более строгие, чем значения по умолчанию, предоставляемые конструктором SSLContext, и могут быть изменены в будущем без предварительного устаревания, если изменится современная практика безопасности. Новая рекомендуемая практика использования библиотек stdlib, поддерживающих SSL, заключается в использовании create_default_context() для получения объекта SSLContext, его модификации при необходимости и последующей передаче в качестве аргумента context соответствующего API stdlib. (Автор: Christian Heimes в bpo-19689.)
Метод load_verify_locations() класса SSLContext принимает новый необязательный аргумент cadata, который можно использовать для передачи сертификатов в кодировке PEM или DER напрямую в виде строк или байтов соответственно. (Автор: Christian Heimes в bpo-18138.)
Новая функция get_default_verify_paths() возвращает именованный кортеж с путями и переменными окружения, которые метод set_default_verify_paths() использует для установки стандартных cafile и capath в OpenSSL. Это может помочь при отладке проблем с проверкой по умолчанию. (Автор: Christian Heimes в bpo-18143.)
У SSLContext появился новый метод cert_store_stats(), который возвращает количество загруженных X.509 сертификатов, X.509 CA сертификатов и списков отзыва сертификатов (crl), а также метод get_ca_certs(), возвращающий список загруженных CA сертификатов. (Автор: Christian Heimes в bpo-18147.)
Если доступен OpenSSL 0.9.8 или новее, у SSLContext появился новый атрибут verify_flags, который можно использовать для управления процессом проверки сертификатов, установив его в комбинацию новых констант VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN или VERIFY_X509_STRICT. По умолчанию OpenSSL не выполняет проверку CRL. (Автор: Christien Heimes в bpo-8813.)
Новый метод SSLContext load_default_certs() загружает набор сертификатов удостоверяющих центров (CA) по умолчанию из стандартных расположений, которые различаются в зависимости от платформы. Его можно использовать для загрузки как сертификатов аутентификации веб-сервера TLS (purpose=SERVER_AUTH) для проверки сервера клиентом, так и сертификатов для проверки клиентских сертификатов сервером (purpose=CLIENT_AUTH). (Автор: Christian Heimes в bpo-19292.)
Две новые функции, доступные только в Windows, enum_certificates() и enum_crls(), предоставляют возможность извлекать сертификаты, информацию о сертификатах и списки отзыва (CRL) из хранилища сертификатов Windows. (Автор: Christian Heimes в bpo-17134.)
Поддержка SNI (Server Name Indication) на стороне сервера с помощью нового метода ssl.SSLContext.set_servername_callback(). (Автор: Daniel Black в bpo-8109.)
Словарь, возвращаемый SSLSocket.getpeercert(), содержит дополнительные элементы расширения X509v3: crlDistributionPoints, calIssuers и OCSP URI. (Автор: Christian Heimes в bpo-18379.)
stat¶
Модуль stat теперь основан на C-реализации в _stat. Реализация на C необходима, поскольку большинство значений не стандартизированы и зависят от платформы. (Автор: Christian Heimes в bpo-11016.)
Модуль поддерживает новые флаги ST_MODE, S_IFDOOR, S_IFPORT и S_IFWHT. (Автор: Christian Hiemes в bpo-11016.)
struct¶
Новая функция iter_unpack и новый метод struct.Struct.iter_unpack() для скомпилированных форматов обеспечивают потоковую распаковку буфера, содержащего повторяющиеся экземпляры заданного формата данных. (Автор: Antoine Pitrou в bpo-17804.)
подпроцесс¶subprocess
check_output() теперь принимает аргумент input, который можно использовать для предоставления содержимого stdin для запускаемой команды. (Автор: Zack Weinberg в bpo-16624.)
getstatus() и getstatusoutput() теперь работают в Windows. Это изменение было случайно внесено в версии 3.3.4. (Автор: Tim Golden в bpo-10197.)
sunau¶
Метод getparams() теперь возвращает именованный кортеж (namedtuple) вместо обычного кортежа. (Автор: Claudiu Popa в bpo-18901.)
sunau.open() теперь поддерживает протокол контекстного менеджера: при использовании в блоке with метод close возвращаемого объекта будет вызван автоматически в конце блока. (Автор: Serhiy Storchaka в bpo-18878.)
AU_write.setsampwidth() теперь поддерживает 24-битные сэмплы, что добавляет поддержку записи 24-битных сэмплов с помощью этого модуля. (Автор: Serhiy Storchaka в bpo-19261.)
Методы writeframesraw() и
writeframes() теперь принимают любой байтоподобный
объект. (Автор: Serhiy Storchaka в bpo-8311.)
sys¶
Новая функция sys.getallocatedblocks() возвращает текущее количество блоков, выделенных интерпретатором. (В CPython с настройкой по умолчанию --with-pymalloc это выделения, сделанные через API PyObject_Malloc().) Это может быть полезно для отслеживания утечек памяти, особенно при автоматизации с помощью тестового набора. (Автор: Antoine Pitrou в bpo-13390.)
Когда интерпретатор Python запускается в интерактивном режиме, он проверяет наличие атрибута __interactivehook__ в модуле sys. Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка производится после чтения файла PYTHONSTARTUP, поэтому его можно установить там. Модуль site устанавливает его в функцию, которая включает автодополнение по табуляции и сохранение истории (в ~/.python-history), если платформа поддерживает readline. Если такое (новое) поведение нежелательно, его можно переопределить в PYTHONSTARTUP, sitecustomize или usercustomize, удалив этот атрибут из sys (или установив его в другой вызываемый объект). (Авторы: Éric Araujo и Antoine Pitrou в bpo-5845.)
tarfile¶
Модуль tarfile теперь поддерживает простой интерфейс командной строки при вызове как скрипт напрямую или через -m. Это можно использовать для создания и извлечения tar-архивов. (Автор: Berker Peksag в bpo-13477.)
textwrap¶
Класс TextWrapper имеет два новых атрибута/аргумента конструктора: max_lines, который ограничивает количество строк в выводе, и placeholder, строка, которая появится в конце вывода, если он был обрезан из-за max_lines. На основе этих возможностей новая удобная функция shorten() сжимает все пробелы во входных данных в одиночные пробелы и создает одну строку заданной width, заканчивающуюся placeholder (по умолчанию [...]). (Авторы: Antoine Pitrou и Serhiy Storchaka в bpo-18585 и bpo-18725.)
threading¶
Объект Thread, представляющий главный поток, можно получить с помощью новой функции main_thread(). В нормальных условиях это будет поток, с которого был запущен интерпретатор Python. (Автор: Andrew Svetlov в bpo-18882.)
traceback¶
Новая функция traceback.clear_frames() принимает объект traceback и очищает локальные переменные во всех фреймах, на которые он ссылается, уменьшая потребление памяти. (Автор: Andrew Kuchling в bpo-1565525.)
types¶
Новый дескриптор DynamicClassAttribute() предоставляет способ определить атрибут, который ведет себя нормально при доступе через экземпляр объекта, но перенаправляется на класс __getattr__ при доступе через класс. Это позволяет иметь активные свойства на классе и виртуальные атрибуты на классе с тем же именем (см. Enum для примера). (Автор: Ethan Furman в bpo-19030.)
urllib¶
urllib.request теперь поддерживает data: URL-адреса через
класс DataHandler. (Автор: Mathias Panzenböck
в bpo-16423.)
HTTP-метод, который будет использоваться классом Request,
теперь можно указать, задав атрибут класса method
в подклассе. (Автор: Jason R Coombs в
bpo-18978.)
Request теперь можно переиспользовать: если изменить атрибуты full_url или data, все соответствующие внутренние свойства обновятся. Это означает, например, что теперь можно использовать один и тот же объект Request в нескольких вызовах OpenerDirector.open() с разными аргументами data или изменить url объекта Request вместо повторного вычисления с нуля. Также появился новый метод remove_header(), который можно использовать для удаления заголовков из Request. (Авторы: Алексей Качаев в bpo-16464, Daniel Wozniak в bpo-17485, Damien Brecht и Senthil Kumaran в bpo-17272).
Объекты HTTPError теперь имеют атрибут
headers, который предоставляет доступ к
заголовкам HTTP-ответа, связанным с ошибкой. (Автор:
Berker Peksag в 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)
приведёт к шести подтестам, каждый из которых идентифицируется в подробном выводе unittest
с пометкой, состоящей из имени переменной i и конкретного значения для
этой переменной (i=0, i=1 и т.д.). Полную версию этого примера см. в Различие итераций тестов с помощью подтестов. (Автор: Antoine Pitrou в bpo-16997.)
unittest.main() теперь принимает итерируемый объект с именами тестов для
defaultTest, тогда как раньше он принимал только одно имя теста в виде строки. (Автор: Jyrki Pulliainen в bpo-15132.)
Если SkipTest возбуждается во время обнаружения тестов (то есть на уровне модуля в тестовом файле), теперь это сообщается как пропуск, а не как ошибка. (Автор: Zach Ware в bpo-16935.)
discover() теперь сортирует обнаруженные файлы для обеспечения
согласованного порядка тестов. (Авторы: Martin Melin и Jeff Ramnani в
bpo-16709.)
TestSuite теперь удаляет ссылки на тесты сразу после выполнения теста,
если тест успешен. В интерпретаторах Python, которые
поддерживают сборку мусора, это позволяет собирать тесты, если
ничто другое не удерживает ссылку на тест. Это поведение можно переопределить,
создав подкласс TestSuite, который определяет пользовательский
метод _removeTestAtIndex. (Авторы: Tom Wardill, Matt
McClure и Andrew Svetlov в bpo-11798.)
Новый контекстный менеджер для тестовых утверждений, assertLogs(),
гарантирует, что заданный блок кода выдаёт сообщение журнала с использованием
модуля logging. По умолчанию сообщение может поступать от любого регистратора и
иметь приоритет INFO или выше, но можно указать как имя регистратора, так и
альтернативный минимальный уровень журналирования. Объект, возвращаемый
контекстным менеджером, можно запросить для получения LogRecords и/или
отформатированных сообщений, которые были записаны. (Автор: Antoine Pitrou в
bpo-18937.)
Обнаружение тестов теперь работает с пакетами пространств имён (Автор: Claudiu Popa в bpo-17457.)
Объекты unittest.mock теперь анализируют сигнатуры своих спецификаций при
сопоставлении вызовов, что означает, что аргумент теперь может быть сопоставлен как по позиции,
так и по имени, а не только по позиции. (Автор: Antoine Pitrou в
bpo-17015.)
Объекты mock_open() теперь имеют методы readline и readlines.
(Автор: Toshio Kuratomi в bpo-17467.)
venv¶
venv теперь включает скрипты активации для оболочек csh и fish.
(Автор: Andrew Svetlov в bpo-15417.)
EnvBuilder и удобная функция create()
принимают новый именованный аргумент with_pip, который по умолчанию равен False,
управляющий тем, обеспечивает ли EnvBuilder установку pip
в виртуальном окружении. (Автор: Nick Coghlan в
bpo-19552 в рамках реализации PEP 453.)
wave¶
Метод getparams() теперь возвращает namedtuple, а не обычный кортеж.
(Автор: Claudiu Popa в bpo-17487.)
wave.open() теперь поддерживает протокол управления контекстом. (Автор:
Claudiu Popa в bpo-17616.)
wave теперь может записывать вывод в файлы без возможности позиционирования. (Авторы: David Jones, Guilherme Polo и Serhiy
Storchaka в bpo-5202.)
Методы writeframesraw() и
writeframes() теперь принимают любой байтоподобный
объект. (Автор: Serhiy Storchaka в bpo-8311.)
weakref¶
Новый класс WeakMethod имитирует слабые ссылки на привязанные
методы. (Автор: Antoine Pitrou в bpo-14631.)
Новый класс finalize позволяет зарегистрировать колбэк,
который будет вызван при сборке мусора объекта, без необходимости
тщательно управлять жизненным циклом самой слабой ссылки. (Автор:
Richard Oudkerk в bpo-15528.)
Колбэк, если он есть, связанный с ref, теперь
доступен через атрибут __callback__. (Автор:
Mark Dickinson в bpo-17643.)
xml.etree¶
Новый анализатор, XMLPullParser, позволяет
неблокирующим приложениям разбирать XML-документы. Пример можно
увидеть в Pull API для неблокирующего разбора. (Автор: Antoine
Pitrou в bpo-17741.)
Функции xml.etree.ElementTree tostring() и
tostringlist(), а также метод
ElementTree
write(), теперь имеют
short_empty_elements параметр, доступный только по ключевому слову,
обеспечивающий контроль над тем, записываются ли элементы без содержимого в
сокращённой (<tag />) или развёрнутой (<tag></tag>) форме. (Авторы:
Ariel Poliak и Serhiy Storchaka в bpo-14377.)
zipfile¶
У метода writepy() класса
PyZipFile появилась новая опция filterfunc, которая позволяет управлять тем, какие каталоги и файлы добавляются в архив. Например,
с её помощью можно исключить тестовые файлы из архива.
(Автор – Christian Tismer в bpo-19274.)
Параметр allowZip64 для ZipFile и
PyZipfile теперь по умолчанию True. (Автор –
William Mallard в bpo-17201.)
Изменения в реализации CPython¶CPython Implementation Changes
PEP 445: Настройка распределителей памяти CPython¶PEP 445: Customization of CPython Memory Allocators
PEP 445 добавляет новые интерфейсы уровня C для настройки распределения памяти в интерпретаторе CPython.
См. также
- PEP 445 – Добавление новых API для настройки распределителей памяти Python
PEP написан и реализован Victor Stinner.
PEP 442: Безопасная финализация объектов¶PEP 442: Safe Object Finalization
PEP 442 устраняет текущие ограничения и особенности финализации объектов
в CPython. Благодаря ему объекты с методами __del__(), а также
генераторы с предложениями finally могут быть финализированы, когда они являются
частью цикла ссылок.
В рамках этого изменения глобальные переменные модуля больше не принудительно устанавливаются в
None при завершении работы интерпретатора в большинстве случаев, вместо этого полагаясь
на нормальную работу циклического сборщика мусора. Это позволяет избежать целого
класса ошибок времени завершения работы интерпретатора, обычно связанных с
методами __del__, которые преследовали Python с момента появления циклического GC.
См. также
- PEP 442 – Безопасная финализация объектов
PEP написан и реализован Antoine Pitrou.
PEP 456: Безопасный и взаимозаменяемый хэш-алгоритм¶PEP 456: Secure and Interchangeable Hash Algorithm
PEP 456 продолжает предыдущую работу по исправлению безопасности хэш-алгоритма Python для устранения определенных DOS-атак, которым могут подвергаться публичные API, основанные на поиске в словаре. (См. bpo-14621 о начале текущего цикла улучшений.) PEP унифицирует хэш-код CPython, чтобы упростить для разработчиков дистрибутивов замену хэш-алгоритма, и переключает реализацию Python по умолчанию на SipHash на платформах, имеющих 64-битный тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV незначительны.
PEP добавляет дополнительные поля в структурную последовательность sys.hash_info, чтобы описать алгоритм хеширования, используемый текущей исполняемой программой. В остальном PEP не вносит изменений в существующие API CPython.
PEP 436: Argument Clinic¶
«Argument Clinic» (PEP 436) теперь является частью процесса сборки CPython и может использоваться для упрощения определения и поддержания точных сигнатур для встроенных функций и модулей расширения стандартной библиотеки, реализованных на C.
Некоторые модули расширения стандартной библиотеки были преобразованы для использования Argument
Clinic в Python 3.4, и pydoc и inspect были соответствующим образом обновлены.
Ожидается, что метаданные сигнатур для программного самоанализа будут добавлены к дополнительным вызываемым объектам, реализованным на C, в рамках поддерживающих выпусков Python 3.4.
Примечание
PEP Argument Clinic не полностью соответствует текущему состоянию реализации. В данном случае это было признано приемлемым менеджером выпуска и основной командой разработчиков, поскольку Argument Clinic не будет предоставлен как публичный API для стороннего использования в Python 3.4.
См. также
- PEP 436 – DSL Argument Clinic
PEP написан и реализован Larry Hastings.
Прочие изменения сборки и C API¶Other Build and C API Changes
Новая функция
PyType_GetSlot()добавлена в стабильный ABI, позволяя извлекать указатели на функции из именованных слотов типов при использовании ограниченного API. (Автор – Martin von Löwis в bpo-17162.)Новый
Py_SetStandardStreamEncoding()API предварительной инициализации позволяет приложениям, встраивающим интерпретатор CPython, надежно принудительно устанавливать конкретную кодировку и обработчик ошибок для стандартных потоков. (Авторы – Bastien Montagne и Nick Coghlan в bpo-16129.)Большинство C API Python, которые не изменяют строковые аргументы, теперь правильно помечены как принимающие
const char *, а неchar *. (Автор – Serhiy Storchaka в bpo-1772673.)Новую оболочку версию
python-configможно использовать, даже если интерпретатор Python недоступен (например, в сценариях кросс-компиляции).PyUnicode_FromFormat()теперь поддерживает спецификации ширины и точности для%s,%A,%U,%V,%Sи%R. (Авторы – Ysj Ray и Victor Stinner в bpo-7330.)Новая функция
PyStructSequence_InitType2()дополняет существующую функциюPyStructSequence_InitType(). Разница в том, что она возвращает0при успехе и-1при неудаче.Исходный код CPython теперь можно компилировать с использованием функций проверки корректности адресов последних версий GCC и clang: ложные срабатывания в распределителе малых объектов были устранены. (Автор – Dhiru Kholia в bpo-18596.)
Сборка для Windows теперь использует Address Space Layout Randomization и Data Execution Prevention. (Автор – Christian Heimes в bpo-16632.)
Новая функция
PyObject_LengthHint()является эквивалентом C API дляoperator.length_hint(). (Автор – Armin Ronacher в bpo-16148.)
Другие улучшения¶Other Improvements
Команда python получила новую опцию,
-I, которая запускает её в «изолированном режиме». Это означает, чтоsys.pathне содержит ни каталог скрипта, ниsite-packagesкаталог пользователя, а все переменные окруженияPYTHON*игнорируются (это подразумевает как-s, так и-E). Другие ограничения могут быть добавлены в будущем, с целью изолировать выполнение скрипта от пользовательского окружения. Это подходит, например, когда Python используется для запуска системного скрипта. На большинстве систем POSIX эту опцию можно и нужно использовать в#!строке системных скриптов. (Предложено Кристианом Хаймсом в bpo-16499.)Автодополнение по табуляции теперь включено по умолчанию в интерактивном интерпретаторе на системах, поддерживающих
readline. История также включена по умолчанию и записывается (и читается) из файла~/.python-history. (Авторы: Antoine Pitrou и Éric Araujo, bpo-5845.)Запуск интерпретатора Python с
--versionтеперь выводит версию в стандартный вывод вместо стандартного вывода ошибок (bpo-18338). Аналогичные изменения были внесены вargparse(bpo-18920) и другие модули, которые имеют возможности вызова в стиле скриптов (bpo-18922).Установщик CPython для Windows теперь добавляет
.pyв переменнуюPATHEXTпри регистрации расширений, что позволяет пользователям запускать скрипт Python из командной строки Windows, просто введя его имя без расширения.py. (Автор: Paul Moore, bpo-18569.)Новая цель
makecoverage-report соберёт python, запустит тестовый набор и сгенерирует HTML-отчёт о покрытии для кода на C с помощьюgcovи lcov.Опция
-Rдля набора регрессионных тестов python теперь также проверяет утечки выделения памяти с помощьюsys.getallocatedblocks(). (Автор: Antoine Pitrou, bpo-13390.)python -mтеперь работает с пространственно-именованными пакетами.Модуль
statтеперь реализован на C, что означает, что он получает значения своих констант из C-заголовочных файлов, а не имеет эти значения жёстко прописанными в модуле Python, как было раньше.Загрузка нескольких модулей Python из одного OS-модуля (
.so,.dll) теперь работает корректно (ранее она молча возвращала первый модуль Python в файле). (Автор: Václav Šmilauer, bpo-16421.)Добавлен новый байт-код,
LOAD_CLASSDEREF, для исправления ошибки в загрузке свободных переменных в телах классов, которая могла быть вызвана определёнными использованиями __prepare__. (Автор: Benjamin Peterson, bpo-17853.)Ряд сбоев, связанных с MemoryError, были выявлены и исправлены Виктором Стиннером с помощью его инструмента
pyfailmalloc, основанного на PEP 445 (bpo-18408, bpo-18520).Команда
pyvenvтеперь принимает опцию--copiesдля использования копий вместо символьных ссылок даже в системах, где символьные ссылки используются по умолчанию. (Автор: Vinay Sajip, bpo-18807.)Команда
pyvenvтакже принимает опцию--without-pipдля подавления автоматической начальной загрузки pip в виртуальное окружение. (Автор: Nick Coghlan, bpo-19552 в рамках реализации PEP 453.)Имя кодировки теперь необязательно в значении переменной окружения
PYTHONIOENCODING. Это позволяет задать только обработчик ошибок, не меняя кодировку по умолчанию. (Автор: Serhiy Storchaka, bpo-18818.)Функции
openмодулейbz2,lzmaиgzipтеперь поддерживают режимx(исключительное создание). (Авторы: Tim Heaney и Vajrasky Kok, bpo-19201, bpo-19222 и bpo-19223.)
Значительные оптимизации¶Significant Optimizations
Декодер UTF-32 теперь работает в 3-4 раза быстрее. (Автор: Serhiy Storchaka, bpo-14625.)
Стоимость коллизий хэшей для множеств теперь снижена. Каждый проброс хэш-таблицы теперь проверяет серию последовательных соседних пар ключ/хэш, прежде чем продолжить случайные пробросы по хэш-таблице. Это использует локальность кэша для уменьшения затрат на разрешение коллизий. Схему разрешения коллизий можно описать как гибрид линейного зондирования и открытой адресации. Количество дополнительных линейных зондирований по умолчанию равно девяти. Это можно изменить во время компиляции, определив LINEAR_PROBES любым значением. Установите LINEAR_PROBES=0, чтобы полностью отключить линейное зондирование. (Автор: Raymond Hettinger, bpo-18771.)
Интерпретатор запускается примерно на 30% быстрее. К ускорению привели несколько мер. Интерпретатор загружает меньше модулей при запуске, например, модули
re,collectionsиlocaleи их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен для более быстрой загрузки скомпилированного кода Python. (Авторы: Antoine Pitrou, Christian Heimes и Victor Stinner, bpo-19219, bpo-19218, bpo-19209, bpo-19205 и bpo-9548.)bz2.BZ2Fileтеперь не уступает или превосходит версию Python2 по скорости в большинстве случаев.lzma.LZMAFileтакже была оптимизирована. (Авторы: Serhiy Storchaka и Nadeem Vawda, bpo-16034.)random.getrandbits()работает на 20–40% быстрее для малых целых чисел (наиболее распространённый случай использования). (Автор: Serhiy Storchaka, bpo-16674.)Благодаря использованию нового формата хранения строк, сериализация с помощью pickle теперь значительно быстрее. (Авторы: Victor Stinner и Antoine Pitrou, bpo-15596.)
Решена проблема производительности в
io.FileIO.readall(). Это особенно затрагивает Windows и значительно ускоряет передачу больших объёмов данных черезsubprocess. (Автор: Richard Oudkerk, bpo-15758.)html.escape()теперь работает в 10 раз быстрее. (Автор: Matt Bryant, bpo-18020.)В Windows теперь используется нативный
VirtualAllocвместо CRTmallocвobmalloc. Искусственные тесты показывают экономию памяти около 3%.os.urandom()теперь использует лениво открываемый постоянный файловый дескриптор, чтобы избежать использования множества файловых дескрипторов при параллельном запуске из нескольких потоков. (Предложено Антуаном Питру в bpo-18756.)
Устарело¶Deprecated
В этом разделе описаны различные API и другие возможности, которые были объявлены устаревшими
в Python 3.4 и будут удалены в Python 3.5 или более поздних версиях. В большинстве (но не
во всех) случаев использование устаревших API будет приводить к DeprecationWarning
при запуске интерпретатора с включёнными предупреждениями об устаревании (например, при
использовании -Wd).
Устаревшее в Python API¶Deprecations in the Python API
Как упоминалось в PEP 451: A ModuleSpec Type for the Import System, ряд методов и функций
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(); все методыxxxLoaderABCload_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.Ключ
SOвsysconfigобъявлен устаревшим; вместо него следует использоватьEXT_SUFFIX.Режим
U, принимаемый различными функциямиopen, объявлен устаревшим. В Python 3 он не выполняет ничего полезного и должен быть заменён на соответствующие вызовыio.TextIOWrapper(при необходимости) и его аргумент newline.Аргумент parser функции
xml.etree.ElementTree.iterparse()объявлен устаревшим, равно как и аргумент html функцииXMLParser(). Для подготовки к удалению последнего все аргументыXMLParserследует передавать по ключу.
Устаревшие возможности¶Deprecated Features
Удалено¶Removed
Операционные системы, поддержка которых прекращена¶Operating Systems No Longer Supported
Поддержка следующих операционных систем удалена из исходного кода и средств сборки:
Удаление API и функций¶API and Feature Removals
Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:
Не поддерживаемые каталоги
Misc/TextMateиMisc/vimбыли удалены (см. devguide с предложениями по замене).Макрос
SOmakefile удалён (он был заменён макросамиSHLIB_SUFFIXиEXT_SUFFIX) (bpo-16754).Поле
PyThreadState.tick_counterбыло удалено; его значение было бессмысленным начиная с Python 3.2, когда была введена «новая GIL» (bpo-19199).Функции
PyLoaderиPyPycLoaderудалены изimportlib. (Автор: Taras Lyapun, bpo-15641.)Аргумент strict функций
HTTPConnectionиHTTPSConnectionбыл удалён. «Простые ответы» (Simple Responses) в стиле 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. (Автор: Dan Riti, 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).
Очистка кода¶Code Cleanups
Неиспользуемый и задокументированный внутренний класс
Scannerудалён из модуляpydoc.Приватный и фактически неиспользуемый модуль
_gestaltудалён вместе с приватными функциямиplatform_mac_ver_lookup,_mac_ver_gstaltи_bcd2str, которые могли быть вызваны только на сильно повреждённых системах OSX (см. bpo-18393).Труднокодированные копии некоторых констант
stat, которые были включены в пространство имён модуляtarfile, удалены.
Перенос на Python 3.4¶Porting to Python 3.4
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в поведении команды ‘python’¶Changes in ‘python’ Command Behavior
В оболочке posix установка переменной окружения
PATHв пустое значение эквивалентна её отсутствию. Однако установкаPYTHONPATHв пустое значение не была эквивалентна её отсутствию: установкаPYTHONPATHв пустое значение была эквивалентна установке., что приводило к путанице при аналогии с тем, как работаетPATH. Теперь поведение соответствует соглашению posix дляPATH.Вывод [X refs, Y blocks] отладочной (
--with-pydebug) сборки интерпретатора CPython теперь по умолчанию отключён. Его можно снова включить с помощью опции-X showrefcount. (Вклад Ezio Melotti в bpo-17323.)Команда python и большинство скриптов stdlib (а также
argparse) теперь выводят информацию--versionвstdoutвместоstderr(список задач см. в Other Improvements выше).
Изменения в Python API¶Changes in the Python API
Абстрактные базовые классы (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__, когда скрипт был выполнен напрямую с относительным путём). (Вклад Brett Cannon в bpo-18416). указан в командной строке) (bpo-18416).Удаление аргумента strict у
HTTPConnectionиHTTPSConnectionизменяет значение остальных аргументов, если вы указываете их позиционно, а не по ключевым словам. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать любые дополнительные аргументы через ключевые слова.Строки между операторами
from __future__ import ...теперь всегда возбуждаютSyntaxError. Ранее, если не было начальной docstring, промежуточная строка иногда игнорировалась. Это приводит 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. (Вклад Serhiy Storchaka в 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).Значения по умолчанию для аргументов, передаваемых только по ключевым словам, теперь вычисляются после значений по умолчанию для обычных keyword-аргументов, а не до. Надеемся, никто не написал код, зависящий от предыдущего ошибочного поведения (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для разбора командной строки. Некоторые некорректные формы команд, которые ранее работали, больше не допускаются; теоретически это не должно вызывать проблем с обратной совместимостью, поскольку запрещённые формы команд не имели смысла и вряд ли используются.Функции
re.split(),re.findall()иre.sub(), а также методыgroup()иgroups()объектовmatchтеперь всегда возвращают объект bytes, если строка, которую нужно сопоставить, является байтоподобным объектом. Ранее тип возвращаемого значения соответствовал типу входных данных, поэтому если ваш код зависел от того, что возвращаемое значение было, скажем,bytearray, вам потребуется изменить код.Функции
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¶Changes in the 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¶Changed in 3.4.3
PEP 476: Включение проверки сертификатов по умолчанию для HTTP-клиентов стандартной библиотеки¶PEP 476: Enabling certificate verification by default for stdlib http clients
http.client и модули, которые его используют, такие как urllib.request и
xmlrpc.client, теперь проверяют, что сервер предъявляет сертификат,
подписанный удостоверяющим центром из хранилища доверия платформы, и что имя хоста
совпадает с запрашиваемым именем хоста по умолчанию, что значительно повышает безопасность
для многих приложений.
Для приложений, которым требуется старое поведение, можно передать альтернативный контекст:
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)