Что нового в Python 3.4

Автор:Р. Дэвид Мюррей (редактор)

В данной статье объясняются новые возможности Python 3.4 по сравнению с 3.3. Python 3.4 был выпущен 16 марта 2014 г. Для получения полной информации см. новости.

См.также

PEP 429 – Расписание релиза Python 3.4

Резюме – Основные моменты релиза

Новые возможности синтаксиса:

  • В Python 3.4 не было добавлено никаких новых синтаксических функций.

Другие новые функции:

Новые модули библиотеки:

Значительно улучшены модули библиотеки:

Улучшения безопасности:

Улучшения реализации CPython:

Пожалуйста, ознакомьтесь с полным списком пользовательских изменений, включая множество других небольших улучшений — оптимизацию CPython, устаревание и потенциальные проблемы переноса.

Новые особенности

PEP 453: Явная начальная загрузка PIP в установках Python

Начальная загрузка по умолчанию

Новый модуль ensurepip (определённый в PEP 453) предоставляет стандартный кроссплатформенный механизм для начальной загрузки установщика pip в установки Python и виртуальные среды. Версия pip, включённая в Python 3.4.0, — это pip 1.5.4, а будущие релизы обслуживания 3.4.x будут обновлять связанную версию до последней версии pip, доступной на момент создания кандидата на релиз.

По умолчанию команды pipX и pipX.Y будут установлены на всех платформах (где XY обозначает версию установки Python) вместе с Python пакетом pip и его зависимостями. В Windows и в виртуальных средах на всех платформах также будет установлена неверсионная команда pip. На других платформах общесистемная неверсионная команда pip обычно относится к отдельно установленной версии Python 2.

Утилита командной строки pyvenv и модуль venv используют модуль ensurepip, чтобы сделать pip легко доступным в виртуальных средах. При использовании утилиты командной строки pip устанавливается по умолчанию, а при использовании модуля venv API установка pip должна быть запрошена явно.

Для CPython исходники сборки на системах POSIX команды make install и make altinstall по умолчанию загружают pip. Этим поведением можно управлять с помощью параметров конфигурации и переопределять с помощью параметров Makefile.

В Windows и Mac OS X установщики CPython теперь по умолчанию устанавливают pip вместе с самим CPython (пользователи могут отказаться от его установки в процессе установки). Пользователям Windows необходимо согласиться на автоматические модификации PATH, чтобы pip был доступен из командной строки по умолчанию, в противном случае к нему по-прежнему можно получить доступ через запускальщик Python для Windows как py -m pip.

Как обсуждалось в PEP, упаковщики платформ могут не устанавливать данные команды по умолчанию, если при вызове они предоставляют чёткие и простые инструкции по их установке на этой платформе (обычно с помощью системного диспетчера пакетов).

Примечание

Чтобы избежать конфликтов между параллельными установками Python 2 и Python 3, только версионные команды pip3 и pip3.4 загружаются по умолчанию, когда ensurepip вызывается напрямую — параметр --default-pip необходим, чтобы также запросить команду pip без версии. pyvenv и установщик Windows обеспечивают доступность неполной команды pip в данных средах, а pip всегда можно вызвать с помощью опции -m, а не напрямую, чтобы избежать неоднозначности в системах с несколькими установками Python.

Изменения в документации

В рамках этого изменения разделы документации Установка модулей Python и Распространение модулей Python были полностью переработаны в виде краткого руководства по началу работы и часто задаваемых вопросов. Большая часть документации по упаковке теперь перемещена в Руководство пользователя по пакетизации Python, а также документация по отдельным проектам.

Однако, поскольку миграция в настоящее время все ещё не завершена, устаревшие версии данных руководств остаются доступными как Установка модулей Python (устаревшая версия) и Распространение Python модулей (устаревшая версия).

См.также

PEP 453 – Явная загрузка pip в установках Python
PEP, написан Дональдом Стаффтом и Ником Когланом, реализован Дональдом Стаффтом, Ником Когланом, Мартином фон Лёвисом и Недом Дейли.

PEP 446: Вновь созданные файловые дескрипторы не подлежат наследованию

PEP 446 создаёт вновь созданные файловые дескрипторы не наследуемыми. В общем, это то поведение, которое желательно приложению: при запуске нового процесса открытые в данный момент файлы также открыты в новом процессе, что может привести к всевозможным трудным для поиска ошибкам и, возможно, к проблемам безопасности.

Однако бывают случаи, когда требуется наследование. Для поддержки данных случаев доступны следующие новые функции и методы:

См.также

PEP 446 – Сделать вновь созданные файловые дескрипторы ненаследуемыми
PEP написан и реализован Виктором Стиннером.

Улучшения в обработке кодеков

С момента своего первого появления модуль codecs всегда предназначался для работы в качестве независимой от типа системы динамического кодирования и декодирования. Однако его тесная связь с текстовой моделью Python, особенно с ограниченными по типам удобными методами для встроенных типов str, bytes и bytearray, исторически скрывала данный факт.

В качестве ключевого шага в прояснении ситуации вспомогательные функции codecs.encode() и codecs.decode() теперь должным образом задокументированы в Python 2.7, 3.3 и 3.4. Данные функции существовали в модуле codecs (и были покрыты набором регрессионных тестов) начиная с Python 2.4, но ранее их можно было обнаружить только посредством самоанализа во время выполнения.

В отличие от вспомогательных методов в str, bytes и bytearray, вспомогательные функции codecs поддерживают произвольные кодеки как в Python 2, так и в Python 3, а не ограничиваются текстовыми Юникод кодировками (в Python 3) или преобразованиями basestring <-> basestring (в Python 2).

В Python 3.4 интерпретатор может идентифицировать известные нетекстовые кодировки, представленные в стандартной библиотеке, и при необходимости направлять пользователей к удобным функциям общего назначения:

>>> b"abcdef".decode("hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

>>> "hello".encode("rot13")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs

В связанном изменении, когда это возможно без нарушения обратной совместимости, исключения, возникающие во время операций кодирования и декодирования, заключаются в связанное исключение того же типа, в котором упоминается имя кодека, ответственного за создание ошибки:

>>> import codecs

>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
    return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found

Вышеупомянутое исключение было прямой причиной следующего исключения:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
  File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
    return (bz2.compress(input), len(input))
  File "/usr/lib/python3.4/bz2.py", line 498, in compress
    return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface

Вышеупомянутое исключение было прямой причиной следующего исключения:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)

Наконец, как показывают приведённые выше примеры, данные улучшения позволили восстановить удобные псевдонимы для кодеков, отличных от Юникода, которые сами были восстановлены в Python 3.2. Это означает, что кодирование двоичных данных в шестнадцатеричное представление и обратно (например) теперь можно записать так:

>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'

Двоичные и текстовые преобразования, предоставляемые стандартной библиотекой, подробно описаны в Бинарные преобразования и Текстовые преобразования.

(Предоставлено Ником Когланом в bpo-7475, bpo-17827, bpo-17828 и bpo-19619.)

PEP 451: тип ModuleSpec для системы импорта

