Документация Python неофициальный перевод
Содержание страницы

Что нового в Python 3.4What’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 не было добавлено новых синтаксических возможностей.

Другие новые возможности:

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

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

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

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

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

Новые возможностиNew Features

PEP 453: Явная начальная загрузка PIP в установках PythonPEP 453: Explicit Bootstrapping of PIP in Python Installations

Автоматическая установка pip по умолчаниюBootstrapping pip By Default

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

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

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

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

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

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

Примечание

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

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

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

Однако, поскольку этот переход в настоящее время всё ещё не завершён, устаревшие версии этих руководств остаются доступными как Installing Python Modules (Legacy version) и Distributing Python Modules (Legacy version).

См. также

PEP 453 – Явная автоматическая установка pip в дистрибутивах Python

PEP написан Donald Stufft и Nick Coghlan, реализован Donald Stufft, Nick Coghlan, Martin von Löwis и Ned Deily.

PEP 446: Вновь созданные файловые дескрипторы являются ненаследуемымиPEP 446: Newly Created File Descriptors Are Non-Inheritable

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

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

См. также

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

PEP написан и реализован Victor Stinner.

Улучшения в работе с кодекамиImprovements to Codec Handling

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

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

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

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

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

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

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

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

>>> import codecs

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

The above exception was the direct cause of the following exception:

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

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

The above exception was the direct cause of the following exception:

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

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

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

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

(Автор: Nick Coghlan в bpo-7475, bpo-17827, bpo-17828 и bpo-19619.)

PEP 451: Тип ModuleSpec для системы импортаPEP 451: A ModuleSpec Type for the Import System

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

Изменения, видимые публично, полностью обратно совместимы. Более того, они должны быть незаметны для всех, кроме авторов импортеров. Ключевые методы finder и loader объявлены устаревшими, но продолжат работать. Новые импортеры должны использовать новые методы, описанные в PEP. Существующие импортеры следует обновить для реализации новых методов. См. раздел Устаревшее со списком методов, которые следует заменить, и их замен.

