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

Автор:

Р. Дэвид Мюррей <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

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

Новый модуль 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 интерфейс прикладного программирования установка 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 были полностью переработаны в виде краткого руководства по началу работы и часто задаваемых вопросов. Большая часть документации по упаковке теперь перенесена в Python Packaging Authority, поддерживаемый Python Packaging User Guide, а также в документацию по отдельным проектам.

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

См.также

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 (и были описаны в regression test suite) начиная с версии 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)

Наконец, как показывают приведенные выше примеры, эти улучшения позволили восстановить удобные псевдонимы для кодеков, отличных от Unicode, которые сами были восстановлены в 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: Тип спецификации модуля для системы импорта

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

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

  • Новый украинский язык codec cp1125. (Автор Сергей Сторчака в bpo-19668.)

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

  • Конструктор int теперь принимает любой объект, который имеет метод __index__ в качестве своего базового аргумента. (Добавлено Марком Дикинсоном в bpo-16772.)

  • В объектах Frame теперь есть метод clear(), который удаляет из фрейма все ссылки на локальные переменные. (Автор: Антуан Питру в статье bpo-17934).

  • memoryview теперь зарегистрирован как Sequence и поддерживает встроенный reversed(). (Авторы - Ник Коглан и Клаудиу Попа в bpo-18690 и bpo-19078.)

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

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

Новые модули

асинхронный

Новый модуль 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 (определенный в PEP 435) предоставляет стандартную реализацию типов перечислений, позволяя другим модулям (таким как socket) предоставлять более информативные сообщения об ошибках и улучшать поддержку отладки, заменяя непрозрачные целочисленные константы обратными совместимые значения перечисления.

См.также

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

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

файл пути

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

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

См.также

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

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

селекторы

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

статистика

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

См.также

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

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

трассировочный блок

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

  • Отслеживание того, где был размещен объект

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

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

См.также

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

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

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

азбука

abc.get_cache_token`New function << < 0>>> can be used to know when to invalidate caches that are affected by changes in the object graph.  (Contributed by Lukasz Langa in :issue:`16832().)

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

мфца

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

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

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

аргументированный анализ

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

аудиозапись

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

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

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

базовый уровень 64

Функции кодирования и декодирования в 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, указывающий дочернюю карту, которую нужно добавить в цепочку. Это позволяет использовать существующую карту и/или пользовательский тип отображения для дочерней карты. (Автор: Винай Саджип в статье bpo-16613.)

цветовая гамма

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

контекстная библиотека

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

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

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

дбм

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

дис

Функции 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.)

самый проверенный

Новая функция 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 содержит список каталогов, которые используются в качестве значения по умолчанию для параметра игнорировать функции dircmp(). (Добавлено Эли Бендерским в bpo-15442.)

функциональные средства

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

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

См.также

PEP 443 – Универсальные функции с одной отправкой

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

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

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

gc (общий сбор)

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

глобус

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

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

Новая функция hashlib.pbkdf2_hmac() предоставляет способ экранировать специальные символы в имени файла, чтобы они не становились частью расширенного списка, а вместо этого соответствовали буквально. (Добавлено Сергеем Сторчакой в PKCS#5 password-based key derivation function 2. bpo-18582 )

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

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

Новая функция hmac предоставляет способ экранировать специальные символы в имени файла, чтобы они не становились частью расширенного списка, а вместо этого соответствовали буквально. (Добавлено Сергеем Сторчакой в bytearray. bytes new() new() update() hashlib bpo-18240 )

Новая функция hmac.new() предоставляет способ экранировать специальные символы в имени файла, чтобы они не становились частью расширенного списка, а вместо этого соответствовали буквально. (Добавлено Сергеем Сторчакой в hashlib. MD5 bpo-17276 )

Новая функция block_size предоставляет способ экранировать специальные символы в имени файла, чтобы они не становились частью расширенного списка, а вместо этого соответствовали буквально. (Добавлено Сергеем Сторчакой в name. digest_size hmac PEP 247 bpo-18775 )

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

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

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

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

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

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

Новая функция http.server преобразует ссылки на символы HTML5 в соответствующие символы Unicode. (Добавлено Эцио Мелотти в command line interface. -b/--bind bpo-17764 )

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

Новая функция Lib/idlelib/NEWS.txt преобразует ссылки на символы HTML5 в соответствующие символы Unicode. (Добавлено Эцио Мелотти в Help ‣ About IDLE.)

импортный файл

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 заменяют одноименные функции в устаревшем модуле 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__, с метаданными, предоставляемыми argument clinic, объектами functools.partial() и многим другим. Обратите внимание, что, в отличие от signature(), эти функции по-прежнему игнорируют атрибуты __wrapped__ и сообщают об уже связанном первом аргументе для связанных методов, поэтому все равно необходимо обновить свой код, чтобы использовать signature() напрямую, если эти функции необходимы. (Автор: Юрий Селиванов в bpo-17481.)

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

ip-адрес

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). (Добавлено Винаем Саджипом в коммите ce46195b56a9.)

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

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