PEP 451 обеспечивает инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (т. е. спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько связанных с импортом API. Это изменение также является ступенькой для нескольких будущих улучшений, связанных с импортом.

Общедоступные изменения из PEP полностью совместимы с предыдущими версиями. Кроме того, они должны быть прозрачными для всех, кроме авторов-импортеров. Методы поиска ключей и загрузчика устарели, но они продолжат работать. Новые импортёры должны использовать новые методы, описанные в PEP. Существующие импортёры должны быть обновлены для реализации новых методов. См. в разделе Устарело список методов, которые следует заменить, и их замены.

Другие языковые изменения

Некоторые небольшие изменения, внесённые в основной язык Python:

  • База данных Юникод обновлена до UCD версии 6.3.
  • min() и max() теперь принимают только ключевой аргумент default, который можно использовать для указания возвращаемого значения, если вычисляемая итерация, не имеет элементов. (Предоставлено Джулианом Берманом в bpo-18111.)
  • Объекты модуля теперь поддерживают weakref.
  • Атрибуты модуля __file__ (и связанные значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением __main__.__file__, когда сценарий был выполнен непосредственно с использованием относительного пути. (Предоставлено Бреттом Кэнноном в bpo-18416.)
  • Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты во время кодирования и декодирования, если только не используется обработчик ошибок surrogatepass, за исключением декодера UTF-16 (принимающий допустимые пары суррогатов) и UTF-16 кодировщик (создаёт их при кодировании символов, отличных от BMP). (Предоставлено Виктором Стиннером, Канг-Хао (Кенни) Лу и Сергеем Сторчакой в bpo-12892.)
  • Новый немецкий EBCDIC кодек cp273. (Предоставлено Майклом Биренфельдом и Эндрю Кухлингом в bpo-1097797.)
  • Новый украинский кодек cp1125. (Предоставил Сергей Сторчака в bpo-19668.)
  • bytes.join() и bytearray.join() теперь принимают произвольные объекты буфера в качестве аргументов. (Предоставлено Антуаном Питру в bpo-15958.)
  • Конструктор int теперь принимает любой объект, который имеет метод __index__ в качестве аргумента base. (Предоставлено Марком Дикинсоном в bpo-16772.)
  • Объекты фрейма теперь имеют метод clear(), который удаляет все ссылки на локальные переменные из фрейма. (Предоставлено Антуаном Питру в bpo-17934.)
  • memoryview теперь зарегистрирован как Sequence и поддерживает встроенный reversed(). (Предоставлено Ником Когланом и Клаудиу Попа в bpo-18690 и bpo-19078.)
  • Сигнатуры, сообщаемые help(), были изменены и улучшены в нескольких случаях в результате введения Клиники споров и других изменений в модули inspect и pydoc.
  • __length_hint__() теперь является частью спецификации формального языка (см. PEP 424). (Предоставлено Армином Ронахером в bpo-16148.)

Новые модули

asyncio

Новый модуль asyncio (определённый в PEP 3156) предоставляет стандартную подключаемую модель цикла обработки событий для Python, обеспечивая надежную поддержку асинхронного ввода-вывода в стандартной библиотеке и упрощая взаимодействие других реализаций цикла обработки событий со стандартной библиотекой и друг с другом.

Для Python 3.4 этот модуль считается предварительным API.

См.также

PEP 3156 – Поддержка асинхронного ввода-вывода перезагружена: модуль «asyncio»
Написано PEP, а внедрение возглавил Гвидо ван Россумом.

ensurepip

Новый модуль ensurepip является основной инфраструктурой для реализации PEP 453. При обычном развитии событий конечным пользователям не нужно будет взаимодействовать с этим модулем, но его можно использовать для ручной загрузки pip, если автоматическая загрузка в установку или виртуальную среду была отклонена.

ensurepip включает связанную копию pip, актуальную на момент первого кандидата на релиз релиза CPython, с которым он поставляется (это относится как к отладочным выпускам, так и к выпускам функций). ensurepip не имеет доступа к Интернету. Если установка имеет доступ к Интернету, после запуска ensurepip связанный pip можно использовать для обновления pip до более позднего релиза, чем связанный. (Обратите внимание, что такая обновленная версия pip считается отдельно установленным пакетом и не будет удалена при удалении Python.)

Модуль называется ensurepip, потому что при вызове он ничего не делает, когда уже pip установлен. Он также имеет параметр --upgrade, который заставит его установить связанную копию pip, если существующая установленная версия pip старше, чем связанная копия.

enum

Новый модуль enum (определённый в PEP 435) обеспечивает стандартную реализацию типов перечисления, позволяя другим модулям (таким как socket) предоставлять более информативные сообщения об ошибках и улучшенную поддержку отладки за счёт замены непрозрачных целочисленных констант обратно совместимыми значениями перечисления.

См.также

PEP 435 – Добавление типа Enum в стандартную библиотеку Python
PEP, написанный Барри Варшавой, Эли Бендерски и Итаном Фурманом реализован Итаном Фурманом.

pathlib

Новый модуль pathlib предлагает классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на чистые пути, обеспечивающие чисто вычислительные операции без ввода-вывода, и наследуемые от чистых путей пути, также реализующие операции ввода-вывода.

Для Python 3.4 данный модуль считается предварительным API.

См.также

PEP 428 – Модуль pathlib – пути объектно-ориентированной файловой системы
PEP написан и реализован Антуаном Питру.

selectors

Новый модуль selectors (созданный как часть реализации PEP 3156) обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, основанное на примитивах модуля select.

statistics

Новый модуль statistics (определённый в PEP 450) предлагает некоторые основные функции статистики непосредственно в стандартной библиотеке. Данный модуль поддерживает расчёт среднего значения, медианы, моды, дисперсии и стандартного отклонения ряда данных.

См.также

PEP 450 – Добавление модуля Statistics в стандартную библиотеку
PEP написан и реализован Стивеном Д’Апрано

tracemalloc

Новый модуль tracemalloc (определённый в PEP 454) — это инструмент отладки для отслеживания блоков памяти, выделенных Python. Он предоставляет следующую информацию:

  • Отслеживание, где был размещён объект
  • Статистика по выделенным блокам памяти по имени файла и по номеру строки: общий размер, количество и средний размер выделенных блоков памяти
  • Вычисляет различия между двумя снимками для обнаружения утечек памяти

См.также

PEP 454 – Добавлен новый модуль tracemalloc для отслеживания распределения памяти Python
PEP написан и реализован Виктором Стиннером

Улучшенные модулей

abc

Новую функцию abc.get_cache_token() можно использовать, чтобы узнать, когда делать недействительными кэши, на которые влияют изменения в графе объектов. (Предоставлено Лукашем Лангой в bpo-16832.)

Новый класс ABC имеет метакласс ABCMeta. Использование ABC в качестве базового класса по существу предоставляет тот же эффект, что и указание metaclass=abc.ABCMeta, но его проще набирать и легче читать. (Предоставлено Бруно Дюпюи в bpo-16049.)

aifc

Метод getparams() теперь возвращает именованный кортеж, а не простой кортеж. (Предоставлено Клаудиу Попа в bpo-17818.)

aifc.open() теперь поддерживает протокол управления контекстом: при использовании в блоке with метод возвращаемого объекта close() будет вызываться автоматически в конце блока. (Предоставил Сергей Сторчача в bpo-16486.)

Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Предоставил Сергей Сторчака в bpo-8311.)

argparse

Класс FileType теперь принимает аргументы encoding и errors, которые передаются в open(). (Предоставлено Лукасом Майстре в bpo-11175.)

audioop

audioop теперь поддерживает 24-битные выборки. (Предоставлено Сергеем Сторчакой в bpo-12866.)

Новая функция byteswap() преобразует образцы с прямым порядком байтов в прямой и наоборот. (Предоставлено Сергеем Сторчакой в bpo-19641.)

Все функции audioop теперь принимают любой байтоподобный объект. Строки не принимаются: раньше не работали, теперь сразу выдают ошибку. (Предоставил Сергей Сторчака в bpo-16685.)

base64

Функции кодирования и декодирования в base64 теперь принимают любой байтоподобный объект в тех случаях, когда ранее требовался экземпляр bytes или bytearray. (Предоставлено Ником Когланом в bpo-17839.)

Новые функции a85encode(), a85decode(), b85encode() и b85decode() позволяют кодировать и декодировать двоичные данные из/в форматы Ascii85 и git/mercurial Base85 соответственно. Функции a85 имеют параметры, которые можно использовать для обеспечения их совместимости с вариантами кодировки Ascii85, включая вариант Adobe. (Предоставили Мартин Моррисон, проект Mercurial, Сергей Сторчака и Антуан Питру в bpo-17618.)

collections

Метод ChainMap.new_child() теперь принимает аргумент m, указывающий дочернее отображение для добавления в цепочку. Это позволяет использовать существующее отображение и/или пользовательский тип отображения для дочернего элемента. (Предоставлено Винаем Саджипом в bpo-16613.)

colorsys

Количество цифр в коэффициентах для преобразования RGB — YIQ было расширено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов должно быть менее 1% и может лучше совпадать с результатами, полученными в других местах. (Предоставлено Брайаном Ландерсом и Сергеем Сторчакой в bpo-14323.)

contextlib

Новый менеджер контекста contextlib.suppress помогает прояснить назначение кода, намеренно подавляющего исключения из одного оператора. (Предоставлено Рэймондом Хеттингером в bpo-15806 и Зеро Пирей в bpo-19266.)

Новый менеджер контекста contextlib.redirect_stdout() упрощает для служебных сценариев обработку негибких API, которые записывают свои выходные данные в sys.stdout и не предоставляют никаких параметров для его перенаправления. С помощью менеджера контекста вывод sys.stdout можно перенаправить в любой другой поток или, в сочетании с io.StringIO, в строку. Последнее может быть особенно полезно, например, для захвата вывода функции, написанной для реализации интерфейса командной строки. Рекомендуется только для служебных сценариев, поскольку влияет на глобальное состояние sys.stdout. (Предоставлено Рэймондом Хеттингером в bpo-15805.)

Документация contextlib также была обновлена, чтобы включить обсуждение различий между одноразовыми, повторно используемыми и реентерабельными менеджерами контекста.

dbm

Объекты dbm.open() теперь поддерживают протокол управления контекстом. При использовании в операторе with метод close объекта базы данных будет вызываться автоматически в конце блока. (Предоставлено Клаудиу Попа и Ником Когланом в bpo-19282.)

dis

Функции show_code(), dis(), distb() и disassemble() теперь принимают только ключевой аргумент file, который управляет тем, куда они записывают свои выходные данные.

Модуль dis теперь построен на основе класса Instruction, который обеспечивает объектно-ориентированный доступ к деталям каждой отдельной операции с байт-кодом.

Новый метод get_instructions() предоставляет итератор, который вызывает поток инструкций для данного фрагмента Python кода. Таким образом, теперь можно написать программу, которая проверяет объект байт-кода и манипулирует им способами, отличными от тех, что предоставляет сам модуль dis. Например:

>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
...     print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE

Различные инструменты отображения в модуле dis были переписаны для использования данных новых компонентов.

Кроме того, новый удобный для приложений класс Bytecode предоставляет объектно-ориентированный API для проверки байт-кода как в удобочитаемой форме, так и для повторения инструкций. Конструктор Bytecode принимает те же аргументы, что и get_instruction() (плюс необязательный current_offset), и результирующий объект можно повторять для создания объектов Instruction. Но у него также есть метод dis, эквивалентный вызову dis в аргументе конструктора, но возвращаемый как многострочная строка:

>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
...     print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()       
['  1           0 LOAD_FAST                0 (x)',
 '      -->     3 LOAD_CONST               1 (1)',
 '              6 BINARY_ADD',
 '              7 RETURN_VALUE']

У Bytecode также есть метод класса from_traceback(), который обеспечивает возможность управления трассировкой (т. е. print(Bytecode.from_traceback(tb).dis()) эквивалентен distb(tb)).

(Предоставили Ник Коглан, Райан Келли и Томас Клюйвер в bpo-11816 и Клаудиу Попа в bpo-17916.)

Новая функция stack_effect() вычисляет влияние заданного кода операции и аргумента на стек Python, информация, которая иначе недоступна. (Предоставлено Ларри Гастингсом в bpo-19722.)

doctest

Новый флаг опции, FAIL_FAST останавливает выполнение теста, как только обнаруживается первый сбой. (Предоставлено Р. Дэвидом Мюрреем и Дэниелом Урбаном в bpo-16522.)

Интерфейс командной строки doctest теперь использует argparse и имеет два новых параметра: -o и -f. -o позволяет указать опции doctest в командной строке, а -f является сокращением для -o FAIL_FAST (для параллелизма аналогичной опции, поддерживаемой интерфейсом командной строки unittest). (Предоставлено Р. Дэвидом Мюрреем в bpo-11390.)

doctest теперь находит доктесты в строках модуля расширения __doc__. (Предоставлено Закари Уэр в bpo-3158.)

email

as_string() теперь принимает аргумент policy, чтобы переопределить политику сообщения по умолчанию при создании его строкового представления. Это означает, что as_string теперь можно использовать в большем количестве случаев, вместо того, чтобы создавать и использовать generator для передачи параметров форматирования в его метод flatten. (Предоставлено Р. Дэвидом Мюрреем в bpo-18600.)

Добавлен новый метод as_bytes() для создания байтового представления сообщения аналогично тому, как as_string создаёт строковое представление. Он не принимает аргумент maxheaderlen, но принимает аргументы unixfrom и policy. Метод Message __bytes__() вызывает его, а это означает, что bytes(mymsg) теперь вызывает интуитивно понятный результат: байтовый объект, содержащий полностью отформатированное сообщение. (Предоставлено Р. Дэвидом Мюрреем в bpo-18600.)

Сообщение Message.set_param() теперь принимает ключевой аргумент replace. Если указано, связанный заголовок будет обновлён без изменения его положения в списке заголовков. Для обратной совместимости по умолчанию используется False. (Предоставлено Р. Дэвидом Мюрреем в bpo-18891.)

Добавлена пара новых подклассов Message (EmailMessage и MIMEPart), а также новый подмодуль contentmanager и новый атрибут policy content_manager. Вся документация в настоящее время находится в новом модуле, который добавляется как часть нового модуля электронной почты предварительного API. Данные классы предоставляют ряд новых методов, которые значительно упрощают извлечение содержимого и вставку содержимого в сообщения электронной почты. Дополнительные сведения см. в документации contentmanager и email: примеры. Данные добавления API завершают большую часть работы, запланированной в рамках проекта email6. Планируется, что текущий предварительный API станет окончательным в Python 3.5 (возможно, с несколькими незначительными дополнениями в области обработки ошибок). (Предоставлено Р. Дэвидом Мюрреем в bpo-18891.)

filecmp

Новая функция clear_cache() позволяет очистить кэш сравнения filecmp, который использует информацию os.stat(), чтобы определить, изменился ли файл с момента последнего сравнения. Это можно использовать, например, если файл мог быть изменён и перепроверен за меньшее время, чем разрешение поля времени модификации файла файловой системы. (Предоставлено Марком Левиттом в bpo-18149.)

Новый атрибут модуля DEFAULT_IGNORES предоставляет список каталогов, которые используются в качестве значения по умолчанию для параметра ignore функции dircmp(). (Предоставлено Эли Бендерски в bpo-15442.)

functools

Новый дескриптор partialmethod() обеспечивает применение частичных аргументов к дескрипторам точно так же, как partial() обеспечивает обычные вызываемые объекты. Новый дескриптор также упрощает получение произвольных вызываемых объектов (включая экземпляры partial()), чтобы они вели себя как обычные методы экземпляра при включении в определение класса. (Предоставлено Алоном Хоревым и Ником Когланом в bpo-4331.)

Новый декоратор singledispatch() обеспечивает поддержку универсальных функций с одной отправкой в стандартной библиотеке Python. В то время как объектно-ориентированное программирование фокусируется на группировании нескольких операций с общим набором данных в класс, универсальная функция фокусируется на группировании нескольких реализаций операции, что позволяет ей работать с разными типами данных.

См.также

PEP 443 – Общие функции с одиночной диспетчеризацией
PEP написан и реализован Лукашем Лангой.

total_ordering() теперь поддерживает возвращаемое значение NotImplemented из базовой функции сравнения. (Предоставлено Кэти Миллер в bpo-10042.)

Версия функции partial() для чистого Python теперь находится в stdlib; в CPython он переопределяется ускоренной версией C, но доступен для использования другими реализациями. (Предоставлено Брайаном Торном в bpo-12428.)

gc

Новая функция get_stats() возвращает список из трёх словарей для каждого поколения, содержащих статистику коллекций с момента запуска интерпретатора. (Предоставлено Антуаном Питру в bpo-16351.)

glob

Новая функция escape() позволяет экранировать специальные символы в имени файла, чтобы они не становились частью подстановочного расширения, а вместо этого сопоставлялись буквально. (Предоставил Сергей Сторчака в bpo-8402.)

hashlib

Новая функция hashlib.pbkdf2_hmac() предоставляет PKCS#5 функцию получения ключа на основе пароля 2. (Предоставлено Кристианом Хеймсом в bpo-18582.)

Атрибут name хеш-объектов hashlib теперь является официально поддерживаемым интерфейсом. Он всегда существовал в hashlib CPython (хотя не возвращал имена в нижнем регистре для всех поддерживаемых хэшей), но атрибут не был общедоступным интерфейсом, поэтому другие реализации Python ранее его не поддерживали. (Предоставлено Джейсоном Р. Кумбсом в bpo-18532.)

hmac

hmac теперь принимает bytearray, а также bytes для аргумента key функции new(), а параметр msg как для функции new(), так и для метода update() теперь принимает любой тип, поддерживаемый модулем hashlib`3. (Предоставлено Йонасом Боргстрёмом в :issue:`18240.)

