Что нового в 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. На других платформах общесистемная команда unversioned 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, по умолчанию при прямом вызове pip3 загружаются только версифицированные команды pip3.4 и ensurepip - опция --default-pip необходима, чтобы также запросить неверсифицированную команду pip. pyvenv и программа установки Windows обеспечивают доступность неквалифицированной команды pip в этих средах, а pip всегда можно вызвать с помощью ключа -m, а не напрямую, чтобы избежать двусмысленности на системах с несколькими установками Python.

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

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

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

См.также

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).

  • Объекты модуля теперь weakref’able.

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

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

Новые модули

asyncio

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

Для Python 3.4 этот модуль считается provisional API.

См.также

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

PEP написан и реализуется под руководством Гвидо ван Россума.

гарантпип

Новый модуль 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 теперь поддерживает 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).

электронная почта

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 (включая экземпляры 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 теперь является формально поддерживаемым интерфейсом. Он всегда существовал в CPython’s hashlib (хотя он не возвращал имена в нижнем регистре для всех поддерживаемых хэшей), но он не был публичным интерфейсом, и поэтому некоторые другие реализации 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 теперь полностью соответствует API PEP 247. (Вклад Кристиана Хаймса в bpo-18775).

html

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

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

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

http

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

В http.server 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

ABC InspectLoader определяет новый метод 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() теперь используют API signature(). Это позволяет им поддерживать гораздо более широкий спектр вызываемых объектов, включая те, которые имеют атрибуты __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. (Внесено Vinay Sajip в bpo-15452).

маршал

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

mmap

Объекты mmap теперь могут быть weakrefed. (Внесено Валери Ламберт в 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, поэтому вы можете использовать ее для создания Pools и других объектов, которые будут работать внутри этого контекста. Это позволяет фреймворку и приложению или различным частям одного и того же приложения использовать многопроцессорность, не мешая друг другу. (Внесено Ричардом Оудкерком в 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. В Python2 в pdb не было команды 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 – Pickle protocol 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).

shutil

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

smtpd

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

smtplib

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

розетка

Модуль socket теперь поддерживает протокол 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, предоставляют возможность получать сертификаты, информацию о сертификатах и СОС из хранилища сертификатов 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 это выделения, сделанные через API PyObject_Malloc()). Это может быть полезно для отслеживания утечек памяти, особенно если это автоматизировано с помощью набора тестов. (Внесено Антуаном Питру в bpo-13390).

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

tarfile

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

textwrap

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

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

Объект Thread, представляющий главный поток, можно получить из функции new 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„s 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 меткой, состоящей из имени переменной 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).

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

zipfile

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

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

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

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

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

См.также

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

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

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

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

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

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

Примечание

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

См.также

PEP 436 - Клиника аргументации DSL

PEP написан и реализован Ларри Хастингсом.

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

  • Новая функция PyType_GetSlot() была добавлена в стабильный ABI, позволяя извлекать указатели функций из именованных слотов типов при использовании ограниченного API. (Внесено Мартином фон Лёвисом в bpo-17162).

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

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

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

  • PyUnicode_FromFormat() теперь поддерживает спецификации ширины и точности для %s, %A, %U, %V, %S и %R. (Вклад внесли Ysj Ray и Виктор Стиннер в 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() является эквивалентом API C для operator.length_hint(). (Внесена Армином Ронахером в 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 вместо CRT VirtualAlloc в malloc теперь используется родной obmalloc. Искусственные бенчмарки показывают экономию памяти около 3%.

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

Утративший силу

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

Устранения в API Python

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

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

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

Удалено

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

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

  • OS/2 (bpo-16135).

  • Windows 2000 (набор изменений 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 больше не поддерживаются.

  • Устаревшие методы getter и setter 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 shell установка переменной окружения 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() и проходящий весь путь до ABCs. Для совместимости, при необходимости, перехватывайте оба 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 test discovery включает модули расширения, в которых есть вещи, похожие на доктесты, то при выполнении тестов (bpo-3158) вы можете увидеть ошибки тестирования, которых раньше не было.

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

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

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

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

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

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

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

Изменения в версии 3.4.3

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

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

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

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)
Вернуться на верх