маршал

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

ммап

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

m

start methods spawn forkserver multiprocessing spawn get_all_start_methods() get_start_method() set_start_method() bpo-8713 m

multiprocessing context get_context() multiprocessing Pool bpo-18999 m

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

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

оператор

__length_hint__() PEP 424 bpo-16148 р

operator`операто :issue:`16694 р

o

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

Появились новые функции для получения и установки cpu_count() файлового дескриптора (None, multiprocessing.cpu_count()) или дескриптора Windows (bpo-17914, ).

Появились новые функции для получения и установки os.path.samestat() файлового дескриптора (os.path.samefile(), bpo-11939) или дескриптора Windows ( , ).

Появились новые функции для получения и установки os.path.ismount() файлового дескриптора (bpo-9035, ) или дескриптора Windows ( , ).

Появились новые функции для получения и установки os.open() файлового дескриптора (O_PATH, O_TMPFILE) или дескриптора Windows (bpo-18673, ).

pdb (почтовый индекс)

pdb`pdb (почтовый :keyword:`yield индекс yield from asyncio bpo-16596 )

print``pdb (почтовый :mod:`pdb`  индекс :func:`print`  ``pdb print print print print p p repr str print pdb print print pdb bpo-18764 )

соленый огурец

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

См.также

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

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

plistlib - список

plistlib`plistlib :func:`~plistlib.load - списо dump() loads() dumps() FMT_XML FMT_BINARY bpo-14455 к

поплиб

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

печать

pprint`печат :class:`~pprint.PrettyPrinter pformat() pprint() True bpo-19132 ь

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

пти

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

pydoc

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

Модуль pydoc теперь основан непосредственно на self introspection API, что позволяет ему предоставлять информацию о сигнатурах для более широкого спектра вызываемых объектов. Это изменение также означает, что атрибуты bpo-20710 теперь учитываются при отображении справочной информации. (Добавлено Ларри Хастингсом в статье .)

Модуль pydoc теперь основан непосредственно на __dir__ introspection API, что позволяет ему предоставлять информацию о сигнатурах для более широкого спектра вызываемых объектов. Это изменение также означает, что атрибуты inspect теперь учитываются при отображении справочной информации. (Добавлено Ларри Хастингсом в статье .)

Модуль help() теперь основан непосредственно на pydoc introspection API, что позволяет ему предоставлять информацию о сигнатурах для более широкого спектра вызываемых объектов. Это изменение также означает, что атрибуты help() теперь учитываются при отображении справочной информации. (Добавлено Ларри Хастингсом в статье .)

ре

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

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

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

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

Новая функция RLIMIT_MSGQUEUE, доступная на платформах Linux с ядром версии 2.6.36 или более поздней и glibc версии 2.13 или более поздней, предоставляет возможность запрашивать или устанавливать ограничения ресурсов для процессов, отличных от того, который выполняет вызов. (Автор: Кристиан Хеймс в RLIMIT_NICE. RLIMIT_RTPRIO RLIMIT_RTTIME RLIMIT_SIGPENDING bpo-19324 )

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

выбирать

epoll`выбират :keyword:`with close() bpo-16488 ь

fileno close() closed bpo-18794 ь

выбирать

Shelf`выбират :keyword:`with with bpo-13896 ь

выбирать

Error() SameFileError bpo-1492704 ь

выбирать

SMTPChannel asynchat.async_chat bpo-11959 ь

выбирать

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

разъем

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

Модуль socket теперь поддерживает протокол inheritable flag на платформах, которые его поддерживают. (Добавлено Брайаном Торном в get_inheritable(). set_inheritable() )