Аргумент digestmod функции hmac.new() теперь может быть любым именем хеш-дайджеста, распознаваемым hashlib. Кроме того, текущее поведение, при котором значение digestmod по умолчанию равно MD5, устарело: в будущей версии Python не будет значения по умолчанию. (Предоставлено Кристианом Хеймсом в bpo-17276.)

С добавлением атрибутов block_size и name (и формальной документации атрибута digest_size) модуль hmac теперь полностью соответствует API PEP 247. (Предоставлено Кристианом Хеймсом в bpo-18775.)

html

Новая функция unescape() преобразует ссылки на символы HTML5 в соответствующие Юникод символы. (Предоставлено Эцио Мелотти в bpo-2927.)

HTMLParser принимает новый ключевой аргумент convert_charrefs, который при True автоматически преобразует все ссылки на символы. Для обратной совместимости его значение по умолчанию равно False, но оно изменится на True в будущей версии Python, поэтому вам предлагается установить его явно и обновить свой код, чтобы использовать эту новую функцию. (Предоставлено Эцио Мелотти в bpo-13633.)

Аргумент strict HTMLParser теперь устарел. (Предоставлено Эцио Мелотти в bpo-15114.)

http

send_error() теперь принимает необязательный дополнительный параметр explain, который можно использовать для предоставления расширенного описания ошибки, переопределяя жёстко заданное значение по умолчанию, если оно есть. Это расширенное описание ошибки будет отформатировано с использованием атрибута error_message_format и отправлено как тело ответа об ошибке. (Предоставлено Карлом Коу в bpo-12921.)

http.server интерфейс командной строки теперь имеет параметр -b/--bind, который заставляет сервер прослушивать определённый адрес. (Предоставлено Мальте Сварт в bpo-17764.)

idlelib и IDLE

Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для импорта другими программами, с каждым выпуском он совершенствуется. См. Lib/idlelib/NEWS.txt для получения сводного списка изменений с версии 3.3.0, а также изменений, внесенных в будущие версии 3.4.x. Данный файл также доступен в диалоговом окне IDLE Help ‣ About IDLE.

importlib

InspectLoader ABC определяет новый метод source_to_code(), который принимает исходные данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна compile(data, path, 'exec', dont_inherit=True). (Предоставлено Эриком Сноу и Бреттом Кэнноном в bpo-15627.)

InspectLoader также теперь имеет реализацию по умолчанию для метода get_code(). Однако обычно желательно переопределить реализацию по умолчанию из соображений производительности. (Предоставлено Бреттом Кэнноном в bpo-18072.)

Функция reload() была перемещена из imp в importlib в связи с прекращением поддержки модуля imp. (Предоставлено Беркером Пексагом в bpo-18193.)

importlib.util теперь имеет атрибут MAGIC_NUMBER, обеспечивающий доступ к номеру версии байт-кода. Это заменяет функцию get_magic() в устаревшем модуле imp. (Предоставлено Бреттом Кэнноном в bpo-18192.)

Новые функции importlib.util cache_from_source() и source_from_cache() заменяют одноименные функции в устаревшем модуле imp. (Предоставлено Бреттом Кэнноном в bpo-18194.)

Начальная загрузка importlib NamespaceLoader теперь соответствует InspectLoader ABC, что означает, что runpy и python -m теперь можно использовать с пакетами пространства имён. (Предоставлено Бреттом Кэнноном в bpo-18058.)

importlib.util имеет новую функцию decode_source(), которая декодирует исходный текст из байтов, используя универсальную обработку новой строки. Это полезно для реализации методов InspectLoader.get_source().

importlib.machinery.ExtensionFileLoader теперь имеет метод get_filename(). Это было непреднамеренно пропущено в исходной реализации. (Предоставлено Эриком Сноу в bpo-19152.)

inspect

Модуль inspect теперь предлагает базовый интерфейс командной строки для быстрого отображения исходного кода и другой информации для модулей, классов и функций. (Предоставлено Клаудиу Попа и Ником Когланом в bpo-18626.)

unwrap() упрощает распутывание цепочек функций-оболочек, созданных functools.wraps() (и любым другим API, который устанавливает атрибут __wrapped__ для функции-оболочки). (Предоставлено Дэниелом Урбаном, Аароном Айлсом и Ником Когланом в bpo-13266.)

В рамках реализации нового модуля enum модуль inspect теперь значительно лучше поддерживает пользовательские методы __dir__ и атрибуты динамического класса, предоставляемые через метаклассы. (Предоставлено Этаном Фурманом в bpo-18929 и bpo-19030.)

getfullargspec() и getargspec() теперь используют API signature(). Это позволяет им поддерживать гораздо более широкий спектр вызываемых объектов, в том числе с атрибутами __signature__, с метаданными, предоставленными клиникой аргументов, объектами functools.partial() и другими. Обратите внимание, что, в отличие от signature(), данные функции по-прежнему игнорируют атрибуты __wrapped__ и сообщают об уже связанном первом аргументе для связанных методов, поэтому по-прежнему необходимо обновить код, чтобы использовать signature() напрямую, если данные функции желательны. (Предоставил Юрий Селиванов в bpo-17481.)

signature() теперь поддерживает утиные типы функций CPython, что добавляет поддержку функций, скомпилированных с помощью Cython. (Предоставили Стефан Бенель и Юрий Селиванов в bpo-17159.)

ipaddress

ipaddress был добавлен в стандартную библиотеку Python 3.3 как предварительный API. С выпуском Python 3.4 данная квалификация была удалена: ipaddress теперь считается стабильным API, на который распространяются обычные требования стандартной библиотеки для обеспечения обратной совместимости.

Новое свойство is_globalTrue, если адрес является глобально маршрутизируемым. (Предоставлено Питером Муди в bpo-17400.)

logging

TimedRotatingFileHandler имеет новый параметр atTime, который можно использовать для указания времени дня, когда должен произойти перенос. (Предоставлено Рональдом Уссореном в bpo-9556.)

SocketHandler и DatagramHandler теперь поддерживают сокеты домена Unix (путём установки port на None). (Внесено Винаем Саджипом в коммит ce46195b56a9.)

fileConfig() теперь принимает экземпляр подкласса configparser.RawConfigParser для параметра fname. Это упрощает использование файла конфигурации, когда конфигурация журналирования является лишь частью общей конфигурации приложения или когда приложение изменяет конфигурацию перед передачей её в fileConfig(). (Предоставлено Винаем Саджипом в bpo-16110.)

Данные конфигурации логгирования, полученные из сокета через функцию logging.config.listen(), теперь можно проверить перед обработкой, указав функцию проверки в качестве аргумента для нового ключевого аргумента verify. (Предоставлено Винаем Саджипом в bpo-15452.)

marshal

Версия marshal по умолчанию была увеличена до 3. Код, реализующий новую версию, восстанавливает поведение Python2, записывая только одну копию интернированных строк и сохраняя интернирование при десериализации, и расширяет эту возможность «одной копии» для любого типа объекта (включая обработку рекурсивные ссылки). Это уменьшает как размер файлов .pyc, так и объём памяти, который модуль занимает в памяти, когда он загружается из файла .pyc (или .pyo). (Предоставлено Кристьяном Валуром Йонссоном в bpo-16475, с дополнительным ускорением Антуаном Питру в bpo-19219.)

mmap

