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

Автор:

R. Дэвид Мюррей <rdmurray@bitdance.com> (редактор)

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

См.также

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 будут установлены на всех платформах (где X.Y означает версию инсталляции Python) вместе с пакетом pip. пакетом Python и его зависимостями. В Windows и в виртуальных средах на всех платформах также будет установлена неверсированная команда pip. На других платформах общесистемная неверсированная команда pip обычно относится к отдельно установленной версии Python 2.

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

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

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

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

Примечание

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

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

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

Однако, поскольку в настоящее время эта миграция еще не завершена, старые версии этих руководств остаются доступными в виде Создание расширений C и C++ с помощью setuptools и Создание расширений C и C++ с помощью setuptools.

См.также

PEP 453 – Явная загрузка pip при установке Python

PEP написан Дональдом Стаффтом и Ником Когланом, реализован Дональдом Стаффтом, Ником Когланом, Мартином фон Лёвисом и Недом Дейли.

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

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

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

См.также

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

PEP написан и реализован Виктором Стиннером.

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

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

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

В отличие от удобных методов на str, bytes и bytearray, удобные функции codecs поддерживают произвольные кодеки как в Python 2, так и в Python 3, а не ограничиваются текстовыми кодировками 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'

Бинарные и текстовые преобразования, входящие в стандартную библиотеку, подробно описаны в Двоичные преобразования и Преобразования текста.

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

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

PEP 451 предоставляет инкапсуляцию информации о модуле, которую механизм импорта будет использовать для его загрузки (то есть спецификацию модуля). Это помогает упростить как реализацию импорта, так и несколько API, связанных с импортом. Это изменение также является ступенькой для several future import-related improvements.

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

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

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

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

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

  • Объекты модуля теперь имеют значение weakly referenceable.

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

  • Все кодеки UTF-* (кроме UTF-7) теперь отвергают суррогаты как при кодировании, так и при декодировании, если не используется обработчик ошибок surrogatepass, за исключением декодера UTF-16 (который принимает допустимые пары суррогатов) и кодера UTF-16 (который выдает их при кодировании не-BMP символов). (Внесено Виктором Стиннером, Канг-Хао (Кенни) Лу и Сергеем Сторчакой в bpo-12892).

  • Новый немецкий EBCDIC codec cp273. (Внесено Майклом Биренфельдом и Эндрю Кючлингом в bpo-1097797).

  • Новый украинский codec 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(), были изменены и улучшены в нескольких случаях в результате внедрения Argument Clinic и других изменений в модулях inspect и pydoc.

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

Новые модули

asyncio

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

Для Python 3.4 этот модуль считается provisional 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 этот модуль считается provisional API.

См.также

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

PEP написан и реализован Антуаном Питру.

селекторы

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

статистика

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

См.также

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

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() теперь принимают любой bytes-like object. (Внесено Сергеем Сторчакой в bpo-8311).

argparse

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

audioop

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

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

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

base64

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

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

коллекции

Метод ChainMap.new_child() теперь принимает аргумент m, указывающий дочернюю карту для добавления в цепочку. Это позволяет использовать для дочерней карты существующее отображение и/или пользовательский тип отображения. (Внесено Vinay Sajip в 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 также была обновлена, чтобы включить discussion различия между одноразовыми, многоразовыми и реентерабельными менеджерами контекста.

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

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

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

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

e-mail

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

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

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

Добавлена пара новых подклассов Message (EmailMessage и MIMEPart), а также новый подмодуль contentmanager и новый атрибут policy content_manager. Вся документация в настоящее время находится в новом модуле, который добавляется как часть нового provisional 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() в обычных callables. Новый дескриптор также упрощает получение произвольных callables (включая экземпляры partial()), которые будут вести себя как обычные методы экземпляра при включении в определение класса. (Вклад Алона Хорева и Ника Коглана в bpo-4331).

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

См.также

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

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

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

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

gc

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

глобус

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

hashlib

Новая функция hashlib.pbkdf2_hmac() обеспечивает PKCS#5 password-based key derivation function 2. (Внесено Кристианом Хаймсом в bpo-18582).

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

hmac

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

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

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

html

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

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

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

http

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

В параметре http.server command line interface теперь имеет опцию -b/--bind, которая заставляет сервер прослушивать определенный адрес. (Внесено Мальте Сварт в bpo-17764).

idlelib и IDLE

Поскольку idlelib реализует оболочку и редактор IDLE и не предназначен для импорта другими программами, он улучшается с каждым выпуском. Кумулятивный список изменений с версии 3.3.0, а также изменения, вносимые в будущие версии 3.4.x, см. в разделе Lib/idlelib/NEWS.txt. Этот файл также доступен из диалога 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 теперь предлагает базовый command line interface для быстрого отображения исходного кода и другой информации для модулей, классов и функций. (Вклад Клаудиу Попа и Ника Коглана в bpo-18626).

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

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

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

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

ipaddress

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

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

ведение журнала

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

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

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

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

маршал

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

mmap

Объекты mmap теперь weakly referenceable. (Внесено Валери Ламберт в bpo-4885).

многопроцессорная обработка

В Unix были добавлены два новых start methods, 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).