Прочие изменения языка Other Language Changes

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

  • База данных Unicode обновлена до версии UCD 6.3.

  • min() и max() теперь принимают аргумент default, передаваемый только по ключу, который можно использовать для указания значения, возвращаемого, если итерируемый объект, который они вычисляют, не содержит элементов. (Автор: Julian Berman в bpo-18111.)

  • Объекты модулей теперь weakref'уемы.

  • Атрибуты модуля __file__ (и связанные с ними значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением __main__.__file__, когда скрипт был выполнен напрямую с использованием относительного пути. (Автор: Brett Cannon в bpo-18416.)

  • Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты как при кодировании, так и при декодировании, если только не используется обработчик ошибок surrogatepass, за исключением декодера UTF-16 (который принимает допустимые суррогатные пары) и кодера UTF-16 (который создает их при кодировании символов вне BMP). (Авторы: Victor Stinner, Kang-Hao (Kenny) Lu и Serhiy Storchaka в bpo-12892.)

  • Новый кодек для немецкого EBCDIC cp273. (Авторы: Michael Bierenfeld и Andrew Kuchling в bpo-1097797.)

  • Новый кодек украинского cp1125. (Автор: Serhiy Storchaka в bpo-19668.)

  • bytes.join() и bytearray.join() теперь принимают произвольные буферные объекты в качестве аргументов. (Автор: Antoine Pitrou в bpo-15958.)

  • Конструктор int теперь принимает любой объект, имеющий метод __index__, для своего аргумента base. (Автор: Mark Dickinson в bpo-16772.)

  • Объекты фреймов теперь имеют метод clear(), который очищает все ссылки на локальные переменные из фрейма. (Автор: Antoine Pitrou в bpo-17934.)

  • memoryview теперь зарегистрирован как Sequence и поддерживает встроенную функцию reversed(). (Авторы: Nick Coghlan и Claudiu Popa в bpo-18690 и bpo-19078.)

  • Сигнатуры, сообщаемые help(), были изменены и улучшены в ряде случаев в результате внедрения Argument Clinic и других изменений в модули inspect и pydoc.

  • __length_hint__() теперь является частью формальной спецификации языка (см. PEP 424). (Автор: Armin Ronacher в bpo-16148.)

Новые модулиNew Modules

asyncio

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

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

См. также

PEP 3156 – Асинхронный ввод-вывод: перезагрузка: модуль «asyncio»

PEP написан, реализацией руководил Гвидо ван Россум.

ensurepip

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

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

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

enum

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

См. также

PEP 435 – Добавление типа Enum в стандартную библиотеку Python

PEP написан Барри Варшавой, Илай Бендерски и Итаном Фурманом, реализован Итаном Фурманом.

pathlib

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

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

См. также

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

PEP написан и реализован Antoine Pitrou.

selectors

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

statistics

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

См. также

PEP 450 – Добавление модуля статистики в стандартную библиотеку

PEP написан и реализован Стивеном Д’Апрано

tracemalloc

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

  • Отслеживание места выделения объекта

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

  • Вычисление различий между двумя снимками для обнаружения утечек памяти

См. также

PEP 454 – Добавление нового модуля tracemalloc для отслеживания выделений памяти Python

Автор PEP и разработчик: Victor Stinner

Улучшенные модулиImproved Modules

abc

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

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

aifc

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

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

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

argparse

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

audioop

audioop теперь поддерживает 24-битные семплы. (Автор: Serhiy Storchaka в bpo-12866.)

Новая функция byteswap() преобразует big-endian семплы в little-endian и обратно. (Автор: Serhiy Storchaka в bpo-19641.)

Все функции audioop теперь принимают любой bytes-like object. Строки не принимаются: раньше они не работали, теперь сразу вызывают ошибку. (Автор: Serhiy Storchaka в bpo-16685.)

base64

Функции кодирования и декодирования в base64 теперь принимают любой bytes-like object в тех случаях, когда раньше требовался экземпляр bytes или bytearray. (Автор: Nick Coghlan в bpo-17839.)

New functions a85encode(), a85decode(), b85encode(), and b85decode() provide the ability to encode and decode binary data from and to Ascii85 and the git/mercurial Base85 formats, respectively. The a85 functions have options that can be used to make them compatible with the variants of the Ascii85 encoding, including the Adobe variant. (Contributed by Martin Morrison, the Mercurial project, Serhiy Storchaka, and Antoine Pitrou in bpo-17618.)

collections

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

colorsys

Количество цифр в коэффициентах для преобразований RGB – YIQ было увеличено, чтобы они соответствовали версиям FCC NTSC. Изменение результатов должно быть менее 1% и может лучше соответствовать результатам, полученным в других местах. (Авторы: Brian Landers и Serhiy Storchaka в bpo-14323.)

contextlib

Новый менеджер контекста contextlib.suppress помогает прояснить намерение кода, который намеренно подавляет исключения из одного оператора. (Авторы: Raymond Hettinger в bpo-15806 и Zero Piraeus в bpo-19266.)

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

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

dbm

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

dis

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

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

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

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

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

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

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

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

(Авторы: Nick Coghlan, Ryan Kelly и Thomas Kluyver в bpo-11816 и Claudiu Popa в bpo-17916.)

Новая функция stack_effect() вычисляет влияние на стек Python заданного опкода и аргумента – информацию, которая иначе недоступна. (Автор: Larry Hastings в bpo-19722.)

doctest

Новый флаг опции, FAIL_FAST, останавливает выполнение теста сразу после обнаружения первого сбоя. (Авторы: R. David Murray и Daniel Urban в bpo-16522.)

Интерфейс командной строки doctest теперь использует argparse, и имеет две новые опции: -o и -f. -o позволяет указывать опции doctest в командной строке, а -f является сокращением для -o FAIL_FAST (по аналогии с подобной опцией, поддерживаемой CLI unittest). (Автор: R. David Murray в bpo-11390.)

doctest теперь будет находить doctests в строках __doc__ модулей расширения. (Автор: Zachary Ware в bpo-3158.)

email

as_string() теперь принимает аргумент policy для переопределения политики по умолчанию сообщения при создании его строкового представления. Это означает, что as_string теперь можно использовать в большем числе случаев, вместо того чтобы создавать и использовать generator для передачи параметров форматирования его методу flatten. (Автор: R. David Murray, bpo-18600.)

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

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

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

filecmp

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

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

functools

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

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

См. также

PEP 443 – Однодиспетчерские обобщённые функции

PEP написан и реализован Лукашем Лангой.

total_ordering() теперь поддерживает возвращаемое значение NotImplemented из базовой функции сравнения. (Автор: Katie Miller, bpo-10042.)

Чисто-питоновская версия функции partial() теперь находится в стандартной библиотеке; в CPython она переопределена C-ускоренной версией, но она доступна для других реализаций. (Автор: Brian Thorne, bpo-12428.)

gc

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

glob

Новая функция escape() позволяет экранировать специальные символы в имени файла, чтобы они не участвовали в раскрытии шаблона, а соответствовали буквально. (Автор: Serhiy Storchaka, bpo-8402.)

hashlib

Новая функция hashlib.pbkdf2_hmac() предоставляет функцию формирования ключа на основе пароля PKCS#5 версии 2. (Автор: Christian Heimes, bpo-18582.)

Атрибут name объектов хеша hashlib теперь является официально поддерживаемым интерфейсом. Он всегда существовал в CPython's hashlib (хотя не возвращал имена в нижнем регистре для всех поддерживаемых хешей), но не был публичным интерфейсом, поэтому некоторые другие реализации Python ранее его не поддерживали. (Автор: Jason R. Coombs, bpo-18532.)

hmac

hmac теперь принимает bytearray, а также bytes для аргумента key функции new(), а параметр msg как для функции new(), так и для метода update() теперь принимает любой тип, поддерживаемый модулем hashlib. (Автор: Jonas Borgström, bpo-18240.)

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

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

html

Новая функция unescape() преобразует символьные ссылки HTML5 в соответствующие символы Unicode. (Автор: Ezio Melotti, bpo-2927.)

HTMLParser принимает новый именованный аргумент convert_charrefs, который при значении True автоматически преобразует все символьные ссылки. Для обратной совместимости его значение по умолчанию равно False, но оно изменится на True в будущей версии Python, поэтому рекомендуется явно установить его и обновить свой код для использования этой новой возможности. (Автор: Ezio Melotti, bpo-13633.)

Аргумент strict функции HTMLParser теперь устарел. (Автор: Ezio Melotti, bpo-15114.)

http

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

В http.server интерфейсе командной строки теперь есть опция -b/--bind, которая заставляет сервер прослушивать определённый адрес. (Автор: Malte Swart в bpo-17764.)

idlelib и IDLEidlelib and IDLE

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

importlib

Абстрактный класс InspectLoader определяет новый метод, source_to_code(), который принимает исходные данные и путь и возвращает объект кода. Реализация по умолчанию эквивалентна compile(data, path, 'exec', dont_inherit=True). (Авторы: Eric Snow и Brett Cannon в bpo-15627.)

InspectLoader также теперь имеет реализацию по умолчанию для метода get_code(). Однако обычно желательно переопределить реализацию по умолчанию по соображениям производительности. (Автор: Brett Cannon в bpo-18072.)

Функция reload() была перемещена из imp в importlib в рамках устаревания модуля imp. (Автор: Berker Peksag в bpo-18193.)

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

Новые функции importlib.util cache_from_source() и source_from_cache() заменяют одноимённые функции в устаревшем модуле imp. (Автор: Brett Cannon в bpo-18194.)

Загрузчик importlib NamespaceLoader теперь соответствует абстрактному классу InspectLoader, что означает, что runpy и python -m теперь можно использовать с пространственно-именованными пакетами. (Автор: Brett Cannon в bpo-18058.)

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

importlib.machinery.ExtensionFileLoader теперь имеет метод get_filename(). Он был случайно пропущен в первоначальной реализации. (Автор: Eric Snow в bpo-19152.)

inspect

Модуль inspect теперь предлагает базовый интерфейс командной строки для быстрого отображения исходного кода и другой информации о модулях, классах и функциях. (Авторы: Claudiu Popa и Nick Coghlan в bpo-18626.)

unwrap() упрощает распутывание цепочек функций-обёрток, созданных с помощью functools.wraps() (и любого другого API, который устанавливает атрибут __wrapped__ на функцию-обёртку). (Авторы: Daniel Urban, Aaron Iles и Nick Coghlan в bpo-13266.)

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

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

signature() теперь поддерживает утиные типы функций CPython, что добавляет поддержку функций, скомпилированных с Cython. (Авторы: Stefan Behnel и Yury Selivanov в bpo-17159.)

ipaddress

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

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

logging

Класс TimedRotatingFileHandler имеет новый параметр atTime, который можно использовать для указания времени суток, когда должен произойти переворот. (Автор: Ronald Oussoren в bpo-9556.)

SocketHandler и DatagramHandler теперь поддерживают доменные сокеты Unix (устанавливая параметр port в None). (Автор: Vinay Sajip в коммите ce46195b56a9.)

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

Данные конфигурации логирования, полученные из сокета через функцию logging.config.listen(), теперь могут быть проверены до обработки путём передачи функции проверки в качестве аргумента нового именованного аргумента verify. (Автор: Vinay Sajip в bpo-15452.)

marshal

Версия по умолчанию для marshal была повышена до 3. Код, реализующий новую версию, восстанавливает поведение Python2, записывая только одну копию интернированных строк и сохраняя интернирование при десериализации, и расширяет эту способность «одна копия» на любой тип объекта (включая обработку рекурсивных ссылок). Это уменьшает как размер файлов .pyc, так и объём памяти, занимаемый модулем при загрузке из файла .pyc (или .pyo). (Автор: Kristján Valur Jónsson в bpo-16475, с дополнительными ускорениями от Antoine Pitrou в bpo-19219.)

mmap

Объекты mmap теперь можно weakref'овать. (Автор: Valerie Lambert, bpo-4885.)

multiprocessing

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

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

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

multiprocessing теперь полагается на runpy (реализующий флаг -m) для корректной инициализации __main__ в дочерних процессах при использовании методов запуска spawn или forkserver. Это устраняет некоторые пограничные случаи, когда сочетание multiprocessing, флага командной строки -m и явных относительных импортов могло приводить к трудноуловимым ошибкам в дочерних процессах. (Автор: Nick Coghlan, bpo-19946.)

operator

Новая функция length_hint() реализует спецификацию использования специального метода __length_hint__() в рамках формальной спецификации этой языковой возможности PEP 424. (Автор: Armin Ronacher, bpo-16148.)

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

os

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

Новая функция cpu_count() сообщает количество доступных процессоров на платформе, где выполняется Python (или None, если количество не удаётся определить). Функция multiprocessing.cpu_count() теперь реализована через эту функцию. (Авторы: Trent Nelson, Yogesh Chaudhari, Victor Stinner и Charles-François Natali, bpo-17914.)

os.path.samestat() теперь доступен на платформе Windows (а реализация os.path.samefile() теперь общая для Unix и Windows). (Автор: Brian Curtin, bpo-11939.)

os.path.ismount() теперь распознаёт тома, смонтированные ниже корня диска в Windows. (Автор: Tim Golden, bpo-9035.)

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

pdb

pdb была улучшена для более удобной работы с генераторами, yield и yield from. Это особенно полезно при отладке программ на основе asyncio. (Авторы: Andrew Svetlov и Xavier de Gaye, bpo-16596.)

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

pickle

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

См. также

PEP 3154 – протокол pickle 4

PEP написан Антуаном Питрой (Antoine Pitrou), реализован Александром Валсалотти (Alexandre Vassalotti).

plistlib

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

poplib

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

pprint

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

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

pty

pty.spawn() теперь возвращает значение статуса от os.waitpid() для дочернего процесса вместо None. (Автор: Gregory P. Smith.)

pydoc

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

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

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

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

re

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

repr объектов регулярных выражений теперь включает шаблон и флаги; repr объектов совпадений теперь включает начальную и конечную позиции, а также сопоставленную часть строки. (Авторы: Hugo Lopes Tavares и Serhiy Storchaka в bpo-13592 и bpo-17087.)

resource

Новая функция prlimit(), доступная на платформах Linux с версией ядра 2.6.36 или новее и glibc 2.13 или новее, позволяет запрашивать или устанавливать ограничения ресурсов для процессов, отличных от вызывающего. (Автор: Christian Heimes в bpo-16595.)

В Linux с версией ядра 2.6.36 или новее также появились некоторые новые константы, специфичные для Linux: RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME и RLIMIT_SIGPENDING. (Автор: Christian Heimes в bpo-19324.)

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

select

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

Объекты devpoll теперь имеют методы fileno() и close(), а также новый атрибут closed. (Автор: Victor Stinner в bpo-18794.)

shelve

Экземпляры Shelf теперь можно использовать в инструкциях with; они будут автоматически закрыты в конце блока with. (Автор: Filip Gruszczyński в bpo-13896.)

shutil

copyfile() теперь вызывает конкретный подкласс Error, SameFileError, когда исходный и целевой файлы совпадают, что позволяет приложению предпринять соответствующие действия при этой конкретной ошибке. (Авторы: Atsuo Ishimoto и Hynek Schlawack в bpo-1492704.)

smtpd

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

smtplib

SMTPException теперь является подклассом OSError, что позволяет перехватывать как ошибки на уровне сокетов, так и ошибки на уровне протокола SMTP в одном операторе try/except в коде, которому важно лишь, произошла ошибка или нет. (Автор: Ned Jackson Lovely в bpo-2118.)

socket

Модуль socket теперь поддерживает протокол CAN_BCM на платформах, которые его поддерживают. (Автор: Brian Thorne в bpo-15359.)

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

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

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

inet_pton() и inet_ntop() теперь поддерживаются в Windows. (Автор: Atsuo Ishimoto в bpo-7171.)

sqlite3

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

ssl

Добавлены PROTOCOL_TLSv1_1 и PROTOCOL_TLSv1_2 (поддержка TLSv1.1 и TLSv1.2); поддержка этих протоколов доступна только если Python собран с OpenSSL 1.0.1 или новее. (Авторы: Michele Orrù и Antoine Pitrou в bpo-16692.)

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

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

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

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

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

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

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

Поддержка SNI (Server Name Indication) на стороне сервера с помощью нового метода ssl.SSLContext.set_servername_callback(). (Автор: Daniel Black в bpo-8109.)

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

stat

Модуль stat теперь основан на C-реализации в _stat. Реализация на C необходима, поскольку большинство значений не стандартизированы и зависят от платформы. (Автор: Christian Heimes в bpo-11016.)

Модуль поддерживает новые флаги ST_MODE, S_IFDOOR, S_IFPORT и S_IFWHT. (Автор: Christian Hiemes в bpo-11016.)

struct

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

подпроцессsubprocess

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

getstatus() и getstatusoutput() теперь работают в Windows. Это изменение было случайно внесено в версии 3.3.4. (Автор: Tim Golden в bpo-10197.)

sunau

Метод getparams() теперь возвращает именованный кортеж (namedtuple) вместо обычного кортежа. (Автор: Claudiu Popa в bpo-18901.)

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

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

Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Автор: Serhiy Storchaka в bpo-8311.)