Объекты mmap теперь могут иметь вид weakref. (Предоставлено Валери Ламберт в bpo-4885.)

multiprocessing

В Unix были добавлены два новых метода запуска, spawn и forkserver для запуска процессов с использованием multiprocessing. Это делает смешивание процессов с потоками более надежным, а метод spawn соответствует семантике, которую многопроцессорная обработка всегда использовала в Windows. Новая функция get_all_start_methods() сообщает обо всех методах запуска, доступных на платформе, get_start_method() сообщает о текущем методе запуска, а set_start_method() устанавливает метод запуска. (Предоставлено Ричардом Оудкерком в bpo-8713.)

У multiprocessing также теперь есть концепция context, которая определяет, как создаются дочерние процессы. Новая функция get_context() возвращает контекст, который использует указанный метод запуска. Она имеет тот же API, что и сам модуль multiprocessing, поэтому вы можете использовать её для создания Pool и других объектов, которые будут работать в этом контексте. Это позволяет платформе и приложению или различным частям одного и того же приложения использовать многопроцессорность, не мешая друг другу. (Предоставлено Ричардом Аудкерком в bpo-18999.)

За исключением использования старого метода запуска fork, дочерние процессы больше не наследуют ненужные обработчики/дескрипторы файлов от своих родителей (часть bpo-8713).

multiprocessing теперь использует runpy (который реализует переключатель -m) для правильной инициализации __main__ в дочерних процессах при использовании методов запуска spawn или forkserver. Это устраняет некоторые крайние случаи, когда сочетание многопроцессорности, переключателя командной строки -m и явного относительного импорта может привести к скрытым сбоям в дочерних процессах. (Предоставлено Ником Когланом в bpo-19946.)

operator

Новая функция length_hint() обеспечивает реализацию спецификации использования специального метода __length_hint__() в рамках формальной спецификации PEP 424 данной языковой функции. (Предоставлено Армином Ронахером в bpo-16148.)

Теперь доступна версия модуля operator на чистом Python, доступная для справки и для использования в альтернативных реализациях Python. (Предоставлено Захари Уэр в bpo-16694.)

os

Появились новые функции для получения и установки наследуемого флага дескриптора файла (os.get_inheritable(), os.set_inheritable()) или дескриптора Windows (os.get_handle_inheritable(), os.set_handle_inheritable()).

Новая функция cpu_count() сообщает о количестве ЦПУ, доступных на платформе, на которой работает Python (или None, если число не может быть определено). Функция multiprocessing.cpu_count() теперь реализована в терминах этой функции. (Предоставлено Трентом Нельсоном, Йогешем Чаудхари, Виктором Стиннером и Шарлем-Франсуа Натали в bpo-17914.)

os.path.samestat() теперь доступна на платформе Windows (а реализация os.path.samefile() теперь совместно используется Unix и Windows). (Предоставлено Брайаном Кертином в bpo-11939.)

os.path.ismount() теперь распознает тома, смонтированные ниже корня диска в Windows. (Предоставлено Тимом Голденом в bpo-9035.)

os.open() поддерживает два новых флага на платформах, которые их предоставляют: O_PATH (дескриптор неоткрытого файла) и O_TMPFILE (безымянный временный файл; с версии 3.4.0 доступен только в системах Linux с версией ядра 3.11 или новее, которые имеют заголовки uapi). (Предоставлено Кристианом Хеймсом в bpo-18673 и Бенджамином Петерсоном соответственно.)

pdb

pdb был улучшен для более удобной обработки генераторов, yield и yield from. Это особенно полезно при отладке программ на основе asyncio. (Предоставлено Андреем Светловым и Ксавьером де Гэем в bpo-16596.)

Команда print удалена из pdb, восстановив доступ к функции Python print() из командной строки pdb. В Python2 pdb не было команды print; вместо этого при вводе print выполняется оператор print. В Python3 print был ошибочно сделан псевдонимом для команды pdb p. p, однако, печатает repr своего аргумента, а не str, как это сделала команда Python2 print. Хуже того, команда Python3 pdb print затеняла функцию Python3 print, делая её недоступной в командной строке pdb. (Предоставлено Коннором Осборном в bpo-18764.)

pickle

pickle теперь поддерживает (но не использует по умолчанию) новый протокол pickle 4. Новый протокол решает ряд проблем, присутствовавших в предыдущих протоколах, таких как сериализация вложенных классов, очень большие строки и контейнеры, а также классы чей метод __new__() принимает только ключевые аргументы. Он также обеспечивает некоторые улучшения эффективности.

См.также

PEP 3154 – Pickle протокол 4
PEP, написанный Антуаном Питру и реализованный Александром Вассалотти.

plistlib

plistlib теперь имеет API, аналогичный стандартному шаблону для протоколов сериализации stdlib, с новыми функциями load(), dump(), loads() и dumps(). (Старый API устарел.) В дополнение к уже поддерживаемому формату списка XML (FMT_XML) теперь также поддерживается двоичный формат списка (FMT_BINARY). (Предоставлено Рональдом Уссореном и другими в bpo-14455.)

poplib

В poplib добавлены два новых метода: capa(), возвращающий список возможностей, объявленных POP-сервером, и stls(), переключающий сеанс POP3 с открытым текстом на сеанс POP3 с шифрованием, если POP-сервер его поддерживает. (Предоставлено Лоренцо Катуччи в bpo-4473.)

pprint

Класс PrettyPrinter модуля pprint и его функции pformat() и pprint() имеют новую опцию compact, которая управляет форматированием вывода. В настоящее время установка compact на True означает, что последовательности будут напечатаны с таким количеством элементов последовательности, которое поместится в width в каждой (с отступом) строке. (Предоставлено Сергеем Сторчакой в bpo-19132.)

Длинные строки теперь переносятся с использованием обычного синтаксиса продолжения строки Python. (Предоставлено Антуаном Питру в bpo-17150.)

pty

pty.spawn() теперь возвращает значение состояния из os.waitpid() дочернего процесса вместо None. (Предоставлено Грегори П. Смитом)

pydoc

Модуль pydoc теперь основан непосредственно на API самоанализа inspect.signature(), что позволяет ему предоставлять информацию о сигнатуре для более широкого спектра вызываемых объектов. Это изменение также означает, что атрибуты __wrapped__ теперь учитываются при отображении справочной информации. (Предоставлено Ларри Гастингсом в bpo-19674.)

Модуль pydoc больше не отображает параметр self для уже привязанных методов. Вместо этого он стремится всегда отображать точную текущую сигнатуру предоставленного вызываемого объекта. (Предоставлено Ларри Гастингсом в bpo-20710.)

В дополнение к изменениям, которые были внесены непосредственно в pydoc, его обработка пользовательских методов __dir__ и различных вариантов поведения дескрипторов также была существенно улучшена благодаря базовым изменениям в модуле inspect.

Поскольку встроенный help() основан на pydoc, вышеуказанные изменения также влияют на поведение help().

re

Новая функция fullmatch() и метод regex.fullmatch() закрепляют шаблон на обоих концах строки для соответствия. Это предоставляет возможность явно указать цель сопоставления, что позволяет избежать класса незаметных ошибок, когда символы $ теряются во время изменения кода или добавления альтернатив к существующему регулярному выражению. (Предоставлено Мэтью Барнеттом в bpo-16203.)

repr объектов регулярных выражений теперь включает шаблон и флаги; repr сопоставляемых объектов теперь включает начало, конец и совпавшую часть строки. (Предоставлено Хьюго Лопесом Таваресом и Сергеем Сторчакой в bpo-13592 и bpo-17087.)

resource

Новая функция prlimit(), доступная на платформах Linux с версией ядра 2.6.36 или более поздней и glibc версии 2.13 или более поздней, предоставляет возможность запрашивать или устанавливать ограничения ресурсов для процессов, отличных от того, который выполняет вызов. (Предоставлено Кристианом Хеймсом в bpo-16595.)

В ядре Linux версии 2.6.36 или более поздней версии также есть некоторые новые константы Linux: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME и RLIMIT_SIGPENDING. (Предоставлено Кристианом Хеймсом в bpo-19324.)

Во FreeBSD версии 9 и более поздних есть несколько новых специфичных для FreeBSD констант: RLIMIT_SBSIZE, RLIMIT_SWAP и RLIMIT_NPTS. (Предоставлено Клаудиу Попа в bpo-19343.)

select

Объекты epoll теперь поддерживают протокол управления контекстом. При использовании в операторе with метод close() будет вызываться автоматически в конце блока. (Предоставил Сергей Сторчака в bpo-16488.)

Объекты devpoll теперь имеют методы fileno() и close(), а также новый атрибут closed. (Предоставлено Виктором Стиннером в bpo-18794.)

shelve

Экземпляры Shelf теперь могут использоваться в операторах with и будут автоматически закрываться в конце блока with. (Предоставлено Филипом Грущинским в bpo-13896.)

shutil

copyfile() теперь вызывает определённый подкласс Error, SameFileError, когда исходный и целевой файлы являются одним и тем же файлом, что позволяет приложению предпринимать соответствующие действия в отношении данной ошибки. (Предоставлено Ацуо Исимото и Хайнеком Шлаваком в bpo-1492704.)

smtpd

Классы SMTPServer и SMTPChannel теперь принимают ключевой аргумент map, который, если он указан, передаётся в asynchat.async_chat в качестве его аргумента map. Это позволяет приложению избежать влияния на глобальную карту сокетов. (Предоставлено Винаем Саджипом в bpo-11959.)

smtplib

SMTPException теперь является подклассом OSError, позволяющий перехватывать как ошибки уровня сокета, так и ошибки уровня протокола SMTP в одном операторе try/except с помощью кода, который заботится только о том, произошла ошибка или нет. (Предоставлено Недом Джексоном Лавли в bpo-2118.)

socket

Модуль socket теперь поддерживает протокол CAN_BCM на платформах, которые его поддерживают. (Предоставлено Брайаном Торном в bpo-15359.)

Объекты сокетов имеют новые методы для получения или установки своих наследуемых флагов, get_inheritable() и set_inheritable().

Константы socket.AF_* и socket.SOCK_* теперь являются значениями перечисления с использованием нового модуля enum. Это позволяет печатать осмысленные имена во время отладки вместо целых «магических чисел».

Константа AF_LINK теперь доступна в BSD и OSX.

inet_pton() и inet_ntop() теперь поддерживаются в Windows. (Предоставлено Ацуо Исимото в bpo-7171.)

sqlite3

Новый логический параметр функции connect(), uri, может использоваться для указания того, что параметр database является uri (см. Документацию по URI SQLite). (Предоставлено poq в bpo-13773.)

ssl

