Содержание страницы
Что нового в 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 не было добавлено новых синтаксических возможностей.
Другие новые возможности:
- pip всегда должен быть доступен (PEP 453).
- Вновь созданные файловые дескрипторы не наследуются (PEP 446).
- опция командной строки для изолированного режима (issue 16499).
- улучшения в обработке кодеков , которые не являются текстовыми кодировками (множество проблем).
- Тип ModuleSpec для системы импорта (PEP 451). (Влияет на авторов импортёров.)
- Формат marshal стал более компактным и эффективным (issue 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 (issue 8713).
- email содержит новый подмодуль contentmanager и новый подкласс Message (EmailMessage), который упрощает обработку MIME (issue 18891).
- Модули inspect и pydoc теперь способны корректно интроспектировать гораздо более широкий спектр вызываемых объектов, что улучшает вывод системы Python help().
- API модуля ipaddress объявлен стабильным
Улучшения в области безопасности:
- Безопасный и взаимозаменяемый алгоритм хеширования (PEP 456).
- Сделать вновь созданные файловые дескрипторы ненаследуемыми (PEP 446), чтобы избежать утечки файловых дескрипторов в дочерние процессы.
- Новая опция командной строки для изолированного режима, (issue 16499).
- multiprocessing теперь имеет опцию для отказа от использования os.fork в Unix. Методы spawn и forkserver более безопасны, поскольку не передают данные дочерним процессам.
- Дочерние процессы multiprocessing в Windows больше не наследуют все наследуемые дескрипторы родителя, а только необходимые.
- Новая функция hashlib.pbkdf2_hmac() предоставляет функцию формирования ключа на основе пароля PKCS#5 версии 2.
- Поддержка TLSv1.1 и TLSv1.2 для ssl.
- Поддержка получения сертификатов из системного хранилища сертификатов Windows для ssl.
- Поддержка SNI (Server Name Indication) на стороне сервера для ssl.
- Класс ssl.SSLContext получил множество улучшений.
- Все модули стандартной библиотеки, поддерживающие SSL, теперь поддерживают проверку сертификатов сервера, включая сопоставление имени хоста (ssl.match_hostname()) и списки отзыва сертификатов (CRL, см. ssl.SSLContext.load_verify_locations()).
Улучшения реализации CPython:
- Безопасная финализация объектов (PEP 442).
- Благодаря PEP 442, в большинстве случаев глобальные переменные модуля больше не устанавливаются в None при завершении работы (issue 18214).
- Настраиваемые распределители памяти (PEP 445).
- Argument Clinic (PEP 436)
Читайте далее полный список изменений, влияющих на пользователей, включая множество других небольших улучшений, оптимизаций 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 для Windows как py -m pip.
Как обсуждается в PEP, разработчики дистрибутивов могут принять решение не устанавливать эти команды по умолчанию, при условии, что при их вызове они предоставляют четкие и простые инструкции по их установке на этой платформе (обычно с помощью системного менеджера пакетов).
Примечание
Чтобы избежать конфликтов между параллельными установками Python 2 и Python 3, по умолчанию при прямом вызове ensurepip устанавливаются только версионированные команды pip3 и pip3.4 – опция --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 делает вновь созданные файловые дескрипторы ненаследуемыми. В целом, это поведение, которое нужно приложению: при запуске нового процесса наличие открытых файлов также открытыми в новом процессе может привести к всевозможным труднонаходимым ошибкам и потенциально к проблемам безопасности.
Однако бывают случаи, когда наследование желательно. Для поддержки этих случаев доступны следующие новые функции и методы:
- 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 написан и реализован 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'
Двоичные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в Двоичные преобразования и Текстовые преобразования.
(Предложено Ником Когланом в issue 7475, issue 17827, issue 17828 и issue 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, который можно использовать для указания значения, возвращаемого, если итерируемый объект не содержит элементов. (Предложено Джулианом Берманом в issue 18111.)
- На объекты модулей теперь можно создавать слабые ссылки (weakref).
- Атрибуты __file__ модулей (и связанные с ними значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением: __main__.__file__, когда скрипт был запущен напрямую с относительным путём. (Предложено Бреттом Кэнноном в issue 18416.)
- Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты как при кодировании, так и при декодировании, если не используется обработчик ошибок surrogatepass, за исключением декодера UTF-16 (который принимает корректные суррогатные пары) и кодера UTF-16 (который создаёт их при кодировании символов вне BMP). (Предложено Виктором Стиннером, Кан-Хао (Кенни) Лу и Сергеем Сторчакой в issue 12892.)
- Новый немецкий EBCDIC-кодек codec cp273. (Предложено Майклом Бирнфельдом и Эндрю Кучлингом в issue 1097797.)
- Новый украинский codec cp1125. (Предложено Сергеем Сторчакой в issue 19668.)
- bytes.join() и bytearray.join() теперь принимают произвольные буферные объекты в качестве аргументов. (Предложено Антуаном Питру в issue 15958.)
- Конструктор int теперь принимает любой объект, имеющий метод __index__, для аргумента base. (Предложено Марком Дикинсоном в issue 16772.)
- Объекты фреймов теперь имеют метод clear(), который удаляет все ссылки на локальные переменные из фрейма. (Предложено Антуаном Питру в issue 17934.)
- memoryview теперь зарегистрирован как Sequence и поддерживает встроенную функцию reversed(). (Предложено Ником Когланом и Клодиу Попой в issue 18690 и issue 19078.)
- Сигнатуры, выводимые help(), были изменены и улучшены в нескольких случаях в результате внедрения Argument Clinic и других изменений в модулях inspect и pydoc.
- __length_hint__() теперь является частью формальной спецификации языка (см. PEP 424). (Предложено Армином Ронахером в issue 16148.)
Новые модули¶New Modules
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 написан и реализован Antoine Pitrou.
selectors¶
Новый модуль selectors (созданный в рамках реализации PEP 3156) позволяет выполнять высокоуровневое и эффективное мультиплексирование ввода-вывода на основе примитивов модуля select.
statistics¶
The new statistics module (defined in PEP 450) offers some core statistics functionality directly in the standard library. This module supports calculation of the mean, median, mode, variance and standard deviation of a data series.
См. также
- PEP 450 – Добавление модуля статистики в стандартную библиотеку
- PEP написан и реализован Стивеном Д’Апрано
tracemalloc¶
Новый модуль tracemalloc (описан в PEP 454) – это инструмент отладки для трассировки блоков памяти, выделяемых Python. Он предоставляет следующую информацию:
- Отслеживание места выделения объекта
- Статистика по выделенным блокам памяти для каждого имени файла и номера строки: общий размер, количество и средний размер выделенных блоков памяти
- Вычисление различий между двумя снимками для обнаружения утечек памяти
См. также
- PEP 454 – Добавление нового модуля tracemalloc для отслеживания выделений памяти Python
- Автор PEP и разработчик: Victor Stinner
Улучшенные модули¶Improved Modules
abc ¶
Новую функцию abc.get_cache_token() можно использовать, чтобы узнать, когда нужно сбрасывать кеши, на которые влияют изменения в графе объектов. (Автор: Łukasz Langa, issue 16832.)
Новый класс ABC имеет мета-класс ABCMeta. Использование ABC в качестве базового класса даёт тот же эффект, что и указание metaclass=abc.ABCMeta, но запись получается проще и читается легче. (Автор: Bruno Dupuis, issue 16049.)
aifc¶
Метод getparams() теперь возвращает именованный кортеж, а не простой кортеж. (Автор: Claudiu Popa, issue 17818.)
aifc.open() теперь поддерживает протокол менеджера контекста: при использовании в блоке with метод close() возвращаемого объекта будет вызван автоматически в конце блока. (Автор: Serhiy Storchaka, задача 16486.)
Методы writeframesraw() и writeframes() теперь принимают любой bytes-like object. (Автор: Serhiy Storchaka, issue 8311.)
argparse¶
Класс FileType теперь принимает аргументы encoding и errors, которые передаются в open(). (Автор: Lucas Maystre, issue 11175.)
audioop¶
audioop теперь поддерживает 24-битные сэмплы. (Автор: Serhiy Storchaka, issue 12866.)
Новая функция byteswap() преобразует сэмплы из формата big-endian в little-endian и обратно. (Автор: Serhiy Storchaka, issue 19641.)
Все функции audioop теперь принимают любой bytes-like object. Строки не принимаются: раньше они не работали, теперь сразу вызывают ошибку. (Автор: Serhiy Storchaka, issue 16685.)
base64¶
Функции кодирования и декодирования в base64 теперь принимают любой bytes-like object вместо ранее требовавшегося экземпляра bytes или bytearray. (Автор: Nick Coghlan, issue 17839.)
Новые функции a85encode(), a85decode(), b85encode() и b85decode() позволяют кодировать и декодировать двоичные данные соответственно в форматы Ascii85 и Base85 (используемый в git/mercurial). Функции a85 имеют параметры, позволяющие сделать их совместимыми с разновидностями кодировки Ascii85, включая вариант Adobe. (Авторы: Martin Morrison, проект Mercurial, Serhiy Storchaka и Antoine Pitrou, issue 17618.)
collections¶
Метод ChainMap.new_child() теперь принимает аргумент m, задающий дочернее отображение для добавления в цепочку. Это позволяет использовать для дочернего элемента существующее отображение и/или пользовательский тип отображения. (Автор: Vinay Sajip, issue 16613.)
colorsys¶
Количество цифр в коэффициентах для преобразования RGB – YIQ было расширено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов не должно превышать 1% и может лучше совпадать с результатами из других источников. (Авторы: Brian Landers и Serhiy Storchaka, issue 14323.)
contextlib¶
Новый менеджер контекста contextlib.suppress помогает прояснить намерение кода, который намеренно подавляет исключения от одной инструкции. (Авторы: Raymond Hettinger, issue 15806, и Zero Piraeus, issue 19266.)
Новый менеджер контекста contextlib.redirect_stdout() упрощает для вспомогательных скриптов работу с негибкими API, которые выводят результаты в sys.stdout и не предоставляют возможности перенаправить его. Используя менеджер контекста, вывод в sys.stdout можно перенаправить в любой другой поток или, в сочетании с io.StringIO, в строку. Последнее может быть особенно полезно, например, для захвата вывода от функции, написанной для реализации интерфейса командной строки. Рекомендуется использовать только во вспомогательных скриптах, так как это влияет на глобальное состояние sys.stdout. (Автор: Raymond Hettinger, issue 15805.)
Документация к contextlib также была обновлена и включает обсуждение различий между одноразовыми, многократно используемыми и реентерабельными менеджерами контекста.
dbm¶
Объекты dbm.open() теперь поддерживают протокол менеджера контекста. При использовании в операторе with метод close объекта базы данных будет вызван автоматически в конце блока. (Авторы: Claudiu Popa и Nick Coghlan, issue 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)).
(Предложено Nick Coghlan, Ryan Kelly и Thomas Kluyver в issue 11816 и Claudiu Popa в issue 17916.)
Новая функция stack_effect() вычисляет влияние на стек Python заданного опкода и аргумента – информацию, недоступную иным способом. (Предложено Larry Hastings в issue 19722.)
doctest¶
Новый флаг опции FAIL_FAST останавливает выполнение тестов при первом же обнаружении ошибки. (Предложено R. David Murray и Daniel Urban в issue 16522.)
Интерфейс командной строки doctest теперь использует argparse и имеет две новые опции: -o и -f. -o позволяет указывать опции doctest в командной строке, а -f является сокращением для -o FAIL_FAST (по аналогии с подобной опцией, поддерживаемой unittest CLI). (Предложено R. David Murray в issue 11390.)
doctest теперь будет находить доктесты в строках __doc__ модулей расширения. (Предложено Zachary Ware в issue 3158.)
email¶
as_string() теперь принимает аргумент policy для переопределения политики сообщения по умолчанию при формировании его строкового представления. Это означает, что as_string теперь можно использовать в большем числе ситуаций, без необходимости создавать и использовать generator для передачи параметров форматирования его методу flatten. (Предложено R. David Murray в issue 18600.)
Добавлен новый метод as_bytes() для получения байтового представления сообщения, аналогично тому, как as_string даёт строковое представление. Он не принимает аргумент maxheaderlen, но принимает аргументы unixfrom и policy. Метод Message __bytes__() вызывает его, так что bytes(mymsg) теперь будет давать интуитивно понятный результат: объект bytes, содержащий полностью отформатированное сообщение. (Предложено R. David Murray в issue 18600.)
Метод Message.set_param() теперь принимает именованный аргумент replace. При его указании соответствующий заголовок будет обновлён без изменения его позиции в списке заголовков. Для обратной совместимости значение по умолчанию – False. (Предложено R. David Murray в issue 18891.)
Добавлена пара новых подклассов Message (EmailMessage и MIMEPart), а также новый подмодуль contentmanager и новый атрибут policy content_manager. Вся документация сейчас находится в новом модуле, который добавляется как часть нового предварительного API email. Эти классы предоставляют ряд новых методов, которые значительно упрощают извлечение содержимого из сообщений email и вставку содержимого в них. Подробнее см. документацию contentmanager и Примеры использования предварительного API. Эти дополнения API завершают основную часть работы, запланированной в рамках проекта email6. Текущий предварительный API планируется сделать окончательным в Python 3.5 (возможно, с несколькими небольшими дополнениями в области обработки ошибок). (Предложено R. David Murray в issue 18891.)
filecmp¶
Новая функция clear_cache() позволяет очищать кэш сравнения filecmp, который использует информацию os.stat() для определения, изменился ли файл с момента последнего сравнения. Это может пригодиться, например, если файл мог быть изменён и повторно проверен за время, меньшее, чем разрешающая способность поля времени модификации конкретной файловой системы. (Предложено Mark Levitt в issue 18149.)
Новый атрибут модуля DEFAULT_IGNORES предоставляет список каталогов, используемых как значение по умолчанию для параметра ignore функции dircmp(). (Предложено Eli Bendersky в issue 15442.)
functools¶
Новый дескриптор partialmethod() привносит частичное применение аргументов для дескрипторов, подобно тому как partial() обеспечивает его для обычных вызываемых объектов. Новый дескриптор также упрощает получение произвольных вызываемых объектов (включая экземпляры partial()), которые ведут себя как обычные методы экземпляра при включении в определение класса. (Предложено Alon Horev и Nick Coghlan в issue 4331.)
Новый декоратор singledispatch() добавляет поддержку обобщённых функций с одиночной диспетчеризацией в стандартную библиотеку Python. Если объектно-ориентированное программирование сосредоточено на группировке множества операций над общим набором данных в классе, то обобщённая функция сосредоточена на группировке множества реализаций операции, позволяющей ей работать с разными видами данных.
См. также
- PEP 443 – Однодиспетчерские обобщённые функции
- PEP написан и реализован Лукашем Лангой.
total_ordering() теперь поддерживает возврат значения NotImplemented из нижележащей функции сравнения. (Предложено Katie Miller в issue 10042.)
Чисто-питоновская версия функции partial() теперь находится в стандартной библиотеке; в CPython она переопределяется ускоренной версией на C, но доступна для использования в других реализациях. (Предложено Brian Thorne в issue 12428.)
gc¶
Новая функция get_stats() возвращает список из трёх словарей (по одному на поколение), содержащих статистику сборок мусора с момента запуска интерпретатора. (Предложено Antoine Pitrou в issue 16351.)
glob¶
Новая функция escape() предоставляет способ экранировать специальные символы в имени файла, чтобы они не участвовали в раскрытии шаблона glob, а вместо этого сопоставлялись буквально. (Предложено Serhiy Storchaka в задаче 8402.)
hashlib¶
Новая функция hashlib.pbkdf2_hmac() реализует функцию формирования ключа на основе пароля PBKDF2 (PKCS#5). (Предложено Christian Heimes в issue 18582.)
Атрибут name хеш-объектов hashlib теперь является официально поддерживаемым интерфейсом. Он всегда существовал в hashlib CPython (хотя и не возвращал имена в нижнем регистре для всех поддерживаемых хешей), но не был публичным интерфейсом, поэтому некоторые другие реализации Python ранее его не поддерживали. (Предложено Jason R. Coombs в issue 18532.)
hmac¶
hmac теперь принимает bytearray наряду с bytes для аргумента key функции new(), а параметр msg как функции new(), так и метода update() теперь принимает любой тип, поддерживаемый модулем hashlib. (Предложено Jonas Borgström в issue 18240.)
Аргумент digestmod функции hmac.new() теперь может быть любым именем хеш-алгоритма, распознаваемым модулем hashlib. Кроме того, текущее поведение, при котором значение digestmod по умолчанию равно MD5, считается устаревшим: в будущей версии Python значения по умолчанию не будет. (Предложено Christian Heimes в issue 17276.)
С добавлением атрибутов block_size и name (а также формальной документации атрибута digest_size), модуль hmac теперь полностью соответствует API PEP 247. (Предложено Christian Heimes в issue 18775.)
html¶
Новая функция unescape() преобразует символьные ссылки HTML5 в соответствующие символы Юникода. (Предложено Ezio Melotti в issue 2927.)
HTMLParser принимает новый именованный аргумент convert_charrefs, который при значении True автоматически преобразует все символьные ссылки. Для обратной совместимости его значение по умолчанию равно False, но в будущей версии Python оно изменится на True, поэтому рекомендуется явно задавать его и обновить код для использования этой новой возможности. (Предложено Ezio Melotti в issue 13633.)
Аргумент strict класса HTMLParser теперь считается устаревшим. (Предложено Ezio Melotti в issue 15114.)
http¶
send_error() теперь принимает необязательный дополнительный параметр explain, который можно использовать для указания расширенного описания ошибки, переопределяя жёстко заданное значение по умолчанию, если оно есть. Это расширенное описание ошибки будет отформатировано с помощью атрибута error_message_format и отправлено в качестве тела ответа об ошибке. (Вклад Karl Cow – issue 12921.)
У модуля http.server интерфейс командной строки теперь содержит опцию -b/--bind, которая заставляет сервер прослушивать определённый адрес. (Вклад Malte Swart – issue 17764.)
idlelib и IDLE¶idlelib and IDLE
Поскольку idlelib реализует оболочку IDLE и редактор и не предназначен для импорта другими программами, он получает улучшения с каждым релизом. См. Lib/idlelib/NEWS.txt для полного списка изменений начиная с версии 3.3.0, а также изменений, внесённых в будущих выпусках 3.4.x. Этот файл также доступен из диалогового окна IDLE Help ‣ About IDLE.
importlib¶
Абстрактный класс InspectLoader определяет новый метод, source_to_code() который принимает исходные данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна compile(data, path, 'exec', dont_inherit=True). (Вклад Eric Snow и Brett Cannon – issue 15627.)
InspectLoader также теперь имеет реализацию по умолчанию для метода get_code(). Однако обычно желательно переопределять реализацию по умолчанию по соображениям производительности. (Вклад Brett Cannon – issue 18072.)
Функция reload() была перемещена из imp в importlib в рамках устаревания модуля imp. (Вклад Berker Peksag – issue 18193.)
importlib.util теперь имеет атрибут MAGIC_NUMBER, предоставляющий доступ к номеру версии байткода. Он заменяет функцию get_magic() в устаревшем модуле imp. (Вклад Brett Cannon – issue 18192.)
Новые функции importlib.util cache_from_source() и source_from_cache() заменяют одноимённые функции в устаревшем модуле imp. (Вклад Brett Cannon – issue 18194.)
Загрузчик importlib начальной загрузки NamespaceLoader теперь соответствует абстрактному классу InspectLoader, что означает, что runpy и python -m теперь можно использовать с пространствами имён пакетов. (Вклад Brett Cannon – issue 18058.)
importlib.util имеет новую функцию decode_source(), которая декодирует исходный код из байт, используя универсальную обработку символов новой строки. Это полезно для реализации методов InspectLoader.get_source().
importlib.machinery.ExtensionFileLoader теперь имеет метод get_filename(). Он был случайно пропущен в первоначальной реализации. (Вклад Eric Snow – issue 19152.)
inspect¶
Модуль inspect теперь предлагает базовый интерфейс командной строки для быстрого отображения исходного кода и другой информации о модулях, классах и функциях. (Вклад Claudiu Popa и Nick Coghlan – issue 18626.)
unwrap() упрощает распутывание цепочек функций-обёрток, созданных functools.wraps() (и любого другого API, который устанавливает атрибут __wrapped__ для функции-обёртки). (Вклад Daniel Urban, Aaron Iles и Nick Coghlan – issue 13266.)
В рамках реализации нового модуля enum, модуль inspect теперь имеет значительно лучшую поддержку пользовательских методов __dir__ и динамических атрибутов классов, предоставляемых через метаклассы. (Вклад Ethan Furman – issue 18929 и issue 19030.)
getfullargspec() и getargspec() теперь используют API signature(). Это позволяет им поддерживать гораздо более широкий диапазон вызываемых объектов, включая те, у которых есть атрибуты __signature__, те, у которых есть метаданные, предоставленные argument clinic, объекты functools.partial() и другие. Обратите внимание, что, в отличие от signature(), эти функции по-прежнему игнорируют атрибуты __wrapped__ и сообщают уже привязанный первый аргумент для связанных методов, поэтому всё ещё необходимо обновлять код для использования signature() напрямую, если требуется такое поведение. (Вклад Yury Selivanov – issue 17481.)
signature() теперь поддерживает утиные типы функций CPython, что добавляет поддержку функций, скомпилированных с помощью Cython. (Вклад Stefan Behnel и Yury Selivanov – issue 17159.)
ipaddress ¶
ipaddress был добавлен в стандартную библиотеку в Python 3.3 как временный API. С выходом Python 3.4 этот статус был снят: ipaddress теперь считается стабильным API, подпадающим под обычные требования стандартной библиотеки по сохранению обратной совместимости.
Новое свойство is_global имеет значение True, если адрес является глобально маршрутизируемым. (Вклад Peter Moody – issue 17400.)
logging¶
У TimedRotatingFileHandler появился новый параметр atTime, который можно использовать для указания времени дня, когда должна произойти ротация. (Вклад Ronald Oussoren – issue 9556.)
SocketHandler и DatagramHandler теперь поддерживают доменные сокеты Unix (при установке port в None). (Вклад Vinay Sajip – коммит ce46195b56a9.)
fileConfig() теперь принимает экземпляр подкласса configparser.RawConfigParser для параметра fname. Это упрощает использование файла конфигурации, когда настройка логирования является лишь частью общей конфигурации приложения, или когда приложение изменяет конфигурацию перед передачей её в fileConfig(). (Вклад Vinay Sajip – issue 16110.)
Данные конфигурации логирования, полученные через сокет с помощью функции logging.config.listen(), теперь могут быть проверены перед обработкой путём передачи проверочной функции в качестве аргумента в новый именованный аргумент verify. (Вклад Vinay Sajip – issue 15452.)
marshal¶
Версия по умолчанию marshal была повышена до 3. Код, реализующий новую версию, восстанавливает поведение Python 2, при котором записывается только одна копия интернированных строк и сохраняется интернирование при десериализации, и расширяет эту возможность «одной копии» на любой тип объекта (включая обработку рекурсивных ссылок). Это уменьшает как размер файлов .pyc, так и объём памяти, занимаемой модулем при загрузке из файла .pyc (или .pyo). (Вклад Kristján Valur Jónsson – issue 16475, с дополнительными ускорениями от Antoine Pitrou – issue 19219.)
mmap¶
Объекты mmap теперь можно использовать в слабых ссылках. (Вклад Valerie Lambert – issue 4885.)
multiprocessing¶
В Unix два новых метода запуска, spawn и forkserver, были добавлены для запуска процессов с помощью multiprocessing. Это делает смешивание процессов с потоками более надёжным, а метод spawn соответствует семантике, которую multiprocessing всегда использовала в Windows. Новая функция get_all_start_methods() сообщает все доступные на платформе методы запуска, get_start_method() сообщает текущий метод запуска, а set_start_method() устанавливает метод запуска. (Вклад Richard Oudkerk – issue 8713.)
multiprocessing также теперь имеет понятие контекста, который определяет, как создаются дочерние процессы. Новая функция get_context() возвращает контекст, использующий указанный метод запуска. Она имеет тот же API, что и сам модуль multiprocessing, поэтому её можно использовать для создания объектов Pool и других объектов, которые будут работать в этом контексте. Это позволяет фреймворку и приложению или разным частям одного приложения использовать multiprocessing без взаимных помех. (Вклад Richard Oudkerk – issue 18999.)
За исключением случаев использования старого метода запуска fork, дочерние процессы больше не наследуют ненужные дескрипторы/файловые дескрипторы от родительских (часть issue 8713).
multiprocessing теперь опирается на runpy (которая реализует флаг -m) для корректной инициализации __main__ в дочерних процессах при использовании методов запуска spawn или forkserver. Это решает некоторые пограничные случаи, когда сочетание multiprocessing, флага командной строки -m и явных относительных импортов могло вызывать трудноуловимые ошибки в дочерних процессах. (Автор: Nick Coghlan, issue 19946.)
operator¶
Новая функция length_hint() предоставляет реализацию спецификации того, как следует использовать специальный метод __length_hint__(), в рамках формальной спецификации PEP 424 этой языковой возможности. (Автор: Armin Ronacher, issue 16148.)
Теперь доступна чисто-питоновская версия модуля operator для справочных целей и использования альтернативными реализациями Python. (Автор: Zachary Ware, issue 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, issue 17914.)
os.path.samestat() теперь доступна на платформе Windows (а реализация os.path.samefile() теперь общая для Unix и Windows). (Автор: Brian Curtin, issue 11939.)
os.path.ismount() теперь распознаёт тома, смонтированные ниже корня диска на Windows. (Автор: Tim Golden, issue 9035.)
os.open() поддерживает два новых флага на платформах, которые их предоставляют: O_PATH (неоткрытый файловый дескриптор) и O_TMPFILE (безымянный временный файл; на момент выпуска 3.4.0 доступен только в Linux с версией ядра 3.11 или новее, имеющих заголовки uapi). (Авторы: Christian Heimes, issue 18673, и Benjamin Peterson.)
pdb¶
pdb был улучшен для более полезной обработки генераторов, yield и yield from. Это особенно полезно при отладке программ, основанных на asyncio. (Авторы: Andrew Svetlov и Xavier de Gaye, issue 16596.)
Команда print была удалена из pdb, восстановив доступ к функции Python print() из командной строки pdb. В Python2 pdb не было команды print; вместо этого ввод print выполнял оператор print. В Python3 print по ошибке стал псевдонимом команды pdb p. Однако p выводит repr своего аргумента, а не str, как делала команда print в Python2. Хуже того, команда pdb print в Python3 затеняла функцию print Python3, делая её недоступной в приглашении pdb. (Автор: Connor Osborn, issue 18764.)
pickle¶
pickle теперь поддерживает (но не использует по умолчанию) новый протокол pickle, протокол 4. Этот новый протокол решает ряд проблем, присутствовавших в предыдущих протоколах, таких как сериализация вложенных классов, очень больших строк и контейнеров, а также классов, у которых метод __new__() принимает только ключевые аргументы. Он также предоставляет некоторые улучшения производительности.
См. также
- PEP 3154 – протокол pickle 4
- PEP написан Антуаном Питрой (Antoine Pitrou), реализован Александром Валсалотти (Alexandre Vassalotti).
plistlib¶
plistlib теперь имеет API, аналогичный стандартному шаблону протоколов сериализации стандартной библиотеки, с новыми функциями load(), dump(), loads() и dumps(). (Старое API теперь устарело.) В дополнение к уже поддерживаемому формату XML plist (FMT_XML), теперь также поддерживается двоичный формат plist (FMT_BINARY). (Авторы: Ronald Oussoren и другие, issue 14455.)
poplib¶
В poplib добавлены два новых метода: capa(), который возвращает список возможностей, объявленных POP-сервером, и stls(), который переключает сеанс POP3 в открытом виде на зашифрованный сеанс POP3, если POP-сервер это поддерживает. (Автор: Lorenzo Catucci, issue 4473.)
pprint¶
Класс PrettyPrinter модуля pprint и его функции pformat() и pprint() получили новую опцию compact, которая управляет форматированием вывода. В настоящее время установка compact в True означает, что последовательности будут печататься с максимальным количеством элементов, помещающихся в width на каждой (с отступом) строке. (Автор: Serhiy Storchaka, issue 19132.)
Длинные строки теперь переносятся с использованием обычного синтаксиса продолжения строк Python. (Автор: Antoine Pitrou, issue 17150.)
pty¶
pty.spawn() теперь возвращает значение статуса от os.waitpid() для дочернего процесса, а не None. (Автор: Gregory P. Smith.)
pydoc¶
Модуль pydoc теперь напрямую основан на API интроспекции inspect.signature(), что позволяет ему предоставлять информацию о сигнатуре для более широкого круга вызываемых объектов. Это изменение также означает, что атрибуты __wrapped__ теперь учитываются при отображении справочной информации. (Автор: Larry Hastings, issue 19674.)
Модуль pydoc больше не отображает параметр self для уже связанных методов. Вместо этого он стремится всегда показывать точную текущую сигнатуру переданного вызываемого объекта. (Автор: Larry Hastings, issue 20710.)
В дополнение к изменениям, внесённым непосредственно в pydoc, его обработка пользовательских методов __dir__ и различного поведения дескрипторов также была существенно улучшена за счёт соответствующих изменений в модуле inspect.
Поскольку встроенная функция help() основана на pydoc, вышеуказанные изменения также влияют на поведение help().
re¶
Новая функция fullmatch() и метод regex.fullmatch() привязывают шаблон к обоим концам строки для сопоставления. Это позволяет явно указать цель сопоставления, что позволяет избежать класса тонких ошибок, при которых символы $ теряются при изменениях кода или добавлении альтернатив в существующее регулярное выражение. (Автор: Matthew Barnett, issue 16203.)
Представление объектов regex теперь включает шаблон и флаги; представление объектов match теперь включает начало, конец и часть строки, которая совпала. (Авторы: Hugo Lopes Tavares и Serhiy Storchaka, issue 13592 и issue 17087.)
resource¶
Новая функция prlimit(), доступная на платформах Linux с версией ядра 2.6.36 или новее и glibc 2.13 или новее, предоставляет возможность запрашивать или устанавливать ограничения ресурсов для процессов, отличных от того, который вызывает функцию. (Автор: Christian Heimes в issue 16595.)
На Linux с версией ядра 2.6.36 или новее также появились новые константы, специфичные для Linux: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME и RLIMIT_SIGPENDING. (Автор: Christian Heimes в issue 19324.)
На FreeBSD версии 9 и новее появились новые константы, специфичные для FreeBSD: RLIMIT_SBSIZE, RLIMIT_SWAP и RLIMIT_NPTS. (Автор: Claudiu Popa в issue 19343.)
select¶
Объекты epoll теперь поддерживают протокол управления контекстом. При использовании в операторе with метод close() будет вызван автоматически в конце блока. (Автор: Serhiy Storchaka в issue 16488.)
Объекты devpoll теперь имеют методы fileno() и close(), а также новый атрибут closed. (Автор: Victor Stinner в issue 18794.)
shelve¶
Экземпляры Shelf теперь можно использовать в операторах with, и они будут автоматически закрыты в конце блока with. (Автор: Filip Gruszczyński в issue 13896.)
shutil¶
copyfile() теперь вызывает конкретный подкласс Error, SameFileError, когда исходный и целевой файлы совпадают, что позволяет приложению предпринять соответствующие действия для этой конкретной ошибки. (Авторы: Atsuo Ishimoto и Hynek Schlawack в issue 1492704.)
smtpd¶
Классы SMTPServer и SMTPChannel теперь принимают именованный аргумент map, который, если указан, передаётся в asynchat.async_chat в качестве его аргумента map. Это позволяет приложению избежать влияния на глобальную карту сокетов. (Автор: Vinay Sajip в issue 11959.)
smtplib¶
SMTPException теперь является подклассом OSError, что позволяет перехватывать как ошибки на уровне сокетов, так и ошибки протокола SMTP в одном операторе try/except для кода, которому важно только то, произошла ли ошибка. (Автор: Ned Jackson Lovely в issue 2118.)
socket¶
Модуль socket теперь поддерживает протокол CAN_BCM на платформах, которые его поддерживают. (Автор: Brian Thorne в issue 15359.)
Объекты сокетов имеют новые методы для получения или установки своего флага наследуемости: get_inheritable() и set_inheritable().
Константы socket.AF_* и socket.SOCK_* теперь являются значениями перечисления с использованием нового модуля enum. Это позволяет выводить осмысленные имена при отладке вместо целочисленных «магических чисел».
Константа AF_LINK теперь доступна на BSD и OSX.
inet_pton() и inet_ntop() теперь поддерживаются на Windows. (Автор: Atsuo Ishimoto в issue 7171.)
sqlite3¶
Новый булев параметр uri функции connect() можно использовать для указания того, что параметр database является uri (см. документацию SQLite по URI). (Автор: poq в issue 13773.)
ssl¶
Добавлены PROTOCOL_TLSv1_1 и PROTOCOL_TLSv1_2 (поддержка TLSv1.1 и TLSv1.2); поддержка этих протоколов доступна только если Python собран с OpenSSL 1.0.1 или новее. (Авторы: Michele Orrù и Antoine Pitrou в issue 16692.)
Новая функция create_default_context() предоставляет стандартный способ получения SSLContext, настройки которого призваны обеспечить разумный баланс между совместимостью и безопасностью. Эти настройки более строгие, чем значения по умолчанию, предоставляемые конструктором SSLContext, и могут быть изменены в будущем без предварительного объявления устаревшими, если лучшие практики безопасности изменятся. Новая рекомендуемая практика использования библиотек stdlib, поддерживающих SSL, заключается в использовании create_default_context() для получения объекта SSLContext, его модификации при необходимости и последующей передачи в качестве аргумента context соответствующего API stdlib. (Автор: Christian Heimes в issue 19689.)
Метод load_verify_locations() класса SSLContext принимает новый необязательный аргумент cadata, который можно использовать для предоставления сертификатов в кодировке PEM или DER непосредственно в виде строк или байтов соответственно. (Автор: Christian Heimes в issue 18138.)
Новая функция get_default_verify_paths() возвращает именованный кортеж путей и переменных окружения, которые метод set_default_verify_paths() использует для установки значений по умолчанию cafile и capath в OpenSSL. Это может помочь в отладке проблем с проверкой по умолчанию. (Автор: Christian Heimes в issue 18143.)
У SSLContext появился новый метод, cert_store_stats(), который сообщает количество загруженных сертификатов X.509, сертификатов X.509 CA и списков отзыва сертификатов (CRL), а также метод get_ca_certs(), который возвращает список загруженных сертификатов CA. (Автор: Christian Heimes в issue 18147.)
Если доступен OpenSSL 0.9.8 или новее, у SSLContext появился новый атрибут verify_flags: его можно установить в некоторую комбинацию новых констант VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN или VERIFY_X509_STRICT и тем самым управлять проверкой сертификата. По умолчанию OpenSSL не выполняет проверку CRL. (Автор: Christian Heimes в тикете 8813.)
Новый метод load_default_certs() класса SSLContext загружает набор сертификатов по умолчанию «центров сертификации» (CA) из стандартных расположений, которые различаются в зависимости от платформы. Его можно использовать для загрузки как сертификатов аутентификации веб-сервера TLS (purpose=SERVER_AUTH) для использования клиентом для проверки сервера, так и сертификатов для использования сервером при проверке клиентских сертификатов (purpose=CLIENT_AUTH). (Автор: Christian Heimes в issue 19292.)
Две новые функции только для Windows, enum_certificates() и enum_crls(), предоставляют возможность получать сертификаты, информацию о сертификатах и CRL из хранилища сертификатов Windows. (Автор: Christian Heimes в issue 17134.)
Поддержка SNI на стороне сервера (Server Name Indication) с использованием нового метода ssl.SSLContext.set_servername_callback(). (Автор: Daniel Black в issue 8109.)
Словарь, возвращаемый SSLSocket.getpeercert(), содержит дополнительные элементы расширений X509v3: crlDistributionPoints, calIssuers и OCSP URI. (Автор: Christian Heimes в issue 18379.)
stat¶
Модуль stat теперь реализован на языке C в _stat. Реализация на C требуется, поскольку большинство значений не стандартизированы и зависят от платформы. (Автор: Christian Heimes в issue 11016.)
Модуль поддерживает новые флаги ST_MODE, S_IFDOOR, S_IFPORT и S_IFWHT. (Автор: Christian Hiemes в issue 11016.)
struct¶
Новая функция iter_unpack и новый метод struct.Struct.iter_unpack() для скомпилированных форматов обеспечивают потоковую распаковку буфера, содержащего повторяющиеся экземпляры заданного формата данных. (Автор: Antoine Pitrou в issue 17804.)
подпроцесс¶subprocess
check_output() теперь принимает аргумент input, который можно использовать для передачи содержимого stdin для выполняемой команды. (Автор: Zack Weinberg в issue 16624.)
getstatus() и getstatusoutput() теперь работают в Windows. Это изменение было случайно внесено в версии 3.3.4. (Автор: Tim Golden в issue 10197.)
sunau¶
Метод getparams() теперь возвращает именованный кортеж (namedtuple) вместо обычного кортежа. (Автор: Claudiu Popa в issue 18901.)
sunau.open() теперь поддерживает протокол менеджера контекста: при использовании в блоке with метод close возвращаемого объекта будет вызываться автоматически в конце блока. (Автор: Serhiy Storchaka в issue 18878.)
AU_write.setsampwidth() теперь поддерживает 24-битные семплы, что добавляет поддержку записи 24-битных семплов с помощью этого модуля. (Автор: Serhiy Storchaka в issue 19261.)
Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Автор: Serhiy Storchaka в issue 8311.)
sys¶
Новая функция sys.getallocatedblocks() возвращает текущее количество блоков, выделенных интерпретатором. (В CPython с настройкой по умолчанию --with-pymalloc это выделения, сделанные через API PyObject_Malloc().) Это может быть полезно для отслеживания утечек памяти, особенно при автоматизации с помощью набора тестов. (Автор: Antoine Pitrou в issue 13390.)
Когда интерпретатор Python запускается в интерактивном режиме, он проверяет наличие атрибута __interactivehook__ в модуле sys. Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка выполняется после чтения файла PYTHONSTARTUP, поэтому он может быть установлен там. Модуль site устанавливает его в функцию, которая включает автодополнение по табуляции и сохранение истории (в ~/.python-history), если платформа поддерживает readline. Если вы не хотите такого (нового) поведения, вы можете переопределить его в PYTHONSTARTUP, sitecustomize или usercustomize, удалив этот атрибут из sys (или установив его в другой вызываемый объект). (Авторы: Éric Araujo и Antoine Pitrou в issue 5845.)
tarfile¶
Модуль tarfile теперь поддерживает простой интерфейс командной строки при вызове напрямую как скрипт или через -m. Его можно использовать для создания и извлечения tar-архивов. (Автор: Berker Peksag в issue 13477.)
textwrap¶
Класс TextWrapper имеет два новых атрибута/аргумента конструктора: max_lines, ограничивающий количество строк в выводе, и placeholder – строка, которая будет отображаться в конце вывода, если он был обрезан из-за max_lines. Основываясь на этих возможностях, новая удобная функция shorten() заменяет все пробельные символы во входных данных на одиночные пробелы и создает одну строку заданной width, которая заканчивается на placeholder (по умолчанию [...]). (Авторы: Antoine Pitrou и Serhiy Storchaka в issue 18585 и issue 18725.)
threading¶
Объект Thread, представляющий главный поток, можно получить с помощью новой функции main_thread(). В обычных условиях это будет поток, из которого был запущен интерпретатор Python. (Автор: Andrew Svetlov в issue 18882.)
traceback¶
Новая функция traceback.clear_frames() принимает объект traceback и очищает локальные переменные во всех фреймах, на которые он ссылается, уменьшая объем потребляемой памяти. (Автор: Andrew Kuchling в issue 1565525.)
types¶
Новый дескриптор DynamicClassAttribute() предоставляет способ определить атрибут, который ведет себя нормально при обращении через экземпляр объекта, но перенаправляется в class __getattr__ при обращении через класс. Это позволяет иметь активные свойства на классе и виртуальные атрибуты с тем же именем (см. пример в Enum). (Автор: Ethan Furman в issue 19030.)
urllib¶
urllib.request теперь поддерживает URL-адреса data: через класс DataHandler. (Автор: Mathias Panzenböck в issue 16423.)
HTTP-метод, который будет использоваться классом Request, теперь можно указать, установив атрибут класса method в подклассе. (Автор: Jason R Coombs в issue 18978.)
Объекты Request теперь стали многократно используемыми: если изменяются атрибуты full_url или data, все соответствующие внутренние свойства обновляются. Это означает, например, что теперь можно использовать один и тот же объект Request в нескольких вызовах OpenerDirector.open() с разными аргументами data, или изменить url объекта Request, а не пересчитывать его с нуля. Также появился новый метод remove_header(), который можно использовать для удаления заголовков из Request. (Авторы: Alexey Kachayev в issue 16464, Daniel Wozniak в issue 17485, Damien Brecht и Senthil Kumaran в issue 17272.)
Объекты HTTPError теперь имеют атрибут headers, который предоставляет доступ к заголовкам HTTP-ответа, связанным с ошибкой. (Автор: Berker Peksag в issue 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 в issue 16997.)
unittest.main() теперь принимает итерируемый объект с именами тестов для defaultTest, тогда как раньше принимал только одно имя теста в виде строки. (Автор – Jyrki Pulliainen, issue 15132.)
Если SkipTest возбуждается во время поиска тестов (то есть на уровне модуля в тестовом файле), теперь это сообщается как пропуск, а не как ошибка. (Автор – Zach Ware, issue 16935.)
discover() теперь сортирует найденные файлы для обеспечения единообразного порядка тестов. (Авторы – Martin Melin и Jeff Ramnani, issue 16709.)
TestSuite теперь удаляет ссылки на тесты сразу после успешного выполнения теста. В интерпретаторах Python со сборкой мусора это позволяет тестам быть собранными, если никакие другие объекты не содержат на них ссылок. Это поведение можно изменить, создав подкласс TestSuite, в котором определён пользовательский метод _removeTestAtIndex. (Авторы – Tom Wardill, Matt McClure и Andrew Svetlov, issue 11798.)
Новый менеджер контекста для проверки утверждений, assertLogs(), гарантирует, что заданный блок кода выдаёт сообщение журнала, используя модуль logging. По умолчанию сообщение может быть от любого регистратора и иметь приоритет INFO или выше, но можно указать и имя регистратора, и альтернативный минимальный уровень ведения журнала. Объект, возвращаемый менеджером контекста, позволяет запрашивать объекты LogRecord и/или отформатированные сообщения, которые были зарегистрированы. (Автор – Antoine Pitrou, issue 18937.)
Поиск тестов теперь работает с пакетами пространств имён. (Автор – Claudiu Popa, issue 17457.)
Объекты unittest.mock теперь проверяют сигнатуры своих спецификаций при сопоставлении вызовов, то есть аргумент может быть сопоставлен либо по позиции, либо по имени, а не только по позиции. (Автор – Antoine Pitrou, issue 17015.)
Объекты mock_open() теперь имеют методы readline и readlines. (Автор – Toshio Kuratomi, issue 17467.)
venv¶
venv теперь включает скрипты активации для оболочек csh и fish. (Автор – Andrew Svetlov, issue 15417.)
EnvBuilder и вспомогательная функция create() принимают новый именованный аргумент with_pip, который по умолчанию равен False и управляет тем, устанавливает ли EnvBuilder pip в виртуальной среде. (Автор – Nick Coghlan, issue 19552, в рамках реализации PEP 453.)
wave¶
Метод getparams() теперь возвращает namedtuple вместо обычного кортежа. (Автор – Claudiu Popa, issue 17487.)
wave.open() теперь поддерживает протокол контекстного менеджера. (Автор – Claudiu Popa, issue 17616.)
wave теперь может записывать вывод в файлы без возможности позиционирования. (Авторы – David Jones, Guilherme Polo и Serhiy Storchaka, issue 5202.)
Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Автор – Serhiy Storchaka, issue 8311.)
weakref¶
Новый класс WeakMethod имитирует слабые ссылки на привязанные методы. (Автор – Antoine Pitrou, issue 14631.)
Новый класс finalize позволяет зарегистрировать колбэк, который будет вызван при сборке мусора объекта, без необходимости тщательно управлять жизненным циклом самой слабой ссылки. (Автор – Richard Oudkerk, issue 15528.)
Колбэк (если есть), связанный с объектом ref, теперь доступен через атрибут __callback__. (Автор – Mark Dickinson, issue 17643.)
xml.etree¶
Новый синтаксический анализатор XMLPullParser позволяет неблокирующим приложениям разбирать XML-документы. Пример можно посмотреть в разделе Pull API для неблокирующего разбора. (Автор – Antoine Pitrou, issue 17741.)
Функции xml.etree.ElementTree tostring() и tostringlist(), а также метод ElementTree write() теперь имеют short_empty_elements параметр, задаваемый только по ключевому слову, который управляет тем, записываются ли пустые элементы в сокращённой (<tag />) или развёрнутой (<tag></tag>) форме. (Авторы – Ariel Poliak и Serhiy Storchaka, issue 14377.)
zipfile¶
Метод writepy() класса PyZipFile получил новую опцию filterfunc, которую можно использовать для управления тем, какие каталоги и файлы добавляются в архив. Например, это может быть использовано для исключения тестовых файлов из архива. (Автор – Christian Tismer, issue 19274.)
Параметр allowZip64 для ZipFile и PyZipfile теперь по умолчанию равен True. (Автор – William Mallard, issue 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 с момента появления циклического сборщика мусора.
См. также
- PEP 442 – Безопасная финализация объектов
- PEP написан и реализован Antoine Pitrou.
PEP 456: Безопасный и взаимозаменяемый хэш-алгоритм¶PEP 456: Secure and Interchangeable Hash Algorithm
PEP 456 продолжает предыдущую работу по исправлению безопасности хеш-алгоритма Python для устранения определённых DOS-атак, которым могут быть подвержены публичные API, использующие словари. (См. issue 14621 для начала текущего раунда улучшений.) PEP унифицирует код хеширования CPython, чтобы упростить замену хеш-алгоритма упаковщикам, и меняет реализацию по умолчанию на SipHash на платформах, поддерживающих 64-битный тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV несущественны.
PEP добавляет дополнительные поля в struct sequence 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. (Добавлено Мартином фон Лёвисом в issue 17162.)
- Новое API предварительной инициализации Py_SetStandardStreamEncoding() позволяет приложениям, встраивающим интерпретатор CPython, надёжно задавать определённую кодировку и обработчик ошибок для стандартных потоков. (Добавлено Bastien Montagne и Nick Coghlan в issue 16129.)
- Большинство C API Python, которые не изменяют строковые аргументы, теперь корректно помечены как принимающие const char * вместо char *. (Добавлено Serhiy Storchaka в issue 1772673.)
- Новая шелл-версия python-config может использоваться даже при отсутствии интерпретатора python (например, в сценариях кросс-компиляции).
- PyUnicode_FromFormat() теперь поддерживает спецификаторы ширины и точности для %s, %A, %U, %V, %S и %R. (Добавлено Ysj Ray и Victor Stinner в issue 7330.)
- Новая функция PyStructSequence_InitType2() дополняет существующую функцию PyStructSequence_InitType(). Отличие в том, что она возвращает 0 при успехе и -1 при неудаче.
- Исходный код CPython теперь можно компилировать с использованием функций проверки корректности адресов (address sanity checking) последних версий GCC и clang: ложные срабатывания в аллокаторе мелких объектов были подавлены. (Добавлено Dhiru Kholia в issue 18596.)
- Сборка для Windows теперь использует Address Space Layout Randomization и Data Execution Prevention. (Добавлено Christian Heimes в issue 16632.)
- Новая функция PyObject_LengthHint() является эквивалентом operator.length_hint() в C API. (Добавлено Armin Ronacher в issue 16148.)
Другие улучшения¶Other Improvements
- Команда python имеет новую опцию, -I, которая запускает интерпретатор в «изолированном режиме»: это означает, что sys.path не содержит ни каталог скрипта, ни пользовательский каталог site-packages, а все переменные окружения PYTHON* игнорируются (подразумевается как -s, так и -E). В будущем могут быть добавлены и другие ограничения, направленные на изоляцию выполнения скрипта от окружения пользователя. Это уместно, например, когда Python используется для запуска системного скрипта. В большинстве POSIX-систем это можно и нужно использовать в #!-строке системных скриптов. (Добавлено Christian Heimes в issue 16499.)
- Автодополнение по табуляции теперь включено по умолчанию в интерактивном интерпретаторе на системах, поддерживающих readline. История также включена по умолчанию и записывается (и читается) в файл ~/.python-history. (Добавлено Antoine Pitrou и Éric Araujo в issue 5845.)
- Вызов интерпретатора Python с --version теперь выводит версию в стандартный вывод вместо стандартного потока ошибок (issue 18338). Аналогичные изменения были внесены в argparse (issue 18920) и другие модули, поддерживающие вызов в стиле скриптов (issue 18922).
- Установщик CPython для Windows теперь добавляет .py в переменную PATHEXT при регистрации расширений, позволяя пользователям запускать скрипт python в командной строке Windows, просто вводя его имя без расширения .py. (Добавлено Paul Moore в issue 18569.)
- Новая цель make coverage-report собирает python, запускает набор тестов и генерирует HTML-отчёт о покрытии для кодовой базы на C с помощью gcov и lcov.
- Опция -R набора регрессионных тестов python теперь также проверяет утечки выделения памяти, используя sys.getallocatedblocks(). (Добавлено Antoine Pitrou в issue 13390.)
- python -m теперь работает с пакетами пространств имён (namespace packages).
- Модуль stat теперь реализован на C, что означает, что он получает значения своих констант из заголовочных файлов C, а не из жёстко заданных значений в модуле python, как было ранее.
- Загрузка нескольких модулей python из одного OS-модуля (.so, .dll) теперь работает корректно (ранее она молча возвращала первый модуль python в файле). (Добавлено Václav Šmilauer в issue 16421.)
- Добавлена новая опкода LOAD_CLASSDEREF для исправления ошибки при загрузке свободных переменных в телах классов, которая могла быть вызвана определёнными использованиями __prepare__. (Добавлено Benjamin Peterson в issue 17853.)
- Ряд сбоев, связанных с MemoryError, был выявлен и исправлен Виктором Стиннером с помощью его инструмента pyfailmalloc, основанного на PEP 445 (issue 18408, issue 18520).
- Команда pyvenv теперь принимает опцию --copies, чтобы использовать копии вместо симлинков, даже в системах, где симлинки используются по умолчанию. (Добавлено Vinay Sajip в issue 18807.)
- Команда pyvenv также принимает опцию --without-pip для подавления автоматической загрузки pip в виртуальное окружение. (Добавлено Nick Coghlan в issue 19552 в рамках реализации PEP 453.)
- Имя кодировки теперь является необязательным в значении переменной окружения PYTHONIOENCODING. Это позволяет задать только обработчик ошибок, не меняя кодировку по умолчанию. (Добавлено Serhiy Storchaka в issue 18818.)
- Функции open модулей bz2, lzma и gzip теперь поддерживают режим x (исключительное создание). (Добавлено Tim Heaney и Vajrasky Kok в issue 19201, issue 19222 и issue 19223.)
Значительные оптимизации¶Significant Optimizations
- Декодер UTF-32 теперь работает в 3–4 раза быстрее. (Добавлено Serhiy Storchaka в issue 14625.)
- Стоимость коллизий хешей для множеств теперь снижена. Каждый проб в хеш-таблице теперь проверяет серию последовательных смежных пар ключ/хеш перед продолжением случайных проб по таблице. Это использует локальность кэша, чтобы сделать разрешение коллизий менее дорогим. Схема разрешения коллизий может быть описана как гибрид линейного пробирования и открытой адресации. Число дополнительных линейных проб по умолчанию равно девяти. Это можно изменить на этапе компиляции, определив LINEAR_PROBES в любое значение. Установите LINEAR_PROBES=0, чтобы полностью отключить линейное пробирование. (Добавлено Raymond Hettinger в issue 18771.)
- Интерпретатор запускается примерно на 30% быстрее. Ускорение достигнуто за счёт нескольких мер. При запуске загружается меньше модулей: например, модули re, collections и locale и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен для более быстрой загрузки скомпилированного кода Python. (Добавлено Antoine Pitrou, Christian Heimes и Victor Stinner в issue 19219, issue 19218, issue 19209, issue 19205 и issue 9548.)
- bz2.BZ2File is now as fast or faster than the Python2 version for most cases. lzma.LZMAFile has also been optimized. (Contributed by Serhiy Storchaka and Nadeem Vawda in issue 16034.)
- random.getrandbits() работает на 20–40% быстрее для небольших целых чисел (наиболее частый случай использования). (Добавлено Serhiy Storchaka в issue 16674.)
- Благодаря новому формату хранения строк, сериализация (pickling) строк теперь выполняется значительно быстрее. (Добавлено Victor Stinner и Antoine Pitrou в issue 15596.)
- Проблема производительности в io.FileIO.readall() решена. Это особенно затрагивает Windows и значительно ускоряет передачу значительных объёмов данных через подпроцесс. (Вклад Richard Oudkerk в issue 15758.)
- html.escape() теперь работает в 10 раз быстрее. (Добавлено Matt Bryant в issue 18020.)
- На Windows теперь используется нативная функция VirtualAlloc вместо CRT malloc в obmalloc. Искусственные тесты показывают экономию памяти около 3%.
- os.urandom() теперь использует лениво открываемый постоянный файловый дескриптор, чтобы не расходовать много файловых дескрипторов при параллельном запуске из нескольких потоков. (Автор: Antoine Pitrou в issue 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(); все методы xxxLoader ABC load_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
- Запуск IDLE с флагом -n (без подпроцесса) устарел. Однако эта возможность не будет удалена, пока не будет решена issue 18823.
- Добавление модулем site каталога «site-python» в sys.path, если он существует, устарело (issue 19375).
Удалено¶Removed
Операционные системы, поддержка которых прекращена¶Operating Systems No Longer Supported
Поддержка следующих операционных систем удалена из исходного кода и средств сборки:
- OS/2 (issue 16135).
- Windows 2000 (изменение e52df05b496a).
- Системы Windows, где COMSPEC указывает на command.com (issue 14470).
- VMS (issue 16136).
Удаление API и функций¶API and Feature Removals
Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:
- Не поддерживаемые каталоги Misc/TextMate и Misc/vim были удалены (см. devguide для предложений по замене).
- Макрос SO makefile удалён (заменён макросами SHLIB_SUFFIX и EXT_SUFFIX) (issue 16754).
- Поле PyThreadState.tick_counter удалено; его значение не имело смысла начиная с Python 3.2, когда был введён «новый GIL» (issue 19199).
- PyLoader и PyPycLoader были удалены из importlib. (Автор: Taras Lyapun в issue 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. (Автор: Dan Riti в issue 15480.)
- inspect.Signature: теперь для позиционно-ключевых параметров требуется указывать допустимое имя.
- object.__format__() больше не принимает непустые строки формата; вместо этого теперь генерируется TypeError. Использование непустой строки было устаревшим начиная с Python 3.2. Это изменение сделано для предотвращения ситуации, когда ранее работающий (но некорректный) код начинал давать сбой, если объект получал метод __format__, что означает, что ваш код теперь может генерировать TypeError, если вы используете код формата 's' с объектами, у которых нет метода __format__, обрабатывающего его. См. issue 7994 для контекста.
- difflib.SequenceMatcher.isbjunk() и difflib.SequenceMatcher.isbpopular() были устаревшими начиная с 3.2 и теперь удалены: используйте x in sm.bjunk и x in sm.bpopular, где sm – это объект SequenceMatcher (issue 13248).
Очистка кода¶Code Cleanups
- Неиспользуемый и недокументированный внутренний класс Scanner удалён из модуля pydoc.
- Частный и по сути неиспользуемый модуль _gestalt удалён вместе с частными функциями platform _mac_ver_lookup, _mac_ver_gstalt и _bcd2str, которые могли вызываться только на сильно сломанных системах OS X (см. issue 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 ссылок, Y блоков] отладочной (--with-pydebug) сборки интерпретатора CPython теперь по умолчанию отключён. Его можно включить снова с помощью опции -X showrefcount. (Автор: Ezio Melotti, issue 17323.)
- Команда python и большинство скриптов стандартной библиотеки (а также argparse) теперь выводят информацию --version в stdout вместо stderr (список задач см. в Other Improvements выше).
Изменения в Python API¶Changes in the Python API
- АБС, определённые в importlib.abc, теперь либо возбуждают соответствующее исключение, либо возвращают значение по умолчанию вместо слепого возбуждения NotImplementedError. Это затронет только код, вызывающий super() и проходящий через всю цепочку до АБС. Для обратной совместимости перехватывайте как NotImplementedError, так и соответствующее исключение, если необходимо.
- Тип module теперь инициализирует атрибуты __package__ и __loader__ значением None по умолчанию. Чтобы определить, были ли эти атрибуты установлены обратно-совместимым образом, используйте, например, getattr(module, '__loader__', None) is not None. (issue 17115.)
- importlib.util.module_for_loader() теперь безусловно устанавливает __loader__ и __package__ для корректной поддержки перезагрузки. Если это нежелательно, устанавливайте эти атрибуты вручную. Для управления модулями можно использовать importlib.util.module_to_load().
- При перезагрузке импорт теперь безусловно сбрасывает соответствующие атрибуты (например, __name__, __loader__, __package__, __file__, __cached__). Обратите внимание: это восстанавливает поведение, существовавшее до версии 3.3, а именно: модуль при перезагрузке находится заново (issue 19413).
- Замороженные пакеты больше не устанавливают __path__ в список, содержащий имя пакета; теперь они устанавливают его в пустой список. Прежнее поведение могло приводить к неправильной работе системы импорта при импорте вложенных модулей, если существовал каталог с тем же именем, что и замороженный пакет. Правильный способ определить, является ли модуль пакетом, – использовать hasattr(module, '__path__') (issue 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() has been reimplemented on top of inspect.signature() and hence handles a much wider variety of callable objects than it did in the past. It is expected that additional builtin and extension module callables will gain signature metadata over the course of the Python 3.4 series. Code that assumes that inspect.getfullargspec() will fail on non-Python callables may need to be adjusted accordingly.
- importlib.machinery.PathFinder теперь передаёт текущий рабочий каталог объектам в sys.path_hooks для пустой строки. В результате sys.path_importer_cache никогда не содержит '', поэтому итерация по sys.path_importer_cache на основе sys.path не найдёт все ключи. Атрибут __file__ модуля при импорте в текущем рабочем каталоге теперь также будет содержать абсолютный путь, в том числе при использовании -m с интерпретатором (за исключением __main__.__file__, когда скрипт был выполнен напрямую с относительным путём) (Автор: Brett Cannon, issue 18416). (issue 18416).
- Удаление аргумента strict у HTTPConnection и HTTPSConnection изменяет значение остальных аргументов, если они указываются позиционно, а не по ключевому слову. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать любые дополнительные аргументы через ключевые слова.
- Строки между операторами from __future__ import ... теперь всегда возбуждают SyntaxError. Ранее, если не было ведущей строки документации, промежуточная строка иногда игнорировалась. Это приводит CPython в соответствие со спецификацией языка; Jython и PyPy уже ей соответствовали. (issue 17434).
- ssl.SSLSocket.getpeercert() и ssl.SSLSocket.do_handshake() теперь возбуждают OSError с ENOTCONN, когда SSLSocket не подключён, вместо прежнего поведения – возбуждения AttributeError. Кроме того, getpeercert() возбудит ValueError, если рукопожатие ещё не выполнено.
- base64.b32decode() теперь возбуждает binascii.Error, когда входная строка содержит символы, не входящие в алфавит base32, вместо TypeError. Этот конкретный TypeError был пропущен при преобразовании остальных TypeError. (Автор: Serhiy Storchaka, issue 18011.) Примечание: это изменение также было случайно применено в Python 3.3.3.
- Атрибут file теперь автоматически закрывается, когда создавший его экземпляр cgi.FieldStorage удаляется сборщиком мусора. Если вы извлекали файловый объект отдельно от экземпляра cgi.FieldStorage и не поддерживали существование самого экземпляра, то вам следует либо хранить весь экземпляр cgi.FieldStorage, либо читать содержимое файла до того, как экземпляр cgi.FieldStorage будет удалён сборщиком мусора.
- Вызов read или write на закрытом SSL-сокете теперь возбуждает информативное ValueError вместо прежнего более загадочного AttributeError (issue 9177).
- slice.indices() больше не возбуждает OverflowError для огромных значений. Как следствие этого исправления, slice.indices() теперь возбуждает ValueError, если передана отрицательная длина; ранее возвращались бессмысленные значения (issue 14794).
- Конструктор complex, в отличие от функций cmath, некорректно принимал значения float, если специальный метод __complex__ объекта возвращал такое значение. Теперь это возбуждает TypeError. (issue 16290.)
- Конструктор int в версиях 3.2 и 3.3 ошибочно принимал значения float для параметра base. Маловероятно, что кто-то так делал, но если да, то теперь это будет возбуждать TypeError (issue 16772).
- Значения по умолчанию для аргументов, задаваемых только по ключевому слову, теперь вычисляются после значений по умолчанию для обычных ключевых аргументов, а не до. Будем надеяться, что никто не написал код, зависящий от предыдущего ошибочного поведения (issue 16967).
- Устаревшие состояния потоков теперь очищаются после fork(). Это может привести к освобождению некоторых системных ресурсов, которые ранее некорректно сохранялись постоянно живыми (например, соединения с базой данных, хранящиеся в хранилище, локальном для потока). (issue 17094.)
- Имена параметров в словарях __annotations__ теперь корректно искажаются, аналогично __kwdefaults__. (Автор: Yury Selivanov, issue 20625.)
- hashlib.hash.name теперь всегда возвращает идентификатор в нижнем регистре. Ранее некоторые встроенные хеши имели имена в верхнем регистре, но теперь, когда это формальный публичный интерфейс, именование стало единообразным (issue 18532).
- Because unittest.TestSuite now drops references to tests after they are run, test harnesses that re-use a TestSuite to re-run a set of tests may fail. Test suites should not be re-used in this fashion since it means state is retained between test runs, breaking the test isolation that unittest is designed to provide. However, if the lack of isolation is considered acceptable, the old behavior can be restored by creating a TestSuite subclass that defines a _removeTestAtIndex method that does nothing (see TestSuite.__iter__()) (issue 11798).
- unittest теперь использует argparse для разбора командной строки. Некоторые некорректные формы команд, которые раньше работали, больше не разрешены; теоретически это не должно вызывать проблем обратной совместимости, поскольку запрещённые формы команд не имели смысла и вряд ли использовались.
- Функции re.split(), re.findall() и re.sub(), а также методы group() и groups() объектов match теперь всегда возвращают объект bytes, когда строка для сопоставления является bytes-like object. Ранее возвращаемый тип соответствовал входному типу, поэтому, если ваш код зависел от того, что возвращаемое значение было, скажем, bytearray, вам потребуется изменить код.
- Функции audioop теперь немедленно возбуждают ошибку, если им передаётся строковый ввод, вместо того чтобы случайным образом ошибаться позже (issue 16685).
- Новый аргумент convert_charrefs у HTMLParser по умолчанию равен False для обратной совместимости, но в конечном итоге будет изменён на True. Рекомендуется добавить это ключевое слово с соответствующим значением во все вызовы HTMLParser в вашем коде (issue 13633).
- Поскольку у аргумента digestmod функции hmac.new() в будущем не будет значения по умолчанию, все вызовы hmac.new() следует изменить, чтобы явно указывать digestmod (issue 17276).
- Вызов sysconfig.get_config_var() с ключом SO или поиск SO в результатах вызова sysconfig.get_config_vars() устарел. Этот ключ следует заменить на EXT_SUFFIX или SHLIB_SUFFIX в зависимости от контекста (issue 19555).
- Любые вызовы функций open, в которых указан U, следует исправить. U не действует в Python3 и при использовании со временем вызовет ошибку. В зависимости от функции эквивалент её старого поведения в Python2 можно получить либо с помощью аргумента newline, либо, если необходимо, обернув поток в TextIOWrapper и воспользовавшись его аргументом newline (issue 15204).
- При использовании pyvenv в скрипте, если требуется, чтобы pip не устанавливался, необходимо добавить --without-pip в команду вызова.
- Поведение по умолчанию json.dump() и json.dumps() при указании отступа изменилось: теперь они не добавляют завершающие пробелы после запятых, разделяющих элементы в конце строк. Это будет иметь значение только в том случае, если тесты выполняют сравнение такого вывода с учётом пробельных символов (issue 16333).
- doctest теперь ищет доктесты в строках __doc__ модулей расширения, поэтому, если обнаружение доктестов включает модули расширения, содержащие нечто похожее на доктесты, при запуске тестов могут возникнуть ошибки, которых раньше не было (issue 3158).
- Модуль collections.abc был немного реорганизован в рамках улучшения запуска Python. В результате импорт collections больше не приводит к автоматическому импорту collections.abc. Если программа полагалась на этот (недокументированный) неявный импорт, необходимо добавить явный import collections.abc (issue 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() (issue 16742).
- PyThread_set_key_value() теперь всегда устанавливает значение. В Python 3.3 эта функция ничего не делала, если ключ уже существовал (если текущее значение было не-NULL указателем).
- Поле f_tstate (состояние потока) структуры PyFrameObject было удалено для исправления ошибки: обоснование см. в issue 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, теперь будут проверять, что сервер предоставляет сертификат, подписанный центром сертификации (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)