sys

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

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

tarfile

Модуль tarfile теперь поддерживает простой интерфейс командной строки при вызове как скрипт напрямую или через -m. Это можно использовать для создания и извлечения tar-архивов. (Автор: Berker Peksag в bpo-13477.)

textwrap

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

threading

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

traceback

Новая функция traceback.clear_frames() принимает объект traceback и очищает локальные переменные во всех фреймах, на которые он ссылается, уменьшая потребление памяти. (Автор: Andrew Kuchling в bpo-1565525.)

types

Новый дескриптор DynamicClassAttribute() предоставляет способ определить атрибут, который ведет себя нормально при доступе через экземпляр объекта, но перенаправляется на класс __getattr__ при доступе через класс. Это позволяет иметь активные свойства на классе и виртуальные атрибуты на классе с тем же именем (см. Enum для примера). (Автор: Ethan Furman в bpo-19030.)

urllib

urllib.request теперь поддерживает data: URL-адреса через класс DataHandler. (Автор: Mathias Panzenböck в bpo-16423.)

HTTP-метод, который будет использоваться классом Request, теперь можно указать, задав атрибут класса method в подклассе. (Автор: Jason R Coombs в bpo-18978.)

Request теперь можно переиспользовать: если изменить атрибуты full_url или data, все соответствующие внутренние свойства обновятся. Это означает, например, что теперь можно использовать один и тот же объект Request в нескольких вызовах OpenerDirector.open() с разными аргументами data или изменить url объекта Request вместо повторного вычисления с нуля. Также появился новый метод remove_header(), который можно использовать для удаления заголовков из Request. (Авторы: Алексей Качаев в bpo-16464, Daniel Wozniak в bpo-17485, Damien Brecht и Senthil Kumaran в bpo-17272).

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