Добавлены PROTOCOL_TLSv1_1 и PROTOCOL_TLSv1_2 (поддержка TLSv1.1 и TLSv1.2); поддержка данных протоколов доступна только в том случае, если Python связан с OpenSSL 1.0.1 или более поздней версии. (Предоставлено Мишель Орру и Антуаном Питру в bpo-16692.)

Новая функция create_default_context() предоставляет стандартный способ получения SSLContext, настройки которого обеспечивают разумный баланс между совместимостью и безопасностью. Данные параметры являются более строгими, чем значения по умолчанию, предоставленные конструктором SSLContext, и могут быть скорректированы в будущем без предварительного устаревания, если изменятся передовые требования безопасности. Новая рекомендуемая передовая практика использования библиотек stdlib, поддерживающих SSL, заключается в использовании create_default_context() для получения объекта SSLContext, изменении его при необходимости, а затем передаче в качестве аргумента context соответствующего API stdlib. (Предоставлено Кристианом Хеймсом в bpo-19689.)

Метод SSLContext load_verify_locations() принимает новый необязательный аргумент cadata, который можно использовать для предоставления сертификатов в кодировке PEM или DER напрямую через строки или байты соответственно. (Предоставлено Кристианом Хеймсом в bpo-18138.)

Новая функция get_default_verify_paths() возвращает именованный кортеж путей и переменных среды, который метод set_default_verify_paths() использует для установки значений по умолчанию cafile и capath OpenSSL. Это может помочь в устранении проблем с проверкой по умолчанию. (Предоставлено Кристианом Хеймсом в bpo-18143.)

У SSLContext появился новый метод cert_store_stats(), сообщающий количество загруженных сертификатов X.509, сертификатов X.509 CA и списков отзыва сертификатов (crl), а также метод get_ca_certs(), возвращающий список загруженных сертификатов CA. (Предоставлено Кристианом Хеймсом в bpo-18147.)

Если доступен OpenSSL 0.9.8 или более поздней версии, SSLContext имеет новый атрибут verify_flags, который можно использовать для управления процессом проверки сертификата, установив для него некоторую комбинацию новых констант VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN или VERIFY_X509_STRICT. OpenSSL по умолчанию не выполняет проверку CRL. (Предоставлено Кристианом Хеймсом в bpo-8813.)

Новый метод SSLContext load_default_certs() загружает множество сертификатов центра сертификации (CA) по умолчанию из расположений по умолчанию, которые различаются в зависимости от платформы. Его можно использовать для загрузки как сертификатов проверки подлинности веб-сервера TLS (purpose=SERVER_AUTH), которые клиент может использовать для проверки сервера, так и сертификатов, используемые сервером для проверки сертификатов клиентов (purpose=CLIENT_AUTH). (Предоставлено Кристианом Хеймсом в bpo-19292.)

Две новые функции только для Windows, enum_certificates() и enum_crls(), позволяют извлекать сертификаты, информацию о сертификатах и CRL из хранилища сертификатов Windows. (Предоставлено Кристианом Хеймсом в bpo-17134.)

Поддержка SNI на стороне сервера (указание имени сервера) с использованием нового метода ssl.SSLContext.set_servername_callback(). (Предоставлено Дэниелом Блэком в bpo-8109.)

Словарь, возвращённый SSLSocket.getpeercert(), содержит дополнительные элементы расширения X509v3: URI crlDistributionPoints, calIssuers и OCSP. (Предоставлено Кристианом Хеймсом в bpo-18379.)

stat

Модуль stat теперь поддерживается реализацией C в _stat. Требуется реализация C, т. к. большинство значений не стандартизированы и зависят от платформы. (Предоставлено Кристианом Хеймсом в bpo-11016.)

Модуль поддерживает новые флаги ST_MODE, S_IFDOOR, S_IFPORT и S_IFWHT. (Предоставлено Кристианом Химсом в bpo-11016.)

struct

Новая функция iter_unpack и новый метод struct.Struct.iter_unpack() для скомпилированных форматов обеспечивают потоковую распаковку буфера, содержащего повторяющиеся экземпляры заданного формата данных. (Предоставлено Антуаном Питру в bpo-17804.)

subprocess

check_output() теперь принимает аргумент input, который можно использовать для предоставления содержимого stdin для выполняемой команды. (Предоставлено Заком Вайнбергом в bpo-16624.)

getstatus() и getstatusoutput() теперь работают в Windows. Это изменение было фактически непреднамеренно сделано в 3.3.4. (Предоставлено Тимом Голденом в bpo-10197.)

sunau

Метод getparams() теперь возвращает именованный кортеж, а не простой кортеж. (Предоставлено Клаудиу Попа в bpo-18901.)

sunau.open() теперь поддерживает протокол управления контекстом: при использовании в блоке with метод возвращаемого объекта close будет вызываться автоматически в конце блока. (Предоставлено Сергеем Сторчакой в bpo-18878.)

AU_write.setsampwidth() теперь поддерживает 24-битные сэмплы, тем самым добавляя поддержку записи 24-битных семплов с помощью модуля. (Предоставил Сергей Сторчака в bpo-19261.)

Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Предоставил Сергей Сторчака в bpo-8311.)

sys

Новая функция sys.getallocatedblocks() возвращает текущее количество блоков, выделенных интерпретатором. (В CPython с настройкой по умолчанию --with-pymalloc это распределение осуществляется через API PyObject_Malloc().) Это может быть полезно для отслеживания утечек памяти, особенно если они автоматизированы с помощью набора тестов. (Предоставлено Антуаном Питру в bpo-13390.)

Когда интерпретатор Python запускается в интерактивном режиме, он проверяет наличие атрибута __interactivehook__ в модуле sys. Если атрибут существует, его значение вызывается без аргументов непосредственно перед запуском интерактивного режима. Проверка производится после того, как прочитан файл PYTHONSTARTUP, поэтому его можно установить там. Модуль site устанавливает его для функции, которая включает tab-автодополнение и сохранение истории (в ~/.python-history), если платформа поддерживает readline. Если вам не нужно это (новое) поведение, вы можете переопределить его в PYTHONSTARTUP, sitecustomize или usercustomize, удалив данный атрибут из sys (или установив для него какой-либо другой вызываемый объект). (Предоставлено Эриком Араужо и Антуаном Питру в bpo-5845.)

tarfile

Модуль tarfile теперь поддерживает простой Интерфейс командной строки при вызове скрипта напрямую или через -m. Это можно использовать для создания и извлечения архивов tarfile. (Предоставлено Беркером Пексагом в bpo-13477.)

textwrap

Класс TextWrapper имеет два новых атрибута/аргумента конструктора: max_lines, ограничивающий количество строк в выходных данных, и placeholder, представляющий собой строку, которая появится в конце выходных данных, если она была усечена из-за max_lines. Основываясь на данных возможностях, новая удобная функция shorten() сворачивает все пробелы во входных данных в одиночные пробелы и создаёт одну строку заданного width, которая заканчивается placeholder (по умолчанию [...]). (Предоставлено Антуаном Питру и Сергеем Сторчакой в bpo-18585 и bpo-18725.)

threading

Объект Thread, представляющий основной поток, можно получить из новой функции main_thread(). В обычных условиях это поток, из которого был запущен интерпретатор Python. (Предоставлено Адреем Светловым в bpo-18882.)

traceback

Новая функция traceback.clear_frames() берёт объект трассировки и очищает локальные переменные во всех фреймах, на которые он ссылается, уменьшая объём потребляемой памяти. (Предоставлено Эндрю Кучлингом в bpo-1565525.)

types

Новый дескриптор DynamicClassAttribute() предоставляет способ определения атрибута, работающий нормально при поиске через экземпляр объекта, но направляемый к class __getattr__ при поиске через класс. Это позволяет иметь активные свойства в классе и иметь виртуальные атрибуты в классе с тем же именем (см. Enum для примера). (Предоставлено Итаном Фурманом в bpo-19030.)

urllib

urllib.request теперь поддерживает URL-адреса data: через класс DataHandler. (Предоставлено Матиасом Панзенбеком в bpo-16423.)

Метод http, который будет использоваться классом Request, теперь можно указать, установив атрибут класса method в подклассе. (Предоставлено Джейсоном Р. Кумбсом в bpo-18978.)

Объекты Request теперь можно использовать повторно: при изменении атрибутов full_url или data обновляются все соответствующие внутренние свойства. Это означает, например, что теперь можно использовать один и тот же объект Request более чем в одном вызове OpenerDirector.open() с разными аргументами data или изменить url Request вместо того, чтобы пересчитывать его с нуля. Существует также новый метод remove_header(), который можно использовать для удаления заголовков из файла Request. (Предоставлено Алексеем Качаевым в bpo-16464, Даниэлем Возняком в bpo-17485 и Дэмиеном Брехтом и Сентилом Кумараном в bpo-17272.)

Объекты HTTPError теперь имеют атрибут headers, предоставляющий доступ к заголовкам ответов HTTP, связанным с ошибкой. (Предоставлено Беркером Пексагом в bpo-15701.)

unittest

У класса TestCase появился новый метод создающий менеджер контекста subTest(), блок with которого становится «подтестом». Данный менеджер контекста позволяет тестовому методу динамически генерировать подтесты, например, вызывая менеджер контекста subTest внутри цикла. Таким образом, один метод тестирования может создать неопределенное количество отдельно идентифицированных и отдельно подсчитанных тестов, все из которых будут выполняться, даже если один или несколько из них не пройдут. Например:

class NumbersTest(unittest.TestCase):
    def test_even(self):
        for i in range(6):
            with self.subTest(i=i):
                self.assertEqual(i % 2, 0)

приведёт к шести подтестам, каждый из которых указан в подробном выводе модульного теста с меткой, состоящей из имени переменной i и значения этой переменной (i=0, i=1 и т. д.). Полную версию этого примера см. в Различение итераций теста с помощью подтестов. (Предоставлено Антуаном Питру в bpo-16997.)

unittest.main() теперь принимает итерацию имён тестов для defaultTest, тогда как ранее он принимал только одно имя теста в виде строки. (Предоставлено Юрки Пуллиайненом в bpo-15132.)

Если SkipTest вызывается во время обнаружения тестов (т. е. на уровне модуля в тестовом файле), теперь это сообщается как пропуск, а не как ошибка. (Предоставлено Заком Уэром в bpo-16935.)

discover() теперь сортирует обнаруженные файлы, чтобы обеспечить согласованное упорядочение тестов. (Предоставлено Мартином Мелином и Джеффом Рамнани в bpo-16709.)

TestSuite теперь удаляет ссылки на тесты, как только тест был запущен, если тест прошел успешно. В интерпретаторах Python, выполняющих сборку мусора, это позволяет выполнять сборку мусора для тестов, если ничто другое не содержит ссылку на тест. Это поведение можно переопределить, создав подкласс TestSuite, определяющий пользовательский метод _removeTestAtIndex. (Предоставлено Томом Уордиллом, Мэттом МакКлюром и Эндрю Светловым в bpo-11798.)