Модуль socket теперь поддерживает протокол socket.AF_* на платформах, которые его поддерживают. (Добавлено Брайаном Торном в socket.SOCK_*. enum )

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

Константа inet_pton() теперь inet_ntop() доступна bpo-7171 в BSD и OSX.

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

Константа connect() теперь uri доступна SQLite URI documentation в BSD bpo-13773 и OSX.

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

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

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

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

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

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

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

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

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

Две новые функции, доступные только для Windows, ssl.SSLContext.set_servername_callback() и bpo-8109, предоставляют возможность извлекать сертификаты, информацию о сертификатах и CRL из хранилища сертификатов Windows. (Автор Кристиан Хеймс в статье ).

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

статистика

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

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

s

iter_unpack struct.Struct.iter_unpack() bpo-17804 s

s

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

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

сунау

Метод getparams() теперь возвращает namedtuple, а не простой кортеж. (Добавлено Клаудиу Попой в 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).

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

архивный файл

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

текстовая обертка

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

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

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

обратная связь

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

типы

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

urllib

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

Метод http, который будет использоваться классом Request, теперь можно указать, установив атрибут класса method для подкласса. (Добавлено Джейсоном Р. Кумбсом в 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.)

единичный тест

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

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

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

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

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

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

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

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

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

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

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

венв

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

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

волна

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

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

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

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

слабая ссылка

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

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

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

xml.это дерево

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

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

почтовый файл

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

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

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

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

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

См.также

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

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

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

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

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

См.также

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

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

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

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

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

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

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

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

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

Примечание

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

См.также

PEP 436 – Аргументация клиники DSL

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

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

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

  • Новый API предварительной инициализации:c:func:Py_SetStandardStreamEncoding позволяет приложениям, использующим интерпретатор Python, надежно использовать определенную кодировку и обработчик ошибок для стандартных потоков. (Авторы Бастьен Монтань и Ник Коглан в bpo-16129).

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

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

  • PyUnicode_FromFormat() теперь поддерживает спецификации ширины и точности для %s, %A, %U, %V, %S, и %R. (Авторы - Юси Джей Рэй и Виктор Стиннер в bpo-7330.)

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

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

  • В сборке Windows теперь используются Address Space Layout Randomization и Data Execution Prevention. (Добавлено Кристианом Хеймсом в bpo-16632.)

  • Новая функция: c:func:PyObject_LengthHint является эквивалентом C API для 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).

  • Установщик Windows CPython теперь добавляет .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 malloc в obmalloc теперь используется собственный VirtualAlloc. Искусственные тесты показывают экономию памяти примерно на 3%.

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

Осуждаемый

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

Амортизация в Python API

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

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

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

Удаленный

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

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

  • ОПЕРАЦИОННАЯ система/2 (bpo-16135).

  • Windows 2000 (набор изменений e52df05b496a).

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

  • ВИРТУАЛЬНЫЕ машины (bpo-16136).

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

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

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

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

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

  • PyLoader и PyPycLoader были удалены из importlib. (Добавлено Тарасом Ляпуном в bpo-15641.)

  • Аргумент strict для HTTPConnection и HTTPSConnection был удален. «Простые ответы» в стиле HTTP 0.9 больше не поддерживаются.

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

  • Поддержка загрузки устаревшего TYPE_INT64 была удалена из marshal. (Добавлено Дэном Рити в bpo-15480.)

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

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

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

Очистка кода

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

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

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

Перенос на Python 3.4

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

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

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

  • Выходные данные [Внешние ссылки, блоки Y] отладочной (--with-pydebug) сборки интерпретатора CPython теперь по умолчанию отключены. Их можно снова включить, используя опцию -X showrefcount. (Автор - Эцио Мелотти в bpo-17323.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Вызов read или write в закрытом SSLSocket теперь вызывает информативный 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__ dicts теперь изменены должным образом, аналогично __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-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 теперь выполняется поиск тестов doctest в строках модуля расширения __doc__, поэтому, если в вашем тестовом поиске doctest есть модули расширения, в которых есть элементы, похожие на тесты doctest, вы можете увидеть ошибки тестирования, которых раньше никогда не видели, при выполнении тестов (bpo-3158).

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

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

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