unittest

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

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

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

unittest.main() теперь принимает итерируемый объект с именами тестов для defaultTest, тогда как раньше он принимал только одно имя теста в виде строки. (Автор: Jyrki Pulliainen в bpo-15132.)

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

discover() теперь сортирует обнаруженные файлы для обеспечения согласованного порядка тестов. (Авторы: Martin Melin и Jeff Ramnani в bpo-16709.)

TestSuite теперь удаляет ссылки на тесты сразу после выполнения теста, если тест успешен. В интерпретаторах Python, которые поддерживают сборку мусора, это позволяет собирать тесты, если ничто другое не удерживает ссылку на тест. Это поведение можно переопределить, создав подкласс TestSuite, который определяет пользовательский метод _removeTestAtIndex. (Авторы: Tom Wardill, Matt McClure и Andrew Svetlov в bpo-11798.)

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

Обнаружение тестов теперь работает с пакетами пространств имён (Автор: Claudiu Popa в bpo-17457.)

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

Объекты mock_open() теперь имеют методы readline и readlines. (Автор: Toshio Kuratomi в bpo-17467.)

venv

venv теперь включает скрипты активации для оболочек csh и fish. (Автор: Andrew Svetlov в bpo-15417.)

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

wave

Метод getparams() теперь возвращает namedtuple, а не обычный кортеж. (Автор: Claudiu Popa в bpo-17487.)

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