Новый менеджер контекста тестовых утверждений, assertLogs(), гарантирует, что данный блок кода вызывает сообщение журналирования, используя модуль logging. По умолчанию сообщение может исходить от любого логгера и иметь приоритет INFO или выше, но можно указать как имя логгера, так и альтернативный минимальный уровень ведения журнала. Объект, возвращённый менеджером контекста, можно запросить для LogRecord’ов и/или отформатированных сообщений, которые были залоггированы. (Предоставлено Антуаном Питру в bpo-18937.)

Тестовое обнаружение теперь работает с пакетами пространств имён (предоставлено Клаудиу Попа в bpo-17457.)

Объекты unittest.mock теперь проверяют свои сигнатуры спецификации при сопоставлении вызовов, что означает, что аргумент теперь может сопоставляться либо по положению, либо по имени, а не только по положению. (Предоставлено Антуаном Питру в bpo-17015.)

Объекты mock_open() теперь имеют методы readline и readlines. (Предоставлено Тошио Куратоми в bpo-17467.)

venv

venv теперь включает сценарии активации для оболочек csh и fish. (Предоставлено Эндрю Светловым в bpo-15417.)

EnvBuilder и вспомогательная функция create() принимают новый ключевой аргумент with_pip, по умолчанию равный False, определяющий, гарантирует ли EnvBuilder, что pip установлен в виртуальной среде. (Предоставлено Ником Когланом в bpo-19552 как часть реализации PEP 453.)

wave

Метод getparams() теперь возвращает именованный кортеж, а не простой кортеж. (Предоставлено Клаудиу Попа в bpo-17487.)

wave.open() теперь поддерживает протокол управления контекстом. (Предоставлено Клаудиу Попа в bpo-17616.)

wave теперь может записывать вывод в недоступные для поиска файлы. (Предоставлено Дэвидом Джонсом, Гильерме Поло и Сергеем Сторчакой в bpo-5202.)

Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Предоставил Сергей Сторчака в bpo-8311.)

weakref

Новый класс WeakMethod имитирует слабые ссылки на связанные методы. (Предоставлено Антуаном Питру в bpo-14631.)

Новый класс finalize позволяет зарегистрировать обратный вызов, который будет вызываться при сборке мусора, без необходимости тщательного управления жизненным циклом самой слабой ссылки. (Предоставлено Ричардом Оудкерком в bpo-15528.)

Обратный вызов, если таковой имеется, связанный с ref, теперь отображается через атрибут __callback__. (Предоставлено Марком Дикинсоном в bpo-17643.)

xml.etree

Новый парсер XMLPullParser позволяет неблокирующим приложениям анализировать XML-документы. Пример можно увидеть по адресу Pull API для неблокирующего парсинга. (Предоставлено Антуаном Питру в bpo-17741.)

Функции xml.etree.ElementTree tostring() и tostringlist(), а также метод ElementTree write() теперь имеют short_empty_elements только ключевой параметр, обеспечивающий контроль над тем, записываются ли элементы без содержимого в сокращенной (<tag />) или расширенной (<tag></tag>) форме. (Предоставлено Ариэлем Поляком и Сергеем Сторчакой в bpo-14377.)

zipfile

Метод writepy() класса PyZipFile имеет новый параметр filterfunc, который можно использовать для управления тем, какие каталоги и файлы добавляются в архив. Например, это может быть использовано для исключения тестовых файлов из архива. (Предоставлено Кристианом Тисмером в bpo-19274.)

Параметр allowZip64 для ZipFile и PyZipfile теперь по умолчанию равен True. (Предоставлено Уильямом Маллардом в bpo-17201.)

Изменения реализации CPython

PEP 445: Настройка распределителей памяти CPython

PEP 445 добавляет новые интерфейсы уровня C для настройки распределения памяти в интерпретаторе CPython.

См.также

PEP 445 — Добавлены новые API для настройки распределителей памяти Python
PEP написан и реализован Виктором Стиннером.

PEP 442: Завершение безопасного объекта

PEP 442 устраняет текущие ограничения и особенности финализации объектов в CPython. С его помощью объекты с методами __del__(), а также генераторы с предложениями finally могут быть финализированы, когда они являются частью ссылочного цикла.

В рамках этого изменения глобальные переменные модуля больше не устанавливаются принудительно в None во время завершения работы интерпретатора в большинстве случаев, вместо этого полагаясь на нормальную работу циклического сборщика мусора. Это позволяет избежать целого класса ошибок времени завершения работы интерпретатора, обычно связанных с методами __del__, которые преследовали Python с тех пор, как впервые был представлен циклический сборщик мусора.

См.также

PEP 442 – Завершение безопасного объекта
PEP написан и реализован Антуаном Питру.

PEP 456: Безопасный и взаимозаменяемый алгоритм хеширования

PEP 456 продолжает более раннюю работу по исправлению безопасности, выполненную для хеш-алгоритма Python для защиты от определённых DOS-атак, которым могут подвергаться общедоступные API-интерфейсы, поддерживаемые поиском по словарю. (См. bpo-14621, чтобы узнать о начале текущего раунда улучшений.) PEP унифицирует хеш-код CPython, чтобы упаковщику было проще заменить другой хэш-алгоритм, и переключает реализацию Python по умолчанию на реализацию SipHash на платформах с 64-разрядной архитектурой. тип данных. Любые различия в производительности по сравнению со старым алгоритмом FNV незначительны.

PEP добавляет дополнительные поля в именованный кортеж sys.hash_info для описания алгоритма хеширования, используемого исполняемым в данный момент двоичным файлом. В противном случае PEP не изменяет существующие API-интерфейсы CPython.

PEP 436: Клиника споров

«Клиника споров» (PEP 436) теперь является частью процесса сборки CPython и может использоваться для упрощения процесса определения и поддержки точных сигнатур для встроенных функций и модулей расширения стандартной библиотеки, реализованных на C.

Некоторые стандартные модули расширения библиотеки были преобразованы для использования Клиники споров в Python 3.4, а pydoc и inspect были обновлены соответствующим образом.

Ожидается, что метаданные сигнатуры для программной самоанализа будут добавлены к доп. вызываемым реализованным на C объектам, как часть отладочных релизов Python 3.4.

Примечание

PEP Клиники споров (Argument Clinic) не полностью соответствует состоянию реализации. В данном случае менеджер по выпуску и основная группа разработчиков сочли это приемлемым, поскольку Клиники споров не будет доступна в качестве общедоступного API для использования третьими сторонами в Python 3.4.

См.также

PEP 436 – DSL Клиники споров
PEP написан и реализован Ларри Хастингсом.

Другие изменения сборки и C API

  • В стабильный ABI добавлена новая функция PyType_GetSlot(), позволяющая извлекать указатели функций из слотов именованных типов при использовании ограниченного API. (Предоставлено Мартином фон Лёвисом в bpo-17162.)
  • Новый API-интерфейс предварительной инициализации Py_SetStandardStreamEncoding() позволяет приложениям, в которые встроен интерпретатор CPython, надежно принудительно применять определённую кодировку и обработчик ошибок для стандартных потоков. (Предоставлено Бастьеном Маунтином и Ником Когланом в bpo-16129.)
  • Большинство API-интерфейсов Python C, которые не изменяют строковые аргументы, теперь правильно помечены как принимающие const char *, а не char *. (Предоставлено Сергеем Сторчакой в bpo-1772673.)
  • Новую версию оболочки python-config можно использовать, даже если интерпретатор Python недоступен (например, в сценариях кросс-компиляции).
  • PyUnicode_FromFormat() теперь поддерживает спецификации ширины и точности для %s, %A, %U, %V, %S и %R. (Предоставлено Юсджи Рей и Виктором Стиннером в bpo-7330.)
  • Новая функция PyStructSequence_InitType2() дополняет существующую функцию PyStructSequence_InitType(). Разница в том, что он возвращает 0 в случае успеха и -1 в случае неудачи.
  • Исходный код CPython теперь может быть скомпилирован с использованием функций проверки правильности адресов последних версий GCC и clang: ложные тревоги в распределителе малых объектов были отключены. (Предоставлено Дхиру Холиа в bpo-18596.)
  • Сборка Windows теперь использует Рандомизацию макета адресного пространства и Предотвращение выполнения данных. (Предоставлено Кристианом Хеймсом в bpo-16632.)
  • Новая функция PyObject_LengthHint() является эквивалентом operator.length_hint() в C API. (Предоставлено Армином Ронахером в bpo-16148.)

Другие улучшения

  • У команды python появилась новая опция, -I, что заставляет его работать в «изолированном режиме», что означает, что sys.path не содержит ни каталога скрипта, ни каталога пользователя site-packages, а все переменные среды PYTHON* игнорируются (подразумевается как -s, так и -E). Другие ограничения также могут быть применены в будущем с целью изолировать выполнение скрипта от пользовательской среды. Это уместно, например, когда Python используется для запуска системного скрипта. В большинстве систем POSIX его можно и нужно использовать в строке системных скриптов #!. (Предоставлено Кристианом Хеймсом в bpo-16499.)
  • Завершение с помощью табуляции теперь включено по умолчанию в интерактивном интерпретаторе в системах, поддерживающих readline. История также включена по умолчанию и записывается (и читается) в файл ~/.python- history. (Предоставлено Антуаном Питру и Эриком Араужо в bpo-5845.)
  • Вызов интерпретатора Python с --version теперь выводит версию в стандартный вывод вместо стандартной ошибки (bpo-18338). Аналогичные изменения были внесены в argparse (bpo-18920) и другие модули, которые имеют возможности вызова, подобные сценариям (bpo-18922).
  • Установщик CPython для Windows теперь добавляет .py в переменную PATHEXT при регистрации расширений, что позволяет пользователям запускать скрипт Python в командной строке Windows, просто вводя его имя без расширения .py. (Предоставлено Полом Муром в bpo-18569.)
  • Новая цель make coverage-report будет собирать Python, запускать множество тестов и генерировать отчёт о покрытии HTML для кодовой базы C с использованием gcov и lcov.
  • Параметр -R для множество регрессионных тестов Python теперь также проверяет наличие утечек памяти, используя sys.getallocatedblocks(). (Предоставлено Антуаном Питру в bpo-13390.)
  • python -m теперь работает с пакетами пространства имён.
  • Модуль stat теперь реализован на C, что означает, что он получает значения своих констант из заголовочных файлов C, вместо того, чтобы иметь значения, жёстко закодированные в модуле python, как это было раньше.
  • Загрузка нескольких модулей Python из одного модуля ОС (.so, .dll) теперь работает корректно (ранее автоматически возвращался первый модуль Python в файле). (Предоставлено Вацлавом Шмилауэром в bpo-16421.)
  • Добавлен новый код операции LOAD_CLASSDEREF для исправления ошибки загрузки свободных переменных в телах классов, которая могла быть вызвана определенным использованием __prepare__. (Предоставлено Бенджамином Петерсоном в bpo-17853.)
  • Ряд сбоев, связанных с MemoryError, был обнаружен и исправлен Виктором Стиннером с помощью его инструмента pyfailmalloc на основе PEP 445 (bpo-18408, bpo-18520).
  • Команда pyvenv теперь принимает параметр --copies для использования копий, а не символических ссылок, даже в системах, где символические ссылки используются по умолчанию. (Предоставлено Винаем Саджипом в bpo-18807.)
  • Команда pyvenv также принимает параметр --without-pip для подавления автоматической загрузки pip в виртуальную среду. (Предоставлено Ником Когланом в bpo-19552 как часть реализации PEP 453.)
  • Имя кодировки теперь является необязательным в множестве значений для переменной среды PYTHONIOENCODING. Это позволяет установить только обработчик ошибок без изменения кодировки по умолчанию. (Предоставил Сергей Сторчака в bpo-18818.)
  • Функции модуля bz2, lzma и gzip open теперь поддерживают режим x (эксклюзивное создание). (Предоставлено Тимом Хини и Ваджраски Коком в bpo-19201, bpo-19222 и bpo-19223.)