оператор

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

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

os

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

Новая функция cpu_count() сообщает количество CPU, доступных на платформе, на которой запущен 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. В pdb Python2 не было команды print; вместо нее при вводе print выполнялся оператор print. В Python3 команда print по ошибке стала псевдонимом для команды pdb p. p, однако, печатает repr своего аргумента, а не str, как это делала команда Python2 print. Хуже того, команда Python3 pdb print затеняет функцию Python3 print, делая ее недоступной в строке pdb. (Внесено Коннором Осборном в bpo-18764.)

маринованный огурец

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

См.также

PEP 3154 – Протокол огурцов 4

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

plistlib

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

poplib

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

pprint

Класс pprint модуля PrettyPrinter и его функции pformat() и pprint() имеют новую опцию compact, которая управляет форматированием вывода. В настоящее время установка compact в True означает, что последовательности будут выводиться с таким количеством элементов последовательности, которое помещается в ширину каждой строки (с отступом). (Внесено Сергеем Сторчакой в 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).

Повтор regex objects теперь включает шаблон и флаги; повтор match objects теперь включает начало, конец и часть строки, которая совпала. (Внесено Уго Лопесом Таваресом и Сергеем Сторчакой в bpo-13592 и bpo-17087).

ресурс

Новая функция 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).

выберите

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

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

полка

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

ШУТИЛ

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

smtpd

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

smtplib

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

сокет

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

У объектов Socket появились новые методы для получения или установки их inheritable flag, 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 (см. SQLite URI documentation). (Внесено 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 сертификатов и списков отзыва сертификатов (crls), а также метод 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() загружает набор стандартных сертификатов «центра сертификации» (ЦС) из мест по умолчанию, которые зависят от платформы. Его можно использовать для загрузки как сертификатов аутентификации веб-сервера TLS (purpose=SERVER_AUTH), которые клиент может использовать для проверки сервера, так и сертификатов, которые сервер может использовать для проверки клиентских сертификатов (purpose=CLIENT_AUTH). (Внесено Кристианом Хаймсом в bpo-19292).

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

Поддержка SNI (Server Name Indication) на стороне сервера с помощью нового метода ssl.SSLContext.set_servername_callback(). (Внесено Дэниелом Блэком в bpo-8109).

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

статистика

Модуль 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).

подпроцесс

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

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

сунау

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

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

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

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

sys

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

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

tarfile

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

textwrap

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

нарезка резьбы

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

traceback

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

типы

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

urllib

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

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

Объекты Request теперь многократно используются: при изменении атрибутов full_url или data обновляются все соответствующие внутренние свойства. Это означает, например, что теперь можно использовать один и тот же объект Request в нескольких вызовах OpenerDirector.open() с разными аргументами data или модифицировать Request' url, не пересчитывая его с нуля. Также появился новый метод 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)

приведет к созданию шести подтестов, каждый из которых будет идентифицирован в выводе unittest verbose меткой, состоящей из имени переменной 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 или выше, но можно указать как имя логгера, так и альтернативный минимальный уровень логирования. Объект, возвращаемый менеджером контекста, может быть запрошен на предмет LogRecords и/или отформатированных сообщений, которые были занесены в журнал. (Внесено Антуаном Питру в bpo-18937).

Обнаружение тестов теперь работает с пакетами пространств имен (Внесено Claudiu Popa в 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).

волна

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

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

wave теперь может write output to unseekable files. (Вклад Дэвида Джонса, Гильерме Поло и Сергея Сторчака в bpo-5202).