wave теперь может записывать вывод в файлы без возможности позиционирования. (Авторы: David Jones, Guilherme Polo и Serhiy Storchaka в bpo-5202.)

Методы writeframesraw() и writeframes() теперь принимают любой байтоподобный объект. (Автор: Serhiy Storchaka в bpo-8311.)

weakref

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

Новый класс finalize позволяет зарегистрировать колбэк, который будет вызван при сборке мусора объекта, без необходимости тщательно управлять жизненным циклом самой слабой ссылки. (Автор: Richard Oudkerk в bpo-15528.)

Колбэк, если он есть, связанный с ref, теперь доступен через атрибут __callback__. (Автор: Mark Dickinson в bpo-17643.)

xml.etree

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

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

zipfile

У метода writepy() класса PyZipFile появилась новая опция filterfunc, которая позволяет управлять тем, какие каталоги и файлы добавляются в архив. Например, с её помощью можно исключить тестовые файлы из архива. (Автор – Christian Tismer в bpo-19274.)

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

Изменения в реализации CPythonCPython Implementation Changes

PEP 445: Настройка распределителей памяти CPythonPEP 445: Customization of CPython Memory Allocators

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

См. также

PEP 445 – Добавление новых API для настройки распределителей памяти Python

PEP написан и реализован Victor Stinner.

PEP 442: Безопасная финализация объектовPEP 442: Safe Object Finalization

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

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

См. также

PEP 442 – Безопасная финализация объектов