Значительные оптимизации

  • Декодер UTF-32 теперь работает в 3-4 раза быстрее. (Предоставил Сергей Сторчака в bpo-14625.)
  • Стоимость коллизий хэшей для множеств теперь снижена. Каждое зондирование хеш-таблицы теперь проверяет ряд последовательных смежных пар ключ/хэш, прежде чем продолжать делать случайные зондирования через хеш-таблицу. Это использует локальность кеша, чтобы сделать разрешение коллизий менее затратным. Схему разрешения коллизий можно описать как гибрид линейного зондирования и открытой адресации. Количество дополнительных линейных датчиков по умолчанию равно девяти. Это можно изменить во время компиляции, определив LINEAR_PROBES как любое значение. Устанавливает LINEAR_PROBES=0, чтобы полностью отключить линейное измерение. (Предоставлено Рэймондом Хеттингером в bpo-18771.)
  • Интерпретатор запускается примерно на 30% быстрее. Пара мер приводит к ускорению. Интерпретатор загружает меньше модулей при запуске, например модули re, collections и locale и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен, чтобы быстрее загружать скомпилированный код Python. (Предоставлено Антуаном Питру, Кристианом Хеймсом и Виктором Стиннером в bpo-19219, bpo-19218, bpo-19209, bpo-19205 и bpo-9548.)
  • bz2.BZ2File теперь работает так же быстро или быстрее, чем версия Python2 в большинстве случаев. lzma.LZMAFile также был оптимизирован. (Предоставлено Сергеем Сторчакой и Надимом Вавдой в bpo-16034.)
  • random.getrandbits() на 20-40% быстрее для небольших целых чисел (наиболее распространенный вариант использования). (Предоставлено Сергеем Сторчакой в bpo-16674.)
  • Благодаря новому формату хранения строк обработка строк теперь выполняется значительно быстрее. (Предоставлено Виктором Стиннером и Антуаном Питру в bpo-15596.)
  • Проблема с производительностью в io.FileIO.readall() решена. Это особенно влияет на Windows и значительно ускоряет передачу значительных объемов данных через subprocess. (Предоставлено Ричардом Оудкерком в bpo-15758.)
  • html.escape() теперь в 10 раз быстрее. (Предоставлено Мэттом Брайантом в bpo-18020.)
  • В Windows теперь используется родной VirtualAlloc вместо CRT malloc в obmalloc. Искусственные тесты показывают около 3% экономии памяти.
  • os.urandom() теперь использует постоянный файловый дескриптор с отложенным открытием, чтобы избежать использования множества файловых дескрипторов при параллельном запуске из нескольких потоков. (Предоставлено Антуаном Питру в bpo-18756.)

Устарело

В этом разделе рассматриваются различные API и другие функции, которые устарели в Python 3.4 и будут удалены в Python 3.5 или более поздних версиях. В большинстве (но не во всех) случаях использование устаревших API приведёт к появлению DeprecationWarning, когда интерпретатор запускается с включенными предупреждениями об устаревании (например, при использовании -Wd).

Устаревшие в Python API

Устаревшие функции

  • Запуск IDLE с флагом -n (без подпроцесса) устарел. Однако данная функция не будет удалена, пока не будет разрешён bpo-18823.
  • Модуль site, добавляющий каталог «site-python» в sys.path, если он существует, устарел (bpo-19375).

Удаления

Операционные системы больше не поддерживаются

Поддержка следующих операционных систем была удалена из исходного кода и инструментов сборки:

  • ОС/2 (bpo-16135).
  • Windows 2000 (множество изменений e52df05b496a).
  • Системы Windows, где COMSPEC указывает на command.com (bpo-14470).
  • VMS (bpo-16136).

Удаление API и функций

Следующие устаревшие и ранее объявленные устаревшими API и функции были удалены:

  • Неподдерживаемые каталоги Misc/TextMate и Misc/vim были удалены (см. devguide для предложений о том, что использовать вместо этого).
  • Удалён макрос makefile SO (он был заменён макросами SHLIB_SUFFIX и EXT_SUFFIX) (bpo-16754).
  • Поле PyThreadState.tick_counter удалено; его значение было бессмысленным, начиная с Python 3.2, когда был представлен «новый GIL» (bpo-19199).
  • PyLoader и PyPycLoader были удалены из importlib. (Предоставлено Тарасом Ляпуном в bpo-15641.)
  • Аргумент strict для HTTPConnection и HTTPSConnection был удалён. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.
  • Устаревшие методы получения и установки urllib.request.Request add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_host и is_unverifiable были удалены (атрибут прямого доступа был удалён вместо этого).
  • Поддержка загрузки устаревшего TYPE_INT64 удалена из marshal. (Предоставлено Дэном Рити в bpo-15480.)
  • inspect.Signature: позиционные параметры теперь должны иметь допустимое имя.
  • object.__format__() больше не принимает непустые строки формата, теперь вместо этого вызывается TypeError. Использование непустой строки устарело, начиная с Python 3.2. Это изменение было сделано для предотвращения ситуации, когда ранее работающий (но неверный) код начинал давать сбой, если объект получал метод __format__. А это означает, что ваш код может вызывать TypeError, если вы используете код формата 's' с не содержащими метода __format__ объектами. Справочную информацию см. в bpo-7994.
  • difflib.SequenceMatcher.isbjunk() и difflib.SequenceMatcher.isbpopular() устарели в версии 3.2 и теперь удалены: используйте x in sm.bjunk и x in sm.bpopular, где sm — это объект SequenceMatcher (bpo-13248).

Очистка кода

  • Неиспользуемый и недокументированный внутренний класс Scanner был удалён из модуля pydoc.
  • Частный и фактически неиспользуемый модуль _gestalt был удалён вместе с частными функциями platform _mac_ver_lookup, _mac_ver_gstalt и _bcd2str, которые когда-либо вызывались только в сильно сломанных системах OSX (см. bpo-18393).
  • Жёстко запрограммированные копии некоторых констант stat, которые были включены в пространство имён модуля tarfile, были удалены.

Портирование на Python 3.4

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.

Изменения в поведении команды «python»

  • В оболочке posix установка переменной среды PATH в пустое значение эквивалентна тому, что она вообще не устанавливается. Однако установка PYTHONPATH в пустое значение не была эквивалентна тому, чтобы не устанавливать её вообще: установка PYTHONPATH в пустое значение была эквивалентна установке ., что приводит к путанице при рассуждениях по аналогии с тем, как работает PATH. Теперь поведение соответствует соглашению posix для PATH.
  • Вывод [X refs, Y blocks] отладочной (--with-pydebug) сборки интерпретатора CPython теперь отключён по умолчанию. Его можно повторно включить с помощью параметра -X showrefcount. (Предоставлено Эцио Мелотти в bpo-17323.)
  • Команда python и большинство сценариев stdlib (а также argparse) теперь выводят информацию --version в stdout вместо stderr (список проблем см. Другие улучшения выше).