Методы writeframesraw() и writeframes() теперь принимают любой bytes-like object. (Внесено Сергеем Сторчакой в 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 keyword-only parameter, позволяющую контролировать, записываются ли элементы без содержимого в сокращенном (<tag />) или расширенном (<tag></tag>) виде. (Внесено Ариэлем Поляком и Сергеем Сторчакой в bpo-14377).

zip-файл

Метод 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 с тех пор, как циклический GC был впервые представлен.

См.также

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.

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

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

Примечание

PEP по Argument Clinic не полностью соответствует состоянию реализации. Это было признано приемлемым менеджером выпуска и основной командой разработчиков в данном случае, так как 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. (Внесено 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. (Внесено Кристианом Хаймсом в bpo-16632).

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

Прочие улучшения

  • У команды python появился новый option, -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 regression test suite теперь также проверяет утечки при выделении памяти, используя sys.getallocatedblocks(). (Внесено Антуаном Питру в bpo-13390).

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

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

  • Загрузка нескольких модулей python из одного модуля ОС (.so, .dll) теперь работает корректно (ранее она молча возвращала первый модуль python в файле). (Внесено Вацлавом Шмилауэром в bpo-16421).

  • Новый опкод, LOAD_CLASSDEREF, был добавлен для исправления ошибки загрузки свободных переменных в телах классов, которая могла быть вызвана некоторым использованием __prepare__. (Внесено Бенджамином Петерсоном в bpo-17853).

  • Виктор Стиннер обнаружил и исправил несколько ошибок, связанных с MemoryError, с помощью своего PEP 445-основанного pyfailmalloc инструмента (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 вместо malloc в obmalloc теперь используется родной VirtualAlloc, а не CRT malloc. Искусственные бенчмарки показывают экономию памяти около 3 %.

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

Утратившие актуальность

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

Утраты в API Python

  • Как указано в PEP 451: Тип ModuleSpec для системы импорта, ряд методов и функций importlib устарели: importlib.find_loader() заменяется на importlib.util.find_spec(); importlib.machinery.PathFinder.find_module() заменяется на importlib.machinery.PathFinder.find_spec(); importlib.abc.MetaPathFinder.find_module() заменяется на importlib.abc.MetaPathFinder.find_spec(); importlib.abc.PathEntryFinder.find_loader() и find_module() заменяются на importlib.abc.PathEntryFinder.find_spec(); все xxxLoader ABC load_module методы (importlib.abc.Loader.load_module(), importlib.abc.InspectLoader.load_module(), importlib.abc.FileLoader.load_module(), importlib.abc.SourceLoader.load_module()) больше не должны быть реализованы, вместо этого загрузчики должны реализовать exec_module метод (importlib.abc.Loader.exec_module(), importlib.abc.InspectLoader.exec_module() importlib.abc.SourceLoader.exec_module()) и позволить системе импорта позаботиться об остальном; и importlib.abc.Loader.module_repr(), importlib.util.module_for_loader(), importlib.util.set_loader() и importlib.util.set_package() больше не нужны, поскольку их функции теперь автоматически обрабатываются системой импорта.

  • Модуль imp находится в процессе депривации. Чтобы сохранить совместимость с кодовыми базами Python 2/3, удаление модуля в настоящее время не планируется.

  • Модуль formatter находится на стадии устаревания и планируется к удалению в Python 3.6.

  • MD5 в качестве digestmod по умолчанию для функции hmac.new() является устаревшим. Python 3.6 будет требовать явного имени или конструктора дайджеста в качестве аргумента digestmod.

  • Внутренний класс Netrc в модуле ftplib уже давно задокументирован как deprecated в его docstring. Теперь он излучает DeprecationWarning и будет полностью удален в Python 3.5.

  • Недокументированный аргумент endtime в subprocess.Popen.wait() не должен был использоваться и, надеюсь, не используется; он устарел и, скорее всего, будет удален в Python 3.5.

  • Аргумент strict HTMLParser является устаревшим.

  • Функции plistlib Функции readPlist(), writePlist(), readPlistFromBytes() и writePlistToBytes() устарели в пользу соответствующих новых функций load(), dump(), loads() и dumps(). Data() устарел в пользу использования конструктора bytes.

  • Ключ sysconfig SO устарел, он был заменен на EXT_SUFFIX.

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

  • Аргумент parser из xml.etree.ElementTree.iterparse() был устаревшим, как и аргумент html из XMLParser(). Чтобы подготовиться к удалению последнего, все аргументы в XMLParser следует передавать по ключевому слову.

Утраченные функции

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

  • Модуль site, добавляющий каталог «site-python» в sys.path, если он существует, устарел (bpo-19375).

Удалено

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

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

  • OS/2 (bpo-16135).

  • Windows 2000 (changeset e52df05b496a).

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

  • VMS (bpo-16136).

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

Следующие устаревшие и ранее утратившие актуальность 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. (Внесено Тарасом Ляпуном в 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. Раньше, если не было ведущей doc-строки, промежуточная строка иногда игнорировалась. Это приводит 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 был пропущен при преобразовании других TypeErrors. (Внесено Сергеем Сторчакой в 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 для разбора командной строки. Существуют некоторые недопустимые формы команд, которые раньше работали, но теперь не разрешены; теоретически это не должно вызывать проблем с обратной совместимостью, поскольку запрещенные формы команд не имеют никакого смысла и вряд ли будут использоваться.

  • Функции re.split(), re.findall() и re.sub(), а также методы group() и groups() объектов match теперь всегда возвращают объект bytes, если сопоставляемая строка - это bytes-like object. Ранее тип возвращаемого значения соответствовал типу вводимого, поэтому если ваш код зависел от того, что возвращаемое значение будет, например, 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__, так что если ваш тест doctest включает модули расширения, в которых есть вещи, похожие на доктесты, то при выполнении тестов вы можете увидеть сбои в тестах, которых раньше не было (bpo-3158).

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

Изменения в API языка C

  • PyEval_EvalFrameEx(), PyObject_Repr() и PyObject_Str(), а также некоторые другие внутренние API на языке C теперь включают отладочное утверждение, которое гарантирует, что они не будут использоваться в ситуациях, когда они могут молча отбросить активное в данный момент исключение. В случаях, когда отбрасывание активного исключения ожидаемо и желательно (например, потому что оно уже было сохранено локально с помощью 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: Включение проверки сертификатов по умолчанию для http-клиентов stdlib

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

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

import urllib.request
import ssl

# This disables all verification
context = ssl._create_unverified_context()

# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")

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