PEP написан и реализован Antoine Pitrou.

PEP 456: Безопасный и взаимозаменяемый хэш-алгоритмPEP 456: Secure and Interchangeable Hash Algorithm

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

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

PEP 436: Argument Clinic

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

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

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

Примечание

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

См. также

PEP 436 – DSL Argument Clinic

PEP написан и реализован Larry Hastings.

Прочие изменения сборки и C APIOther Build and C API Changes

  • Новая функция PyType_GetSlot() добавлена в стабильный ABI, позволяя извлекать указатели на функции из именованных слотов типов при использовании ограниченного API. (Автор – Martin von Löwis в bpo-17162.)

  • Новый Py_SetStandardStreamEncoding() API предварительной инициализации позволяет приложениям, встраивающим интерпретатор CPython, надежно принудительно устанавливать конкретную кодировку и обработчик ошибок для стандартных потоков. (Авторы – Bastien Montagne и Nick Coghlan в bpo-16129.)

  • Большинство C API Python, которые не изменяют строковые аргументы, теперь правильно помечены как принимающие const char *, а не char *. (Автор – Serhiy Storchaka в bpo-1772673.)

  • Новую оболочку версию python-config можно использовать, даже если интерпретатор Python недоступен (например, в сценариях кросс-компиляции).

  • PyUnicode_FromFormat() теперь поддерживает спецификации ширины и точности для %s, %A, %U, %V, %S и %R. (Авторы – Ysj Ray и Victor Stinner в bpo-7330.)

  • Новая функция PyStructSequence_InitType2() дополняет существующую функцию PyStructSequence_InitType(). Разница в том, что она возвращает 0 при успехе и -1 при неудаче.

  • Исходный код CPython теперь можно компилировать с использованием функций проверки корректности адресов последних версий GCC и clang: ложные срабатывания в распределителе малых объектов были устранены. (Автор – Dhiru Kholia в bpo-18596.)

  • Сборка для Windows теперь использует Address Space Layout Randomization и Data Execution Prevention. (Автор – Christian Heimes в bpo-16632.)

  • Новая функция PyObject_LengthHint() является эквивалентом C API для operator.length_hint(). (Автор – Armin Ronacher в bpo-16148.)

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

  • Команда python получила новую опцию, -I, которая запускает её в «изолированном режиме». Это означает, что sys.path не содержит ни каталог скрипта, ни site-packages каталог пользователя, а все переменные окружения PYTHON* игнорируются (это подразумевает как -s, так и -E). Другие ограничения могут быть добавлены в будущем, с целью изолировать выполнение скрипта от пользовательского окружения. Это подходит, например, когда Python используется для запуска системного скрипта. На большинстве систем POSIX эту опцию можно и нужно использовать в #! строке системных скриптов. (Предложено Кристианом Хаймсом в bpo-16499.)

  • Автодополнение по табуляции теперь включено по умолчанию в интерактивном интерпретаторе на системах, поддерживающих readline. История также включена по умолчанию и записывается (и читается) из файла ~/.python-history. (Авторы: Antoine Pitrou и Éric Araujo, bpo-5845.)

  • Запуск интерпретатора Python с --version теперь выводит версию в стандартный вывод вместо стандартного вывода ошибок (bpo-18338). Аналогичные изменения были внесены в argparse (bpo-18920) и другие модули, которые имеют возможности вызова в стиле скриптов (bpo-18922).

  • Установщик CPython для Windows теперь добавляет .py в переменную PATHEXT при регистрации расширений, что позволяет пользователям запускать скрипт Python из командной строки Windows, просто введя его имя без расширения .py. (Автор: Paul Moore, bpo-18569.)

  • Новая цель make coverage-report соберёт python, запустит тестовый набор и сгенерирует HTML-отчёт о покрытии для кода на C с помощью gcov и lcov.

  • Опция -R для набора регрессионных тестов python теперь также проверяет утечки выделения памяти с помощью sys.getallocatedblocks(). (Автор: Antoine Pitrou, bpo-13390.)

  • python -m теперь работает с пространственно-именованными пакетами.

  • Модуль stat теперь реализован на C, что означает, что он получает значения своих констант из C-заголовочных файлов, а не имеет эти значения жёстко прописанными в модуле Python, как было раньше.

  • Загрузка нескольких модулей Python из одного OS-модуля (.so, .dll) теперь работает корректно (ранее она молча возвращала первый модуль Python в файле). (Автор: Václav Šmilauer, bpo-16421.)

  • Добавлен новый байт-код, LOAD_CLASSDEREF, для исправления ошибки в загрузке свободных переменных в телах классов, которая могла быть вызвана определёнными использованиями __prepare__. (Автор: Benjamin Peterson, bpo-17853.)

  • Ряд сбоев, связанных с MemoryError, были выявлены и исправлены Виктором Стиннером с помощью его инструмента pyfailmalloc, основанного на PEP 445 (bpo-18408, bpo-18520).

  • Команда pyvenv теперь принимает опцию --copies для использования копий вместо символьных ссылок даже в системах, где символьные ссылки используются по умолчанию. (Автор: Vinay Sajip, bpo-18807.)

  • Команда pyvenv также принимает опцию --without-pip для подавления автоматической начальной загрузки pip в виртуальное окружение. (Автор: Nick Coghlan, bpo-19552 в рамках реализации PEP 453.)

  • Имя кодировки теперь необязательно в значении переменной окружения PYTHONIOENCODING. Это позволяет задать только обработчик ошибок, не меняя кодировку по умолчанию. (Автор: Serhiy Storchaka, bpo-18818.)

  • Функции open модулей bz2, lzma и gzip теперь поддерживают режим x (исключительное создание). (Авторы: Tim Heaney и Vajrasky Kok, bpo-19201, bpo-19222 и bpo-19223.)

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

  • Декодер UTF-32 теперь работает в 3-4 раза быстрее. (Автор: Serhiy Storchaka, bpo-14625.)

  • Стоимость коллизий хэшей для множеств теперь снижена. Каждый проброс хэш-таблицы теперь проверяет серию последовательных соседних пар ключ/хэш, прежде чем продолжить случайные пробросы по хэш-таблице. Это использует локальность кэша для уменьшения затрат на разрешение коллизий. Схему разрешения коллизий можно описать как гибрид линейного зондирования и открытой адресации. Количество дополнительных линейных зондирований по умолчанию равно девяти. Это можно изменить во время компиляции, определив LINEAR_PROBES любым значением. Установите LINEAR_PROBES=0, чтобы полностью отключить линейное зондирование. (Автор: Raymond Hettinger, bpo-18771.)

  • Интерпретатор запускается примерно на 30% быстрее. К ускорению привели несколько мер. Интерпретатор загружает меньше модулей при запуске, например, модули re, collections и locale и их зависимости больше не импортируются по умолчанию. Модуль marshal был улучшен для более быстрой загрузки скомпилированного кода Python. (Авторы: Antoine Pitrou, Christian Heimes и Victor Stinner, bpo-19219, bpo-19218, bpo-19209, bpo-19205 и bpo-9548.)

  • bz2.BZ2File теперь не уступает или превосходит версию Python2 по скорости в большинстве случаев. lzma.LZMAFile также была оптимизирована. (Авторы: Serhiy Storchaka и Nadeem Vawda, bpo-16034.)

  • random.getrandbits() работает на 20–40% быстрее для малых целых чисел (наиболее распространённый случай использования). (Автор: Serhiy Storchaka, bpo-16674.)

  • Благодаря использованию нового формата хранения строк, сериализация с помощью pickle теперь значительно быстрее. (Авторы: Victor Stinner и Antoine Pitrou, bpo-15596.)

  • Решена проблема производительности в io.FileIO.readall(). Это особенно затрагивает Windows и значительно ускоряет передачу больших объёмов данных через subprocess. (Автор: Richard Oudkerk, bpo-15758.)

  • html.escape() теперь работает в 10 раз быстрее. (Автор: Matt Bryant, bpo-18020.)

  • В Windows теперь используется нативный VirtualAlloc вместо CRT malloc в obmalloc. Искусственные тесты показывают экономию памяти около 3%.

  • os.urandom() теперь использует лениво открываемый постоянный файловый дескриптор, чтобы избежать использования множества файловых дескрипторов при параллельном запуске из нескольких потоков. (Предложено Антуаном Питру в bpo-18756.)