Изменения в API Python

  • ABC, определённые в importlib.abc, теперь либо вызывают соответствующее исключение, либо возвращают значение по умолчанию вместо того, чтобы слепо вызывать NotImplementedError. Это повлияет только на код, вызывающий super() и проходящий до ABC. Для совместимости перехватите как NotImplementedError, так и соответствующее исключение по мере необходимости.

  • Тип модуля теперь инициализирует атрибуты __package__ и __loader__ значением None по умолчанию. Чтобы определить, были ли данные атрибуты установлены с обратной совместимостью, используйте, например. getattr(module, '__loader__', None) is not None. (bpo-17115.)

  • importlib.util.module_for_loader() теперь безоговорочно устанавливает __loader__ и __package__ для правильной поддержки перезагрузки. Если это нежелательно, вам нужно будет установить данные атрибуты вручную. Вы можете использовать importlib.util.module_to_load() для управления модулями.

  • Импорт теперь безоговорочно сбрасывает соответствующие атрибуты (например, __name__, __loader__, __package__, __file__, __cached__) при перезагрузке. Обратите внимание, что это восстанавливает поведение до версии 3.3, поскольку это означает, что модуль повторно обнаруживается при повторной загрузке (bpo-19413).

  • Замороженные пакеты больше не устанавливают __path__ в список, содержащий имя пакета, теперь они устанавливают его в пустой список. Предыдущее поведение могло привести к тому, что система импорта неправильно выполняла импорт подмодулей, если существовал каталог с тем же именем, что и у замороженного пакета. Правильный способ определить, является модуль пакетом или нет,— использовать hasattr(module, '__path__') (bpo-18065).

  • Замороженные модули больше не определяют атрибут __file__. Для замороженных модулей семантически неверно устанавливать атрибут, поскольку они не загружаются из какого-либо явного места. Если вы должны знать, что модуль исходит из замороженного кода, вы можете увидеть, установлен ли __spec__.location модуля в 'frozen', проверить, является ли загрузчик подклассом importlib.machinery.FrozenImporter, или если необходима совместимость с Python 2, вы можете использовать imp.is_frozen().

  • py_compile.compile() теперь вызывает FileExistsError, если путь к файлу, в который он записывает, является символической ссылкой или нестандартным файлом. Это должно действовать как предупреждение о том, что импорт перезапишет данные файлы обычным файлом независимо от того, какой тип пути к файлу они были изначально.

  • importlib.abc.SourceLoader.get_source() больше не вызывает ImportError, когда загружаемый исходный код вызывает SyntaxError или UnicodeDecodeError. Поскольку ImportError предназначен для вызова только тогда, когда исходный код не может быть найден, но должен быть, было сочтено чрезмерным охватом / перегрузкой этого значения, когда исходный код найден, но неправильно структурирован. Если вы раньше перехватывали ImportError и хотите продолжать игнорировать проблемы с синтаксисом или декодированием, перехватите все три исключения сейчас.

  • functools.update_wrapper() и functools.wraps() теперь корректно устанавливают атрибут __wrapped__ для оборачиваемой функции, даже если для функции также был установлен атрибут __wrapped__. Это означает, что атрибуты __wrapped__ теперь правильно связывают стек оформленных функций, а не каждый атрибут __wrapped__ в цепочке, относящийся к самой внутренней функции. Библиотеки самоанализа, предполагающие, что предыдущее поведение было преднамеренным, могут использовать inspect.unwrap() для доступа к первой функции в цепочке, у которой нет атрибута __wrapped__.

  • inspect.getfullargspec() был повторно реализован поверх inspect.signature() и, следовательно, обрабатывает гораздо более широкий спектр вызываемых объектов, чем в прошлом. Ожидается, что дополнительные вызовы встроенных и расширенных модулей получат метаданные сигнатуре в ходе серии Python 3.4. Код, который предполагает, что inspect.getfullargspec() не будет работать с вызываемыми объектами, отличными от Python, может потребовать соответствующей корректировки.

  • importlib.machinery.PathFinder теперь передаёт текущий рабочий каталог объектам в sys.path_hooks для пустой строки. Это приводит к тому, что sys.path_importer_cache никогда не содержит '', поэтому повторение sys.path_importer_cache на основе sys.path не найдёт всех ключей. __file__ модуля при импорте в текущий рабочий каталог теперь также будет иметь абсолютный путь, в том числе при использовании -m с интерпретатором (за исключением __main__.__file__, когда сценарий был выполнен напрямую с использованием относительного пути) (предоставлено Бреттом Кэнноном в bpo-18416). (bpo-18416).

  • Удаление аргумента strict на HTTPConnection и HTTPSConnection изменяет значение остальных аргументов, если вы указываете их позиционно, а не по ключевому. Если вы обращали внимание на предупреждения об устаревании, ваш код уже должен указывать любые дополнительные аргументы с помощью ключевых.

  • Строки между операторами from __future__ import ... теперь всегда вызывают SyntaxError. Раньше, если не было ведущей строки документации, промежуточная строка иногда игнорировалась. Это приводит CPython в соответствие со спецификацией языка; Jython и PyPy уже были. (bpo-17434).

  • ssl.SSLSocket.getpeercert() и ssl.SSLSocket.do_handshake() теперь вызывают OSError с ENOTCONN, когда SSLSocket не подключён, вместо предыдущего поведения, когда вызывался AttributeError. Кроме того, getpeercert() вызовет ValueError, если рукопожатие ещё не было выполнено.

  • base64.b32decode() теперь вызывает binascii.Error, когда входная строка содержит символы, отличные от алфавита b32, вместо TypeError. Данное TypeError пропускалось, когда другие TypeError были преобразованы. (Предоставлено Сергеем Сторчакой в bpo-18011.) Примечание. Это изменение также было непреднамеренно применено в Python 3.3.3.

  • Атрибут file теперь автоматически закрывается, когда создающий экземпляр cgi.FieldStorage подвергается сборке мусора. Если вы извлекали файловый объект отдельно от экземпляра cgi.FieldStorage и не поддерживали экземпляр в рабочем состоянии, вам следует либо сохранить весь экземпляр cgi.FieldStorage, либо прочитать содержимое файла до того, как экземпляр cgi.FieldStorage будет удалён сборщиком мусора.

  • Вызов read или write на закрытом сокете SSL теперь вызывает информативное ValueError, а не ранее более загадочное AttributeError (bpo-9177).

  • slice.indices() больше не создаёт OverflowError для огромных значений. В результате этого исправления slice.indices() теперь вызывает ValueError, если ему задана отрицательная длина; ранее он возвращал бессмысленные значения (bpo-14794).

  • Конструктор complex, в отличие от функций cmath, неправильно принимал значения float, если специальный метод объекта __complex__ возвращал единицу. Теперь вызывает TypeError. (bpo-16290.)

  • Конструктор int в версиях 3.2 и 3.3 ошибочно принимает значения float для параметра base. Вряд ли кто-то этим занимался, но если так, то сейчас вызывается TypeError (bpo-16772).

  • Значения по умолчанию для только ключевых аргументов, теперь вычисляются по умолчанию после обычных ключевых аргументов, а не раньше. Надеюсь, никто не написал код, зависящий от предыдущего ошибочного поведения (bpo-16967).

  • Устаревшие состояния потоков теперь очищаются после fork(). Это может привести к высвобождению некоторых системных ресурсов, которые ранее ошибочно сохранялись постоянно активными (например, соединения с базой данных хранились в локальном хранилище потока). (bpo-17094.)

  • Имена параметров в __annotations__ словари теперь правильно искажены, как и в __kwdefaults__. (Предоставил Юрий Селиванов в bpo-20625.)

  • hashlib.hash.name теперь всегда возвращает идентификатор в нижнем регистре. Раньше некоторые встроенные хэши имели имена в верхнем регистре, но теперь, когда это официальный общедоступный интерфейс, имена стали согласованными (bpo-18532).

  • Поскольку unittest.TestSuite теперь отбрасывает ссылки на тесты после их выполнения, множества тестов, которые повторно используют TestSuite для повторного запуска набора тестов, могут дать сбой. Тесты не следует повторно использовать таким образом, поскольку это означает, что состояние сохраняется между запусками тестов, что нарушает изоляцию тестов, для обеспечения которой разработан unittest. Однако, если отсутствие изоляции считается приемлемым, старое поведение можно восстановить, создав подкласс TestSuite, определяющий метод _removeTestAtIndex, который ничего не делает (см. TestSuite.__iter__()) (bpo-11798).

  • unittest теперь использует argparse для парсинга командной строки. Существуют определённые недопустимые формы команд, которые раньше работали, но теперь запрещены; теоретически это не должно вызывать проблем с обратной совместимостью, поскольку запрещённые формы команд не имеют никакого смысла и вряд ли будут использоваться.

  • Функции audioop теперь сразу же вызывают ошибку, если им передаётся строковый ввод, вместо случайного сбоя позже (bpo-16685).

  • Новый аргумент convert_charrefs для HTMLParser в настоящее время по умолчанию имеет значение False для обратной совместимости, но в конечном итоге будет изменён на значение по умолчанию True. Рекомендуется добавить его как ключевой аргумент с соответствующим значением ко всем вызовам HTMLParser в вашем коде (bpo-13633).

  • Поскольку аргумент digestmod функции hmac.new() в будущем не будет иметь значения по умолчанию, все вызовы hmac.new() следует изменить, чтобы явно указать digestmod (bpo-17276).

  • Вызов sysconfig.get_config_var() с ключом SO или поиск SO в результатах вызова sysconfig.get_config_vars() не рекомендуется. Данный ключ следует заменить на EXT_SUFFIX или SHLIB_SUFFIX, в зависимости от контекста (bpo-19555).

  • Любые вызовы функций open, которые указывают U, должны быть изменены. U неэффективен в Python3 и в конечном итоге вызовет ошибку, если его использовать. В зависимости от функции эквивалент её старого поведения Python2 может быть достигнут либо с помощью аргумента newline, либо, при необходимости, путём переноса потока в TextIOWrapper для использования его аргумента newline (bpo-15204).

    Если вы используете pyvenv в сценарии и хотите, чтобы pip не был установлен, вы должны добавить --without-pip к вызову команды.

  • Поведение по умолчанию json.dump() и json.dumps() при указании отступа изменилось: он больше не создаёт пробелы после элемента, разделяющего запятые в конце строк. Это будет иметь значение только в том случае, если у вас есть тесты, выполняющие сравнения такого вывода с учётом пробелов (bpo-16333).

  • doctest теперь ищет доктесты в строках модуля расширения __doc__, поэтому, если обнаружение теста доктест включает в себя модули расширения, содержащие похожие на доктесты строки, вы можете увидеть сбои тестов, которых вы никогда раньше не видели при выполнении тестов (bpo-3158).

  • Модуль collections.abc был немного переработан в рамках улучшений запуска Python. Как следствие этого, при импорте collections больше не происходит автоматического импорта collections.abc. Если ваша программа зависела от (недокументированного) неявного импорта, вам нужно добавить явный import collections.abc (bpo-20784).

Изменения в C API

  • PyEval_EvalFrameEx(), PyObject_Repr() и PyObject_Str(), наряду с некоторыми другими внутренними C API, теперь включают отладочное утверждение, которое гарантирует, что они не используются в ситуациях, когда они могут молча отклонить активное в данный момент исключение. В тех случаях, когда отбрасывание активного исключения ожидается и желательно (например, потому что оно уже было локально сохранено с PyErr_Fetch() или намеренно заменяется другим исключением), потребуется явный вызов PyErr_Clear(), чтобы избежать срабатывания утверждения при вызове данных операции (прямо или косвенно) и работающие с версией Python, скомпилированной с включенными утверждениями.
  • PyErr_SetImportError() теперь устанавливает TypeError, когда его аргумент msg не установлен. Ранее возвращался только NULL без набора исключений.
  • Результатом обратного вызова PyOS_ReadlineFunctionPointer теперь должна быть строка, выделенная PyMem_RawMalloc() или PyMem_RawRealloc(), или NULL, если произошла ошибка, вместо строки, выделенной PyMem_Malloc() или PyMem_Realloc() (bpo-16742)
  • PyThread_set_key_value() теперь всегда устанавливайте значение. В Python 3.3 функция ничего не делала, если ключ уже существовал (если текущее значение не является NULL указателем).
  • Поле f_tstate (состояние потока) структуры PyFrameObject было удалено, чтобы исправить ошибку: объяснение см. в bpo-14432.

Изменено в 3.4.3

PEP 476: Включение проверки сертификата по умолчанию для stdlib http-клиентов

http.client и использующие его модули urllib.request и xmlrpc.client, теперь будут проверять, что сервер представляет подписанный CA сертификат в хранилище доверенных сертификатов платформы и чье имя хоста соответствует запрашиваемому имени хоста по умолчанию. Что значительно улучшает безопасность для многих приложений.

Для приложений, которым требуется старое поведение, они могут передавать альтернативный контекст:

import urllib.request
import ssl

# Отключает все проверки
context = ssl._create_unverified_context()

# Позволяет использовать специальный сертификат для хоста, который не требует
# быть в доверенном хранилище
context = ssl.create_default_context(cafile="/path/to/file.crt")

urllib.request.urlopen("https://invalid-cert", context=context)