УстарелоDeprecated

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

Устаревшее в Python APIDeprecations in the Python API

Устаревшие возможностиDeprecated Features

  • Запуск IDLE с флагом -n (без подпроцесса) устарел. Однако функция не будет удалена до тех пор, пока не будет решена проблема bpo-18823.

  • Добавление модулем site каталога «site-python» в sys.path (если он существует) объявлено устаревшим (bpo-19375).

УдаленоRemoved

Операционные системы, поддержка которых прекращенаOperating Systems No Longer Supported

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

  • OS/2 (bpo-16135).

  • Windows 2000 (изменение e52df05b496a).

  • Системы Windows, в которых COMSPEC указывает на command.com (bpo-14470).

  • VMS (bpo-16136).

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

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

  • Не поддерживаемые каталоги Misc/TextMate и Misc/vim были удалены (см. devguide с предложениями по замене).

  • Макрос SO makefile удалён (он был заменён макросами SHLIB_SUFFIX и EXT_SUFFIX) (bpo-16754).

  • Поле PyThreadState.tick_counter было удалено; его значение было бессмысленным начиная с Python 3.2, когда была введена «новая GIL» (bpo-19199).

  • Функции PyLoader и PyPycLoader удалены из importlib. (Автор: Taras Lyapun, bpo-15641.)

  • Аргумент strict функций HTTPConnection и HTTPSConnection был удалён. «Простые ответы» (Simple Responses) в стиле HTTP 0.9 больше не поддерживаются.

  • Устаревшие методы-геттеры и сеттеры urllib.request.Request: add_data, has_data, get_data, get_type, get_host, get_selector, set_proxy, get_origin_req_host и is_unverifiable были удалены (вместо них следует напрямую обращаться к атрибутам).

  • Поддержка загрузки устаревшего TYPE_INT64 удалена из marshal. (Автор: Dan Riti, bpo-15480.)

  • inspect.Signature: параметры только по позиции теперь должны иметь допустимое имя.

  • object.__format__() больше не принимает непустые строки формата; вместо этого теперь генерируется TypeError. Использование непустой строки было объявлено устаревшим начиная с Python 3.2. Это изменение призвано предотвратить ситуацию, когда ранее работавший (но некорректный) код начинал выдавать ошибку, если объект получал метод __format__. Это означает, что теперь может возникнуть TypeError, если используется код формата 's' с объектами, у которых нет метода __format__, обрабатывающего его. Подробнее см. bpo-7994.

  • Функции difflib.SequenceMatcher.isbjunk() и difflib.SequenceMatcher.isbpopular() были объявлены устаревшими в версии 3.2 и теперь удалены. Используйте x in sm.bjunk и x in sm.bpopular, где sm – объект SequenceMatcher (bpo-13248).

Очистка кодаCode Cleanups

  • Неиспользуемый и задокументированный внутренний класс Scanner удалён из модуля pydoc.

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

  • Труднокодированные копии некоторых констант stat, которые были включены в пространство имён модуля tarfile, удалены.

Перенос на Python 3.4Porting to Python 3.4

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

Изменения в поведении команды ‘python’Changes in ‘python’ Command Behavior

  • В оболочке posix установка переменной окружения PATH в пустое значение эквивалентна её отсутствию. Однако установка PYTHONPATH в пустое значение не была эквивалентна её отсутствию: установка PYTHONPATH в пустое значение была эквивалентна установке ., что приводило к путанице при аналогии с тем, как работает PATH. Теперь поведение соответствует соглашению posix для PATH.

  • Вывод [X refs, Y blocks] отладочной (--with-pydebug) сборки интерпретатора CPython теперь по умолчанию отключён. Его можно снова включить с помощью опции -X showrefcount. (Вклад Ezio Melotti в bpo-17323.)

  • Команда python и большинство скриптов stdlib (а также argparse) теперь выводят информацию --version в stdout вместо stderr (список задач см. в Other Improvements выше).

Изменения в Python APIChanges in the Python API

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Функции re.split(), re.findall() и re.sub(), а также методы group() и groups() объектов match теперь всегда возвращают объект bytes, если строка, которую нужно сопоставить, является байтоподобным объектом. Ранее тип возвращаемого значения соответствовал типу входных данных, поэтому если ваш код зависел от того, что возвращаемое значение было, скажем, bytearray, вам потребуется изменить код.

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

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

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

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

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

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

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

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

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

Изменения в C APIChanges in the C API

  • PyEval_EvalFrameEx(), PyObject_Repr() и PyObject_Str(), а также некоторые другие внутренние C API, теперь включают отладочное утверждение, которое гарантирует, что они не используются в ситуациях, когда могут молча отбросить активное в данный момент исключение. В случаях, когда отбрасывание активного исключения ожидаемо и желательно (например, потому что оно уже было сохранено локально с помощью PyErr_Fetch() или намеренно заменяется другим исключением), потребуется явный вызов PyErr_Clear(), чтобы не запускать утверждение при вызове этих операций (прямо или косвенно) и запуске на версии Python, скомпилированной с включёнными утверждениями.

  • PyErr_SetImportError() теперь устанавливает TypeError, когда его аргумент msg не задан. Ранее возвращался только NULL без установленного исключения.

  • Результат колбэка PyOS_ReadlineFunctionPointer теперь должен быть строкой, выделенной с помощью PyMem_RawMalloc() или PyMem_RawRealloc(), или NULL в случае ошибки, а не строкой, выделенной с помощью PyMem_Malloc() или PyMem_Realloc() (bpo-16742)

  • PyThread_set_key_value() теперь всегда устанавливает значение. В Python 3.3 функция ничего не делала, если ключ уже существовал (если текущее значение является указателем, не равным NULL).

  • Поле f_tstate (состояние потока) структуры PyFrameObject было удалено для исправления ошибки: см. bpo-14432 для обоснования.

Изменено в версии 3.4.3Changed in 3.4.3

PEP 476: Включение проверки сертификатов по умолчанию для HTTP-клиентов стандартной библиотекиPEP 476: Enabling certificate verification by default for stdlib http clients

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

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

import urllib.request
import ssl

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

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

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