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

Что нового в Python 3.7What’s New In Python 3.7

Редактор

Elvis Pranskevichus <elvis@magic.io>

В этой статье описываются новые возможности Python 3.7 по сравнению с 3.6. Python 3.7 был выпущен 27 июня 2018 года. Подробности см. в списке изменений.

Краткий обзор – Основные моменты выпускаSummary – Release Highlights

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

  • PEP 563, отложенная оценка аннотаций типов.

Несовместимые с предыдущими версиями синтаксические изменения:

  • async и await теперь зарезервированные ключевые слова.

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

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

Улучшения модели данных Python:

  • PEP 562, настройка доступа к атрибутам модуля.

  • PEP 560, базовая поддержка модуля typing и обобщённых типов.

  • свойство сохранения порядка вставки dict объектов было объявлено официальной частью спецификации языка Python.

Значительные улучшения в стандартной библиотеке:

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

  • Отказ от использования ASCII в качестве кодировки текста по умолчанию:

    • PEP 538, принудительное приведение устаревшей локали C

    • PEP 540, режим принудительной UTF-8 во время выполнения

  • PEP 552, детерминированные .pyc-файлы

  • новый режим разработки

  • PEP 565, улучшенная обработка DeprecationWarning

Улучшения C API:

  • PEP 539, новый C API для локальной памяти потоков

Улучшения документации:

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

Список изменений, которые могут повлиять на совместимость с предыдущими версиями Python, приведён в разделе Переход на Python 3.7.

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

PEP 563: Отложенное вычисление аннотацийPEP 563: Postponed Evaluation of Annotations

Появление аннотаций типов в Python выявило две серьёзные проблемы удобства использования функциональности аннотаций, добавленной в PEP 3107 и доработанной в PEP 526:

  • аннотации могли использовать только имена, уже доступные в текущей области видимости, то есть не поддерживали прямые ссылки любого рода; и

  • аннотирование исходного кода отрицательно сказывалось на времени запуска программ Python.

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

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

class C:
    @classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...

Поскольку это изменение нарушает совместимость, в Python 3.7 новое поведение необходимо включать для каждого модуля отдельно с помощью импорта __future__:

from __future__ import annotations

В Python 3.10 оно станет поведением по умолчанию.

См. также

PEP 563 – Отложенное вычисление аннотаций

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

PEP 538: Принудительное приведение устаревшей локали CPEP 538: Legacy C Locale Coercion

Постоянной проблемой в серии Python 3 было определение разумной стратегии по умолчанию для обработки предположения о текстовой кодировке «7-битный ASCII», которое в настоящее время подразумевается использованием локали C или POSIX по умолчанию на платформах, отличных от Windows.

PEP 538 обновляет интерфейс командной строки интерпретатора по умолчанию, чтобы автоматически приводить эту локаль к доступной локали на основе UTF-8, как описано в документации новой переменной окружения PYTHONCOERCECLOCALE. Автоматическая установка LC_CTYPE таким образом означает, что и сам интерпретатор, и C-расширения, учитывающие локаль (такие как readline), будут предполагать использование UTF-8 в качестве кодировки текста по умолчанию вместо ASCII.

Определение поддержки платформы в PEP 11 также было обновлено, чтобы ограничить полную поддержку обработки текста должным образом настроенными локалями, отличными от ASCII.

В рамках этого изменения обработчик ошибок по умолчанию для stdin и stdout теперь равен surrogateescape (вместо strict) при использовании любой из определённых целевых локалей приведения (в настоящее время C.UTF-8, C.utf8 и UTF-8). Обработчик ошибок по умолчанию для stderr по-прежнему равен backslashreplace, независимо от локали.

Приведение локали по умолчанию выполняется без вывода сообщений, но для помощи в отладке потенциальных проблем интеграции, связанных с локалью, можно запросить явные предупреждения (выводимые непосредственно в stderr), установив PYTHONCOERCECLOCALE=warn. Эта настройка также заставит среду выполнения Python выдавать предупреждение, если устаревшая локаль C остаётся активной при инициализации основного интерпретатора.

Хотя принудительное приведение локали из PEP 538 имеет преимущество, влияя также на модули расширения (например, GNU readline) и дочерние процессы (включая те, что выполняют не-Python-приложения и старые версии Python), у него есть недостаток: требуется, чтобы на работающей системе была доступна подходящая целевая локаль. Чтобы лучше справиться со случаем, когда подходящая целевая локаль недоступна (как, например, на RHEL/CentOS 7), Python 3.7 также реализует PEP 540: Режим принудительной UTF-8 во время выполнения.

См. также

PEP 538 – Принудительное приведение устаревшей локали C к локали на основе UTF-8

PEP написан и реализован Ником Когланом.

PEP 540: Принудительный режим UTF-8 во время выполненияPEP 540: Forced UTF-8 Runtime Mode

Новую опцию командной строки -X utf8 и PYTHONUTF8 переменную окружения можно использовать для включения режима UTF-8 в CPython.

В режиме UTF-8 CPython игнорирует настройки локали и по умолчанию использует кодировку UTF-8. Обработчики ошибок для потоков sys.stdin и sys.stdout устанавливаются в surrogateescape.

Принудительный режим UTF-8 позволяет изменить обработку текста во встроенном интерпретаторе Python без изменения настроек локали приложения-хоста.

Хотя режим UTF-8 из PEP 540 имеет преимущество работы независимо от того, какие локали доступны в системе, у него есть недостаток: он не влияет на модули расширения (например, GNU readline), дочерние процессы, выполняющие не-Python приложения, и дочерние процессы, работающие под старыми версиями Python. Чтобы снизить риск повреждения текстовых данных при обмене с такими компонентами, Python 3.7 также реализует PEP 540: Принудительный режим UTF-8 во время выполнения).

Режим UTF-8 включается по умолчанию, когда локаль установлена в C или POSIX, а функция принудительной смены локали PEP 538 не может изменить её на альтернативу на основе UTF-8 (будь то из-за установленной PYTHONCOERCECLOCALE=0, установленной LC_ALL или отсутствия подходящей целевой локали).

См. также

PEP 540 – Добавление нового режима UTF-8

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

PEP 553: Встроенная функция breakpoint()PEP 553: Built-in breakpoint()

Python 3.7 включает новую встроенную функцию breakpoint() как простой и единообразный способ войти в отладчик Python.

Встроенная функция breakpoint() вызывает sys.breakpointhook(). По умолчанию последняя импортирует pdb, а затем вызывает pdb.set_trace(), но привязка sys.breakpointhook() к выбранной функции позволяет breakpoint() войти в любой отладчик. Кроме того, переменную окружения PYTHONBREAKPOINT можно установить в вызываемый объект выбранного отладчика. Установите PYTHONBREAKPOINT=0, чтобы полностью отключить встроенную breakpoint().

См. также

PEP 553 – Встроенная функция breakpoint()

Автор PEP и разработчик: Barry Warsaw

PEP 539: Новый C API для локальной памяти потоковPEP 539: New C API for Thread-Local Storage

Хотя Python предоставляет C API для поддержки локального хранилища потоков, существующий API локального хранилища потоков (TLS) использовал int для представления ключей TLS на всех платформах. Обычно это не было проблемой для официально поддерживаемых платформ, но такой подход не является ни совместимым с POSIX, ни переносимым в практическом смысле.

PEP 539 changes this by providing a new Thread Specific Storage (TSS) API to CPython which supersedes use of the existing TLS API within the CPython interpreter, while deprecating the existing API. The TSS API uses a new type Py_tss_t instead of int to represent TSS keys–an opaque type the definition of which may depend on the underlying TLS implementation. Therefore, this will allow to build CPython on platforms where the native TLS key is defined in a way that cannot be safely cast to int.

Обратите внимание: на платформах, где нативный ключ TLS определён таким образом, что его нельзя безопасно привести к int, все функции существующего TLS API будут пустышками и немедленно вернут код ошибки. Это явно указывает на то, что старый API не поддерживается на платформах, где его нельзя надёжно использовать, и что не будет предпринято попыток добавить такую поддержку.

См. также

PEP 539 – Новый C-API для локальной памяти потоков в CPython

Автор PEP: Erik M. Bray; реализация: Masayuki Yamamoto.

PEP 562: Настройка доступа к атрибутам модуляPEP 562: Customization of Access to Module Attributes

Python 3.7 позволяет определять __getattr__() в модулях, и он будет вызываться, когда атрибут модуля не найден обычным способом. Определение __dir__() в модулях теперь также разрешено.

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

См. также

PEP 562 – Модуль __getattr__ и __dir__

PEP написан и реализован Ivan Levkivskyi.

PEP 564: Новые функции времени с наносекундным разрешениемPEP 564: New Time Functions With Nanosecond Resolution

Разрешение тактов в современных системах может превышать ограниченную точность числа с плавающей запятой, возвращаемого функцией time.time() и её вариантами. Чтобы избежать потери точности, PEP 564 добавляет шесть новых «наносекундных» вариантов существующих функций-таймеров в модуль time:

Новые функции возвращают количество наносекунд в виде целого числа.

Измерения показывают, что на Linux и Windows разрешение time.time_ns() примерно в 3 раза лучше, чем разрешение time.time().

См. также

PEP 564 – Добавление новых функций времени с наносекундным разрешением

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

PEP 565: Показывать DeprecationWarning в __main__PEP 565: Show DeprecationWarning in __main__

Обработка DeprecationWarning по умолчанию была изменена таким образом, что эти предупреждения снова показываются по умолчанию, но только если код, вызывающий их, выполняется непосредственно в модуле __main__. В результате разработчики однофайловых скриптов и те, кто использует Python интерактивно, снова начнут видеть предупреждения об устаревании для используемых API, но предупреждения об устаревании, вызванные импортированными модулями приложений, библиотек и фреймворков, по-прежнему будут скрыты по умолчанию.

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

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

  • DeprecationWarning: отображается по умолчанию только в __main__ и при запуске тестов; рекомендуется для предупреждений, которые должны видеть другие разработчики Python, когда обновление версии может привести к изменению поведения или ошибке.

  • PendingDeprecationWarning: отображается по умолчанию только при запуске тестов; предназначено для случаев, когда будущее обновление версии изменит категорию предупреждения на DeprecationWarning или FutureWarning.

Ранее оба DeprecationWarning и PendingDeprecationWarning были видны только при запуске тестов, из-за чего разработчики, которые в основном пишут однофайловые скрипты или используют Python в интерактивном режиме, могли быть застигнуты врасплох критическими изменениями в используемых ими API.

См. также

PEP 565 – Показывать DeprecationWarning в __main__

PEP написан и реализован Nick Coghlan.

PEP 560: Базовая поддержка модуля typing и обобщённых типовPEP 560: Core Support for typing module and Generic Types

Изначально PEP 484 был спроектирован таким образом, чтобы не вносить никаких изменений в ядро интерпретатора CPython. Теперь аннотации типов и модуль typing широко используются сообществом, поэтому это ограничение снято. PEP вводит два специальных метода – __class_getitem__() и __mro_entries__. Эти методы теперь используются большинством классов и специальных конструкций в typing. В результате скорость различных операций с типами возросла до 7 раз, обобщённые типы можно использовать без конфликтов метаклассов, а также исправлено несколько давних ошибок в модуле typing.

См. также

PEP 560 – Базовая поддержка модуля typing и обобщённых типов

PEP написан и реализован Ivan Levkivskyi.

PEP 552: Хэш-файлы .pycPEP 552: Hash-based .pyc Files

Традиционно Python проверял актуальность файлов кеша байт-кода (т.е. файлов .pyc) путём сравнения метаданных исходного файла (время последнего изменения и размер) с метаданными, сохранёнными в заголовке файла кеша при его создании. Хотя этот метод эффективен, у него есть недостатки. Если временные метки файловой системы слишком грубы, Python может пропустить обновления исходников, что приводит к путанице у пользователей. Кроме того, наличие временной метки в файле кеша создаёт проблемы для воспроизводимости сборки и систем сборки, основанных на содержимом.

PEP 552 расширяет формат pyc, позволяя использовать хэш исходного файла для проверки актуальности вместо временной метки. Такие файлы .pyc называются «хэш-файлами». По умолчанию Python продолжает использовать проверку на основе временной метки и не создаёт хэш-файлы .pyc во время выполнения. Хэш-файлы .pyc могут быть созданы с помощью py_compile или compileall.

Хэш-файлы .pyc бывают двух вариантов: проверяемые и непроверяемые. Для проверяемых хэш-файлов .pyc Python во время выполнения сверяет их с соответствующими исходными файлами, а для непроверяемых – нет. Непроверяемые хэш-файлы .pyc являются полезной оптимизацией производительности для сред, где внешняя по отношению к Python система (например, система сборки) отвечает за поддержание файлов .pyc в актуальном состоянии.

См. раздел Инвалидация кешированного байт-кода для получения дополнительной информации.

См. также

PEP 552 – Детерминированные pyc

PEP написан и реализован Benjamin Peterson.

PEP 545: Переводы документации PythonPEP 545: Python Documentation Translations

PEP 545 описывает процесс создания и поддержки переводов документации Python.

Добавлено три новых перевода:

См. также

PEP 545 – Переводы документации Python

PEP написан и реализован Julien Palard, Inada Naoki и Victor Stinner.

Режим разработки: -X devDevelopment Runtime Mode: -X dev

Новый параметр командной строки -X dev или новая переменная окружения PYTHONDEVMODE могут быть использованы для включения режима разработки CPython. В режиме разработки CPython выполняет дополнительные проверки времени выполнения, которые слишком дороги для включения по умолчанию. Смотрите документацию -X dev для полного описания эффектов этого режима.

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

  • Выражение await и включения, содержащие предложение async for, были недопустимы в форматированных строковых литералах из-за проблемы в реализации. В Python 3.7 это ограничение было снято.

  • Теперь функции можно передавать более 255 аргументов, и функция может иметь более 255 параметров. (Вклад Serhiy Storchaka в bpo-12844 и bpo-18896.)

  • bytes.fromhex() и bytearray.fromhex() теперь игнорируют все пробельные символы ASCII, а не только пробелы. (Вклад Robert Xiao в bpo-28927.)

  • str, bytes и bytearray получили поддержку нового метода isascii(), который можно использовать для проверки, содержит ли строка или байтовая строка только символы ASCII. (Вклад INADA Naoki в bpo-32677.)

  • ImportError теперь выводит имя модуля и путь __file__, когда from ... import ... завершается неудачно. (Предложено Matthias Bussonnier в bpo-29546.)

  • Теперь поддерживаются циклические импорты, использующие абсолютные импорты с привязкой подмодуля к имени. (Предложено Serhiy Storchaka в bpo-30024.)

  • object.__format__(x, '') теперь эквивалентно str(x), а не format(str(self), ''). (Предложено Serhiy Storchaka в bpo-28974.)

  • In order to better support dynamic creation of stack traces, types.TracebackType can now be instantiated from Python code, and the tb_next attribute on tracebacks is now writable. (Contributed by Nathaniel J. Smith in bpo-30579.)

  • При использовании ключа -m, sys.path[0] теперь разворачивается в полный путь начального каталога, а не остаётся пустым каталогом (это позволяет импортировать из текущего рабочего каталога на момент импорта). (Предложено Nick Coghlan в bpo-33053.)

  • Новый параметр -X importtime или переменная окружения PYTHONPROFILEIMPORTTIME могут быть использованы для отображения времени импорта каждого модуля. (Автор: Victor Stinner в bpo-31415.)

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

contextvars

Новый модуль contextvars и набор новых C API вводят поддержку контекстных переменных. Контекстные переменные концептуально похожи на потоковые локальные переменные. В отличие от TLS, контекстные переменные корректно поддерживают асинхронный код.

Модули asyncio и decimal были обновлены для использования и поддержки контекстных переменных «из коробки». В частности, активный десятичный контекст теперь хранится в контекстной переменной, что позволяет операциям с десятичными числами работать с правильным контекстом в асинхронном коде.

См. также

PEP 567 – Контекстные переменные

PEP написан и реализован Yury Selivanov

dataclasses

Новый декоратор dataclass() предоставляет способ объявления классов данных. Класс данных описывает свои атрибуты с помощью аннотаций переменных класса. Его конструктор и другие магические методы, такие как __repr__(), __eq__() и __hash__(), генерируются автоматически.

Пример:

@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # выдаёт "Point(x=1.5, y=2.5, z=0.0)"

См. также

PEP 557 – Классы данных

PEP написан и реализован Eric V. Smith

importlib.resources

Новый модуль importlib.resources предоставляет несколько новых API и один новый ABC для доступа, открытия и чтения ресурсов внутри пакетов. Ресурсы примерно аналогичны файлам внутри пакетов, но не обязательно должны быть реальными файлами в физической файловой системе. Загрузчики модулей могут предоставлять функцию get_resource_reader(), которая возвращает экземпляр importlib.abc.ResourceReader для поддержки этого нового API. Встроенные загрузчики путей к файлам и загрузчики zip-файлов поддерживают это.

Предложено Barry Warsaw и Brett Cannon в bpo-32248.

См. также

importlib_resources – бэкпорт с PyPI для более ранних версий Python.

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

argparse

Новый метод ArgumentParser.parse_intermixed_args() позволяет перемешивать опции и позиционные аргументы. (Предложено paul.j3 в bpo-14191.)

asyncio

Модуль asyncio получил множество новых возможностей, улучшений удобства использования и производительности. Среди заметных изменений:

  • Новая пробная функция asyncio.run() может использоваться для запуска корутины из синхронного кода путём автоматического создания и уничтожения цикла событий. (Предложено Yury Selivanov в bpo-32314.)

  • asyncio получил поддержку contextvars. loop.call_soon(), loop.call_soon_threadsafe(), loop.call_later(), loop.call_at() и Future.add_done_callback() теперь имеют новый необязательный параметр context, передаваемый только по ключу. Tasks теперь отслеживают свой контекст автоматически. Подробнее см. PEP 567. (Предложено Yury Selivanov в bpo-32436.)

  • Добавлена новая функция asyncio.create_task() как сокращение для asyncio.get_event_loop().create_task(). (Предложено Andrew Svetlov в bpo-32311.)

  • Новый метод loop.start_tls() может использоваться для обновления существующего соединения до TLS. (Предложено Yury Selivanov в bpo-23749.)

  • Новый метод loop.sock_recv_into() позволяет читать данные из сокета напрямую в предоставленный буфер, что позволяет уменьшить количество копирований данных. (Предложено Antoine Pitrou в bpo-31819.)

  • Новая функция asyncio.current_task() возвращает текущий выполняющийся экземпляр Task, а новая функция asyncio.all_tasks() возвращает набор всех существующих экземпляров Task в заданном цикле. Методы Task.current_task() и Task.all_tasks() объявлены устаревшими. (Предложено Andrew Svetlov в bpo-32250.)

  • Новый пробный класс BufferedProtocol позволяет реализовывать потоковые протоколы с ручным управлением буфером приёма. (Предложено Yury Selivanov в bpo-32251.)

  • Новая функция asyncio.get_running_loop() возвращает текущий выполняющийся цикл и возбуждает исключение RuntimeError, если цикл не выполняется. Это отличается от asyncio.get_event_loop(), который создаёт новый цикл событий, если таковой не выполняется. (Предложено Yury Selivanov в bpo-32269.)

  • Новый корутинный метод StreamWriter.wait_closed() позволяет ожидать закрытия потокового писателя. Новый метод StreamWriter.is_closing() можно использовать для определения, закрывается ли писатель. (Предложено Andrew Svetlov в bpo-32391.)

  • Новый loop.sock_sendfile() метод-корутина позволяет отправлять файлы с помощью os.sendfile, когда это возможно. (Автор: Andrew Svetlov в bpo-32410.)

  • Новые методы Future.get_loop() и Task.get_loop() возвращают экземпляр цикла событий, в котором были созданы задача или future. Server.get_loop() позволяет сделать то же самое для объектов asyncio.Server. (Авторы: Yury Selivanov в bpo-32415 и Srinivas Reddy Thatiparthy в bpo-32418.)

  • Теперь можно управлять тем, как экземпляры asyncio.Server начинают обслуживание. Ранее сервер начинал обслуживание сразу при создании. Новый именованный аргумент start_serving для loop.create_server() и loop.create_unix_server(), а также для Server.start_serving() и Server.serve_forever() позволяет разделить создание сервера и его запуск. Новый метод Server.is_serving() возвращает True, если сервер обслуживает запросы. Объекты Server теперь являются асинхронными контекстными менеджерами:

    srv = await loop.create_server(...)
    
    async with srv:
        # некоторый код
    
    # На данный момент srv закрыт и больше не принимает новые соединения.
    

    (Автор: Yury Selivanov в bpo-32662.)

  • Объекты колбэков, возвращаемые loop.call_later(), получили новый метод when(), который возвращает абсолютную временную метку запланированного колбэка. (Автор: Andrew Svetlov в bpo-32741.)

  • Метод loop.create_datagram_endpoint() получил поддержку Unix-сокетов. (Автор: Quentin Dawans в bpo-31245.)

  • Функции asyncio.open_connection(), asyncio.start_server(), методы loop.create_connection(), loop.create_server(), loop.create_accepted_socket() и соответствующие им варианты для UNIX-сокетов теперь принимают именованный аргумент ssl_handshake_timeout. (Автор: Neil Aspinall в bpo-29970.)

  • Новый метод Handle.cancelled() возвращает True, если колбэк был отменён. (Автор: Marat Sharafutdinov в bpo-31943.)

  • Исходный код asyncio был преобразован для использования синтаксиса async/await. (Автор: Andrew Svetlov в bpo-32193.)

  • Новый метод ReadTransport.is_reading() можно использовать для определения состояния чтения транспорта. Кроме того, вызовы ReadTransport.resume_reading() и ReadTransport.pause_reading() теперь являются идемпотентными. (Автор: Yury Selivanov в bpo-32356.)

  • Методы цикла событий, принимающие пути к сокетам, теперь поддерживают передачу объектов, подобных пути. (Автор: Yury Selivanov в bpo-32066.)

  • В asyncio TCP-сокеты в Linux теперь создаются с TCP_NODELAY флагом, установленным по умолчанию. (Авторы: Yury Selivanov и Victor Stinner в bpo-27456.)

  • Исключения, возникающие в отменённых задачах, больше не логируются. (Автор: Yury Selivanov в bpo-30508.)

  • Новые классы WindowsSelectorEventLoopPolicy и WindowsProactorEventLoopPolicy. (Автор: Yury Selivanov в bpo-33792.)

Некоторые API asyncio были объявлены устаревшими.

binascii

Функция b2a_uu() теперь принимает необязательный именованный аргумент backtick. Если он равен true, нули представляются символом '`' вместо пробелов. (Автор: Xiang Zhang в bpo-30103.)

calendar

Класс HTMLCalendar получил новые атрибуты класса, которые упрощают настройку CSS-классов в создаваемом HTML-календаре. (Автор: Oz Tiram в bpo-30095.)

collections

collections.namedtuple() теперь поддерживает значения по умолчанию. (Автор: Raymond Hettinger в bpo-32320.)

compileall

compileall.compile_dir() получил новый параметр invalidation_mode, который можно использовать для включения хеш-инвалидации .pyc. Режим инвалидации также можно указать в командной строке с помощью нового аргумента --invalidation-mode. (Автор: Benjamin Peterson в bpo-31650.)

concurrent.futures

ProcessPoolExecutor и ThreadPoolExecutor теперь поддерживают новые аргументы конструктора initializer и initargs. (Автор: Antoine Pitrou в bpo-21423.)

ProcessPoolExecutor теперь может принимать контекст multiprocessing через новый аргумент mp_context. (Автор: Thomas Moreau в bpo-31540.)

contextlib

Новый nullcontext() – это более простой и быстрый контекстный менеджер без действий, чем ExitStack. (Автор: Jesse-Bakker в bpo-10049.)

Новые asynccontextmanager(), AbstractAsyncContextManager и AsyncExitStack были добавлены в дополнение к их синхронным аналогам. (Авторы: Jelle Zijlstra в bpo-29679 и bpo-30241, а также Alexander Mohr и Ilya Kulakov в bpo-29302.)

cProfile

Командная строка cProfile теперь принимает -m module_name в качестве альтернативы пути к скрипту. (Автор: Sanyam Khurana в bpo-21862.)

crypt

Модуль crypt теперь поддерживает хеширование методом Blowfish. (Вклад Сергея Сторчака в bpo-31664.)

Функция mksalt() теперь позволяет указывать количество раундов хэширования. (Вклад Сергея Сторчака в bpo-31702.)

datetime

Новый метод datetime.fromisoformat() создает объект datetime из строки в одном из форматов, выдаваемых datetime.isoformat(). (Вклад Пола Ганссла в bpo-15873.)

Класс tzinfo теперь поддерживает смещения меньше минуты. (Вклад Александра Белопольского в bpo-5288.)

dbm

dbm.dumb теперь поддерживает чтение файлов только для чтения и больше не записывает индексный файл, если он не был изменен.

decimal

Модуль decimal теперь использует контекстные переменные для хранения десятичного контекста. (Вклад Юрия Селиванова в bpo-32630.)

dis

Функция dis() теперь умеет дизассемблировать вложенные объекты кода (код включений, генераторных выражений и вложенных функций, а также код, используемый для построения вложенных классов). Максимальная глубина рекурсии дизассемблирования управляется новым параметром depth. (Вклад Сергея Сторчака в bpo-11822.)

distutils

README.rst теперь включён в список стандартных файлов README пакета distutils и поэтому входит в состав исходных дистрибутивов. (Вклад Райана Гонсалеса в bpo-11913.)

enum

Класс Enum обзавелся новым свойством класса _ignore_, позволяющим перечислять имена свойств, которые не должны становиться членами перечисления. (Вклад Итана Фурмана в bpo-31801.)

В Python 3.8 попытка проверить не-Enum объекты в классах Enum приведет к возбуждению TypeError (например, 1 in Color); аналогично, попытка проверить не-Flag объекты у члена Flag приведет к возбуждению TypeError (например, 1 in Perm.RW); в настоящее время обе операции возвращают False и являются устаревшими. (Вклад Итана Фурмана в bpo-33217.)

functools

functools.singledispatch() теперь поддерживает регистрацию реализаций с использованием аннотаций типов. (Вклад Лукаша Ланги в bpo-32227.)

gc

Новая функция gc.freeze() позволяет заморозить все объекты, отслеживаемые сборщиком мусора, и исключить их из будущих сборок. Это может быть использовано перед вызовом POSIX fork(), чтобы сделать GC дружественным к копированию при записи или ускорить сборку. Новая функция gc.unfreeze() отменяет эту операцию. Кроме того, gc.get_freeze_count() может использоваться для получения количества замороженных объектов. (Вклад Ли Цзэкуня в bpo-31558.)

hmac

Модуль hmac теперь содержит оптимизированную однократную функцию digest(), которая до трех раз быстрее, чем HMAC(). (Вклад Кристиана Хаймеса в bpo-32433.)

http.client

HTTPConnection и HTTPSConnection теперь поддерживают новый аргумент blocksize для улучшения пропускной способности загрузки. (Вклад Нир Соффера в bpo-31945.)

http.server

SimpleHTTPRequestHandler теперь поддерживает HTTP-заголовок If-Modified-Since. Сервер возвращает статус ответа 304, если целевой файл не был изменен после времени, указанного в заголовке. (Вклад Пьера Кентеля в bpo-29654.)

SimpleHTTPRequestHandler принимает новый аргумент directory в дополнение к новому аргументу командной строки --directory. С этим параметром сервер обслуживает указанный каталог; по умолчанию он использует текущий рабочий каталог. (Вклад Стефана Виртеля и Жюльена Палара в bpo-28707.)

Новый класс ThreadingHTTPServer использует потоки для обработки запросов с помощью ThreadingMixin. Он используется, когда http.server запускается с -m. (Вклад Жюльена Палара в bpo-31639.)

idlelib и IDLEidlelib and IDLE

Множество исправлений для автодополнения. (Вклад Луи Лу в bpo-15786.)

Module Browser (в меню File, ранее назывался Class Browser), теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Вклад Гильерме Поло, Шерил Сабеллы и Терри Джан Риди в bpo-1612262.)

Диалог Settings (Options, Configure IDLE) был частично переписан для улучшения как внешнего вида, так и функциональности. (Вклад Шерил Сабеллы и Терри Джан Риди в нескольких тикетах.)

Образец шрифта теперь включает подборку нелатинских символов, чтобы пользователи могли лучше оценить эффект выбора конкретного шрифта. (Предложено Terry Jan Reedy в bpo-13802.) Образец можно редактировать, добавляя другие символы. (Предложено Serhiy Storchaka в bpo-31860.)

Функции IDLE, ранее реализованные как расширения, теперь реализованы как обычные функции. Их настройки перенесены с вкладки «Расширения» на другие вкладки диалоговых окон. (Предложено Charles Wohlganger и Terry Jan Reedy в bpo-27099.)

Обновлена опция контекста кода редактора. Окно отображает все строки контекста до maxlines. Нажатие на строку контекста перемещает редактор к этой строке. Цвета контекста для пользовательских тем добавлены на вкладку «Подсветка» диалогового окна настроек. (Предложено Cheryl Sabella и Terry Jan Reedy в bpo-33642, bpo-33768 и bpo-33679.)

В Windows новый вызов API сообщает Windows, что tk масштабируется под DPI. На Windows 8.1+ или 10, при неизменённых свойствах совместимости DPI двоичного файла Python и разрешении монитора более 96 DPI, это должно сделать текст и линии более чёткими. В остальных случаях это не должно оказывать эффекта. (Предложено Terry Jan Reedy в bpo-33656.)

Новое в 3.7.1:

Вывод длиннее N строк (по умолчанию 50) сворачивается в кнопку. N можно изменить в разделе PyShell на вкладке General диалогового окна Settings. Меньшее количество строк, но возможно очень длинных, можно свернуть, щелкнув правой кнопкой по выводу. Свёрнутый вывод можно развернуть на месте двойным щелчком по кнопке, либо в буфер обмена или отдельное окно щелчком правой кнопки по кнопке. (Предложено Tal Einat в bpo-1529353.)

Описанные выше изменения были перенесены в версии поддержки 3.6.

НОВОЕ в 3.7.4:

Добавлен пункт «Run Customized» в меню Run для запуска модуля с пользовательскими настройками. Введённые аргументы командной строки добавляются в sys.argv. Они снова отображаются в поле при следующем запуске с настройками. Также можно отключить обычный перезапуск главного модуля Shell. (Предложено Cheryl Sabella, Terry Jan Reedy и другими в bpo-5680 и bpo-37627.)

Новое в 3.7.5:

Добавлена опциональная нумерация строк для окон редактора IDLE. Окна открываются без номеров строк, если не задано иное на вкладке «Общие» диалога конфигурации. Номера строк для существующего окна показываются и скрываются в меню Options. (Предложено Tal Einat и Saimadhav Heblikar в bpo-17535.)

importlib

ABC importlib.abc.ResourceReader был введён для поддержки загрузки ресурсов из пакетов. См. также importlib.resources. (Предложено Barry Warsaw, Brett Cannon в bpo-32248.)

importlib.reload() теперь вызывает ModuleNotFoundError, если у модуля отсутствует spec. (Предложено Garvit Khatri в bpo-29851.)

importlib.find_spec() теперь вызывает ModuleNotFoundError вместо AttributeError, если указанный родительский модуль не является пакетом (т.е. у него отсутствует атрибут __path__). (Предложено Milan Oberkirch в bpo-30436.)

Новый importlib.source_hash() можно использовать для вычисления хеша переданного исходного кода. Файл .pyc, основанный на хеше, содержит значение, возвращаемое этой функцией.

io

Новый метод TextIOWrapper.reconfigure() можно использовать для перенастройки текстового потока с новыми настройками. (Предложено Antoine Pitrou в bpo-30526 и INADA Naoki в bpo-15216.)

ipaddress

Новые методы subnet_of() и supernet_of() классов ipaddress.IPv6Network и ipaddress.IPv4Network можно использовать для проверок принадлежности сети. (Предложено Michel Albert и Cheryl Sabella в bpo-20825.)

itertools

itertools.islice() теперь принимает integer-like objects в качестве аргументов start, stop и slice. (Предложено Will Roberts в bpo-30537.)

locale

Новый аргумент monetary для locale.format_string() можно использовать, чтобы преобразование использовало денежные разделители тысяч и строки группировки. (Предложено Garvit в bpo-10379.)

Функция locale.getpreferredencoding() теперь всегда возвращает 'UTF-8' на Android или при включённом принудительном режиме UTF-8.

logging

Logger instances can now be serialized. (Contributed by Vinay Sajip in bpo-30520.)

Новый метод StreamHandler.setStream() можно использовать для замены потока логгера после создания обработчика. (Предложено Vinay Sajip в bpo-30522.)

Теперь можно указывать именованные аргументы для конструкторов обработчиков в конфигурации, передаваемой в logging.config.fileConfig(). (Предложено Preston Landers в bpo-31080.)

math

Новая функция math.remainder() реализует операцию остатка по стандарту IEEE 754. (Предложено Mark Dickinson в bpo-29962.)

mimetypes

MIME-тип .bmp изменён с 'image/x-ms-bmp' на 'image/bmp'. (Автор: Nitish Chandra, bpo-22589.)

msilib

Новый метод Database.Close() можно использовать для закрытия базы данных MSI. (Автор: Berker Peksag, bpo-20486.)

multiprocessing

Новый метод Process.close() явно закрывает объект процесса и освобождает все связанные с ним ресурсы. Если базовый процесс ещё выполняется, возбуждается исключение ValueError. (Автор: Antoine Pitrou, bpo-30596.)

Новый метод Process.kill() можно использовать для завершения процесса с помощью сигнала SIGKILL в Unix. (Автор: Vitor Pereira, bpo-30794.)

Нефоновые потоки, созданные Process, теперь соединяются при завершении процесса. (Автор: Antoine Pitrou, bpo-18966.)

os

os.fwalk() теперь принимает аргумент path как bytes. (Автор: Serhiy Storchaka, bpo-28682.)

os.scandir() получил поддержку файловых дескрипторов. (Автор: Serhiy Storchaka, bpo-25996.)

Новая функция register_at_fork() позволяет регистрировать колбэки Python для выполнения при ответвлении процесса (fork). (Автор: Antoine Pitrou, bpo-16500.)

Добавлены функции os.preadv() (объединяет функциональность os.readv() и os.pread()) и os.pwritev() (объединяет функциональность os.writev() и os.pwrite()). (Автор: Pablo Galindo, bpo-31368.)

Аргумент mode функции os.makedirs() больше не влияет на биты прав доступа к файлу для вновь создаваемых каталогов промежуточного уровня. (Добавлено Serhiy Storchaka в bpo-19930.)

os.dup2() теперь возвращает новый файловый дескриптор. Ранее всегда возвращалось None. (Автор: Benjamin Peterson, bpo-32441.)

Структура, возвращаемая os.stat(), теперь содержит атрибут st_fstype в Solaris и его производных. (Автор: Jesús Cea Avión, bpo-32659.)

pathlib

Новый метод Path.is_mount() теперь доступен в системах POSIX и может использоваться для определения, является ли путь точкой монтирования. (Автор: Cooper Ry Lees, bpo-30897.)

pdb

pdb.set_trace() теперь принимает необязательный именованный аргумент header. Если он передан, значение выводится на консоль прямо перед началом отладки. (Автор: Barry Warsaw, bpo-31389.)

Командная строка pdb теперь принимает -m module_name в качестве альтернативы файлу скрипта. (Автор: Mario Corchero, bpo-32206.)

py_compile

py_compile.compile() – и, как следствие, compileall – теперь учитывает переменную окружения SOURCE_DATE_EPOCH, безусловно создавая файлы .pyc для хеш-валидации. Это позволяет гарантировать воспроизводимые сборки файлов .pyc при их нетерпеливом создании. (Автор: Bernhard M. Wiedemann, bpo-29708.)

pydoc

Сервер pydoc теперь может привязываться к произвольному имени хоста, задаваемому новым аргументом командной строки -n. (Автор: Feanil Patel, bpo-31128.)

очередьqueue

Новый класс SimpleQueue представляет собой неограниченную очередь FIFO. (Автор: Antoine Pitrou, bpo-14976.)

re

Флаги re.ASCII, re.LOCALE и re.UNICODE можно задать в пределах группы. (Автор: Serhiy Storchaka, bpo-31690.)

re.split() теперь поддерживает разбиение по шаблону типа r'\b', '^$' или (?=-), который соответствует пустой строке. (Автор: Serhiy Storchaka, bpo-25054.)

Регулярные выражения, скомпилированные с флагом re.LOCALE, больше не зависят от локали на этапе компиляции. Настройки локали применяются только при использовании скомпилированного регулярного выражения. (Автор: Serhiy Storchaka, bpo-30215.)

FutureWarning теперь выдаётся, если регулярное выражение содержит конструкции набора символов, которые в будущем изменят семантику, например, вложенные наборы и операции над наборами. (Автор: Serhiy Storchaka, bpo-30349.)

Скомпилированные регулярные выражения и объекты совпадений теперь можно копировать с помощью copy.copy() и copy.deepcopy(). (Автор: Serhiy Storchaka, bpo-10076.)

signal

Новый аргумент warn_on_full_buffer функции signal.set_wakeup_fd() позволяет указать, следует ли Python выводить предупреждение в stderr при переполнении буфера пробуждения. (Автор: Nathaniel J. Smith, bpo-30050.)

socket

Новый метод socket.getblocking() возвращает True, если сокет находится в блокирующем режиме, и False в противном случае. (Автор: Yury Selivanov, bpo-32373.)

Новая функция socket.close() закрывает переданный файловый дескриптор сокета. Эту функцию следует использовать вместо os.close() для лучшей совместимости между платформами. (Автор: Christian Heimes, bpo-32454.)

Модуль socket теперь предоставляет константы socket.TCP_CONGESTION (Linux 2.6.13), socket.TCP_USER_TIMEOUT (Linux 2.6.37) и socket.TCP_NOTSENT_LOWAT (Linux 3.12). (Вклад Omar Sandoval в bpo-26273 и Nathaniel J. Smith в bpo-29728.)

Добавлена поддержка сокетов socket.AF_VSOCK для обеспечения связи между виртуальными машинами и их хост-системами. (Автор: Cathy Avery, bpo-27584.)

Теперь сокеты по умолчанию автоматически определяют семейство, тип и протокол по файловому дескриптору. (Автор: Christian Heimes, bpo-28134.)

socketserver

socketserver.ThreadingMixIn.server_close() теперь ожидает завершения всех потоков, не являющихся демонами. socketserver.ForkingMixIn.server_close() теперь ожидает завершения всех дочерних процессов.

Добавлен новый атрибут класса socketserver.ForkingMixIn.block_on_close для классов socketserver.ForkingMixIn и socketserver.ThreadingMixIn. Установите этот атрибут класса в False, чтобы получить поведение, как до версии 3.7.

sqlite3

sqlite3.Connection теперь предоставляет метод backup(), если используемая библиотека SQLite имеет версию 3.6.11 или выше. (Автор: Lele Gaifax, bpo-27645.)

Аргумент database функции sqlite3.connect() теперь принимает любой объект, подобный пути (path-like object), а не только строку. (Автор: Anders Lorentsen, bpo-31843.)

ssl

Модуль ssl теперь использует встроенный API OpenSSL вместо match_hostname() для проверки имени хоста или IP-адреса. Значения проверяются во время рукопожатия TLS. Любая ошибка проверки сертификата, включая неудачную проверку имени хоста, теперь вызывает SSLCertVerificationError и прерывает рукопожатие с соответствующим сообщением TLS Alert. Новое исключение содержит дополнительную информацию. Проверку имени хоста можно настроить с помощью SSLContext.hostname_checks_common_name. (Автор: Christian Heimes, bpo-31399.)

Примечание

Улучшенная проверка имени хоста требует реализации libssl, совместимой с OpenSSL 1.0.2 или 1.1. Следовательно, OpenSSL 0.9.8 и 1.0.1 больше не поддерживаются (см. Platform Support Removals для подробностей). Модуль ssl в основном совместим с LibreSSL 2.7.2 и новее.

Модуль ssl больше не отправляет IP-адреса в расширении SNI TLS. (Автор: Christian Heimes, bpo-32185.)

match_hostname() больше не поддерживает частичные подстановочные знаки (wildcards) типа www*.example.org. (Авторы: Mandeep Singh, bpo-23033 и Christian Heimes, bpo-31399.)

Выбор набора шифров по умолчанию в модуле ssl теперь использует подход на основе чёрного списка вместо жёстко заданного белого списка. Python больше не включает повторно шифры, заблокированные обновлениями безопасности OpenSSL. Выбор набора шифров по умолчанию можно настроить во время компиляции. (Автор: Christian Heimes, bpo-31429.)

Теперь поддерживается проверка сертификатов сервера, содержащих интернационализированные доменные имена (IDN). В рамках этого изменения атрибут SSLSocket.server_hostname теперь хранит ожидаемое имя хоста в A-label форме ("xn--pythn-mua.org"), а не в U-label форме ("pythön.org"). (Авторы: Nathaniel J. Smith и Christian Heimes, bpo-28414.)

Модуль ssl получил предварительную и экспериментальную поддержку TLS 1.3 и OpenSSL 1.1.1. На момент выпуска Python 3.7.0 OpenSSL 1.1.1 всё ещё разрабатывался, а TLS 1.3 ещё не был окончательно стандартизирован. Рукопожатие и протокол TLS 1.3 ведут себя несколько иначе, чем TLS 1.2 и более ранние версии; см. TLS 1.3. (Автор: Christian Heimes, bpo-32947, bpo-20995, bpo-29136, bpo-30622 и bpo-33618)

SSLSocket и SSLObject больше не имеют открытого конструктора. Прямое создание экземпляров никогда не было документированной и поддерживаемой возможностью. Экземпляры должны создаваться методами SSLContext: wrap_socket() и wrap_bio(). (Автор: Christian Heimes, bpo-32951)

API OpenSSL 1.1 для установки минимальной и максимальной версии протокола TLS доступны как SSLContext.minimum_version и SSLContext.maximum_version. Поддерживаемые протоколы обозначены несколькими новыми флагами, такими как HAS_TLSv1_1. (Автор: Christian Heimes, bpo-32609.)

Добавлены SSLContext.post_handshake_auth для включения и ssl.SSLSocket.verify_client_post_handshake() для запуска аутентификации после рукопожатия TLS 1.3. (Предложено Christian Heimes в bpo-34670.)

string

string.Template теперь позволяет при необходимости изменять шаблон регулярного выражения для заполнителей в фигурных скобках и без них по отдельности. (Автор: Barry Warsaw, bpo-1198569.)

подпроцессsubprocess

Функция subprocess.run() принимает новый именованный аргумент capture_output. Если он равен true, stdout и stderr будут захвачены. Это эквивалентно передаче subprocess.PIPE в качестве аргументов stdout и stderr. (Автор: Bo Bayles, bpo-32102.)

Функция subprocess.run и конструктор subprocess.Popen теперь принимают именованный аргумент text как псевдоним для universal_newlines. (Автор: Andrew Clegg, bpo-31756.)

В Windows значение по умолчанию для close_fds было изменено с False на True при перенаправлении стандартных дескрипторов. Теперь можно установить close_fds в true при перенаправлении стандартных дескрипторов. См. subprocess.Popen. Это означает, что close_fds теперь по умолчанию равен True на всех поддерживаемых платформах. (Автор: Segev Finer, bpo-19764.)

Модуль подпроцессов теперь более корректно обрабатывает KeyboardInterrupt во время subprocess.call(), subprocess.run() или в контекстном менеджере Popen. Он теперь ожидает короткое время завершения дочернего процесса, прежде чем продолжить обработку исключения KeyboardInterrupt. (Автор: Gregory P. Smith, bpo-25942.)

sys

Новая функция-перехватчик sys.breakpointhook() вызывается встроенной функцией breakpoint(). (Автор: Barry Warsaw в bpo-31353.)

На Android новая функция sys.getandroidapilevel() возвращает версию Android API, заданную при сборке. (Автор: Victor Stinner в bpo-28740.)

Новая функция sys.get_coroutine_origin_tracking_depth() возвращает текущую глубину отслеживания источника корутины, заданную новой функцией sys.set_coroutine_origin_tracking_depth(). asyncio был преобразован для использования этого нового API вместо устаревшего sys.set_coroutine_wrapper(). (Автор: Nathaniel J. Smith в bpo-32591.)

time

PEP 564 добавляет шесть новых функций с разрешением в наносекунды в модуль time:

Добавлены новые идентификаторы часов:

  • time.CLOCK_BOOTTIME (Linux): Аналогичен time.CLOCK_MONOTONIC, но также включает любое время, в которое система находилась в приостановленном состоянии.

  • time.CLOCK_PROF (FreeBSD, NetBSD и OpenBSD): Высокоточный таймер ЦП для каждого процесса.

  • time.CLOCK_UPTIME (FreeBSD, OpenBSD): Время, абсолютное значение которого равно времени работы системы без учёта приостановок, что обеспечивает точное измерение времени непрерывной работы.

Новые функции time.thread_time() и time.thread_time_ns() можно использовать для получения времени ЦП для каждого потока. (Автор: Antoine Pitrou в bpo-32025.)

Новая функция time.pthread_getcpuclockid() возвращает идентификатор часов времени ЦП для конкретного потока.

tkinter

Новый класс tkinter.ttk.Spinbox теперь доступен. (Автор: Alan Moore в bpo-32585.)

tracemalloc

tracemalloc.Traceback теперь больше похож на обычные трассировки: сортирует фреймы от старых к новым. Traceback.format() теперь принимает отрицательное значение limit, обрезая результат до abs(limit) самых старых фреймов. Для получения прежнего поведения используйте новый аргумент most_recent_first функции Traceback.format(). (Автор: Jesse Bakker в bpo-32121.)

types

Новые классы WrapperDescriptorType, MethodWrapperType, MethodDescriptorType и ClassMethodDescriptorType теперь доступны. (Авторы: Manuel Krebber и Guido van Rossum в bpo-29377, а также Serhiy Storchaka в bpo-32265.)

Новая функция types.resolve_bases() разрешает записи MRO динамически, как указано в PEP 560. (Автор: Ivan Levkivskyi в bpo-32717.)

unicodedata

Внутренняя база данных unicodedata обновлена до использования Unicode 11. (Автор: Benjamin Peterson.)

unittest

Новый параметр командной строки -k позволяет фильтровать тесты по подстроке имени или шаблону, похожему на оболочку Unix. Например, python -m unittest -k foo запускает foo_tests.SomeTest.test_something, bar_tests.SomeTest.test_foo, но не bar_tests.FooTest.test_something. (Автор: Jonas Haag в bpo-32071.)

unittest.mock

Атрибуты sentinel теперь сохраняют свою идентичность при copied или pickled. (Автор: Serhiy Storchaka в bpo-20804.)

Новая функция seal() позволяет запечатывать экземпляры Mock, что запретит дальнейшее создание атрибутов-заглушек. Запечатывание применяется рекурсивно ко всем атрибутам, которые сами являются заглушками. (Автор: Mario Corchero в bpo-30541.)

urllib.parse

urllib.parse.quote() обновлён с RFC 2396 до RFC 3986, добавляя ~ в набор символов, которые по умолчанию никогда не заключаются в кавычки. (Авторы: Christian Theune и Ratnadeep Debnath в bpo-16285.)

uu

Функция uu.encode() теперь принимает необязательный именованный аргумент backtick. Если он равен true, нули представляются символом '`' вместо пробелов. (Автор: Xiang Zhang в bpo-30103.)

uuid

Новый атрибут UUID.is_safe передаёт от платформы информацию о том, генерируются ли UUID-идентификаторы методом, безопасным для многопроцессорности. (Автор: Barry Warsaw в bpo-22807.)

uuid.getnode() теперь отдаёт предпочтение глобально управляемым MAC-адресам перед локально управляемыми. Это обеспечивает лучшую гарантию глобальной уникальности UUID, возвращаемых из uuid.uuid1(). Если доступны только локально управляемые MAC-адреса, возвращается первый такой найденный адрес. (Автор: Barry Warsaw, bpo-32107)

warnings

Инициализация фильтров предупреждений по умолчанию изменилась следующим образом:

  • Предупреждения, включённые через параметры командной строки (включая параметры для -b и новый специфичный для CPython параметр -X dev), всегда передаются механизму предупреждений через атрибут sys.warnoptions.

  • Фильтры предупреждений, заданные через командную строку или окружение, теперь имеют следующий порядок приоритета:

    • фильтр BytesWarning для -b (или -bb)

    • любые фильтры, указанные с параметром -W

    • любые фильтры, указанные через переменную окружения PYTHONWARNINGS

    • любые другие специфичные для CPython фильтры (например, фильтр default, добавленный для нового режима -X dev)

    • любые неявные фильтры, определённые непосредственно механизмом предупреждений

  • в отладочных сборках CPython все предупреждения теперь показываются по умолчанию (список неявных фильтров пуст)

(Авторы: Nick Coghlan и Victor Stinner в bpo-20361, bpo-32043 и bpo-32230.)

Предупреждения об устаревании снова отображаются по умолчанию в однофайловых скриптах и в интерактивной оболочке. Подробнее см. PEP 565: Show DeprecationWarning in __main__. (Автор: Nick Coghlan в bpo-31975.)

xml

В качестве меры защиты от DTD и извлечения внешних сущностей модули xml.dom.minidom и xml.sax больше не обрабатывают внешние сущности по умолчанию. (Предложено Christian Heimes в bpo-17239.)

xml.etree

Предикаты ElementPath в методах find() теперь могут сравнивать текст текущего узла с [. = "text"], а не только текст в дочерних узлах. Предикаты также допускают добавление пробелов для улучшения читаемости. (Автор: Stefan Behnel в bpo-31648.)

xmlrpc.server

SimpleXMLRPCDispatcher.register_function теперь можно использовать как декоратор. (Автор: Xiang Zhang в bpo-7769.)

zipapp

Функция create_archive() теперь принимает необязательный аргумент filter, позволяющий пользователю выбирать, какие файлы должны быть включены в архив. (Автор: Irmen de Jong в bpo-31072.)

Функция create_archive() теперь принимает необязательный аргумент compressed для создания сжатого архива. Также добавлен параметр командной строки --compress для поддержки сжатия. (Автор: Zhiming Wang в bpo-31638.)

zipfile

ZipFile теперь принимает новый параметр compresslevel для управления уровнем сжатия. (Автор: Bo Bayles в bpo-21417.)

Поддиректории в архивах, создаваемых ZipFile, теперь сохраняются в алфавитном порядке. (Автор: Bernhard M. Wiedemann в bpo-30693.)

Изменения C APIC API Changes

Реализован новый API для локального хранилища потока. Обзор см. в PEP 539: Новый C API для локального хранилища потока, а полную справку – в API для локального хранилища потока (TSS). (Автор: Masayuki Yamamoto, bpo-25658.)

Новая функциональность контекстных переменных предоставляет ряд новых C API.

Новая функция PyImport_GetModule() возвращает ранее импортированный модуль с заданным именем. (Автор: Eric Snow в bpo-28411.)

Новый макрос Py_RETURN_RICHCOMPARE упрощает написание функций расширенного сравнения. (Автор: Petr Victorin в bpo-23699.)

Новый макрос Py_UNREACHABLE можно использовать для пометки недостижимых участков кода. (Автор: Barry Warsaw в bpo-31338.)

tracemalloc теперь предоставляет C API через новые функции PyTraceMalloc_Track() и PyTraceMalloc_Untrack(). (Автор: Victor Stinner в bpo-30054.)

Новые статические маркеры import__find__load__start() и import__find__load__done() можно использовать для трассировки импорта модулей. (Автор: Christian Heimes в bpo-31574.)

Поля name и doc структур PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc, и wrapperbase теперь имеют тип const char * вместо char *. (Автор: Serhiy Storchaka, bpo-28761.)

Результат PyUnicode_AsUTF8AndSize() и PyUnicode_AsUTF8() теперь имеет тип const char * вместо char *. (Автор: Serhiy Storchaka, bpo-28769.)

Результат PyMapping_Keys(), PyMapping_Values() и PyMapping_Items() теперь всегда список, а не список или кортеж. (Автор: Oren Milman, bpo-28280.)

Добавлены функции PySlice_Unpack() и PySlice_AdjustIndices(). (Автор: Serhiy Storchaka, bpo-27867.)

PyOS_AfterFork() устарела в пользу новых функций PyOS_BeforeFork(), PyOS_AfterFork_Parent() и PyOS_AfterFork_Child(). (Автор: Antoine Pitrou, bpo-16500.)

Синглтон PyExc_RecursionErrorInst, входивший в публичный API, удалён, поскольку его элементы никогда не очищались, что могло приводить к segfault при завершении работы интерпретатора. Автор: Xavier de Gaye, bpo-22898 и bpo-30697.

Добавлена поддержка часовых поясов в C API с помощью конструкторов часовых поясов PyTimeZone_FromOffset() и PyTimeZone_FromOffsetAndName(), а также доступ к синглтону UTC через PyDateTime_TimeZone_UTC. Автор: Paul Ganssle, bpo-10381.

Тип результатов PyThread_start_new_thread() и PyThread_get_thread_ident(), а также параметр id из PyThreadState_SetAsyncExc() изменился с long на unsigned long. (Автор изменений: Serhiy Storchaka, bpo-6532.)

PyUnicode_AsWideCharString() теперь вызывает ValueError, если второй аргумент равен NULL, а строка wchar_t* содержит нулевые символы. (Автор изменений: Serhiy Storchaka, bpo-30708.)

Изменения в последовательности запуска и управлении динамическими распределителями памяти означают, что давно документированное требование вызывать Py_Initialize() перед вызовом большинства функций API языка C теперь соблюдается более строго, и его нарушение может привести к ошибке сегментации во встраиваемых приложениях. Подробнее см. раздел Переход на Python 3.7 в этом документе и раздел Перед инициализацией Python в документации API языка C.

Новая функция PyInterpreterState_GetID() возвращает уникальный идентификатор для заданного интерпретатора. (Автор: Eric Snow, bpo-29102.)

Py_DecodeLocale(), Py_EncodeLocale() теперь используют кодировку UTF-8, когда включён режим UTF-8. (Автор: Victor Stinner, bpo-29240.)

PyUnicode_DecodeLocaleAndSize() и PyUnicode_EncodeLocale() теперь используют кодировку текущей локали для обработчика ошибок surrogateescape. (Автор: Victor Stinner, bpo-29240.)

Параметры start и end функции PyUnicode_FindChar() теперь ведут себя как срезы строк. (Автор: Xiang Zhang, bpo-28822.)

Изменения сборкиBuild Changes

Поддержка сборки --without-threads удалена. Модуль threading теперь всегда доступен. (Автор: Antoine Pitrou, bpo-31370.)

Полная копия libffi больше не поставляется для сборки модуля _ctypes на не-OSX UNIX платформах. Теперь для сборки _ctypes на таких платформах требуется установленная копия libffi. (Автор: Zachary Ware, bpo-27979.)

Процесс сборки в Windows больше не зависит от Subversion для получения внешних исходников; вместо этого используется скрипт Python для загрузки zip-файлов с GitHub. Если Python 3.6 не найден в системе (через py -3.6), для этой цели используется NuGet для загрузки копии 32-битной версии Python. (Автор: Zachary Ware, bpo-30450.)

Модуль ssl требует OpenSSL 1.0.2 или совместимый с 1.1 libssl. OpenSSL 1.0.1 достиг конца срока поддержки 31 декабря 2016 года и больше не поддерживается. LibreSSL также временно не поддерживается. Версии LibreSSL до 2.6.4 не содержат необходимых API OpenSSL 1.0.2.

ОптимизацииOptimizations

Накладные расходы на вызов многих методов различных классов стандартной библиотеки, реализованных на C, значительно снижены за счёт переноса большего количества кода на использование соглашения METH_FASTCALL. (Автор: Victor Stinner, bpo-29300, bpo-29507, bpo-29452, и bpo-29286.)

Различные оптимизации сократили время запуска Python на 10% на Linux и до 30% на macOS. (Авторы: Victor Stinner, INADA Naoki, bpo-29585, и Ivan Levkivskyi, bpo-31333.)

Вызовы методов теперь до 20% быстрее благодаря изменениям в байт-коде, которые позволяют не создавать экземпляры связанных методов. (Авторы: Yury Selivanov и INADA Naoki, bpo-26110.)

Модуль asyncio получил ряд значительных оптимизаций для часто используемых функций:

  • Функция asyncio.get_event_loop() была переписана на C, что сделало её до 15 раз быстрее. (Автор: Yury Selivanov, bpo-32296.)

  • Управление колбэками asyncio.Future оптимизировано. (Автор: Yury Selivanov, bpo-32348.)

  • asyncio.gather() теперь до 15% быстрее. (Автор: Yury Selivanov, bpo-32355.)

  • asyncio.sleep() теперь до 2 раз быстрее, когда аргумент delay равен нулю или отрицателен. (Автор: Andrew Svetlov, bpo-32351.)

  • Накладные расходы, связанные с режимом отладки asyncio, снижены. (Автор: Antoine Pitrou, bpo-31970.)

В результате работы над PEP 560, время импорта typing сократилось в 7 раз, и многие операции с типами теперь выполняются быстрее. (Автор: Ivan Levkivskyi, bpo-32226.)

sorted() и list.sort() оптимизированы для типичных случаев и стали быстрее на 40–75%. (Автор: Elliot Gorokhovsky, bpo-28685.)

dict.copy() теперь до 5.5 раз быстрее. (Автор: Yury Selivanov, bpo-31179.)

hasattr() и getattr() теперь примерно в 4 раза быстрее, когда name не найден, а obj не переопределяет object.__getattr__() или object.__getattribute__(). (Автор: INADA Naoki, bpo-32544.)

Поиск некоторых символов Юникода (например, украинской заглавной «Є») в строке был до 25 раз медленнее, чем поиск других символов. Теперь в худшем случае он медленнее всего в 3 раза. (Автор: Serhiy Storchaka, bpo-24821.)

Фабрика collections.namedtuple() была переписана, чтобы создание именованных кортежей стало в 4–6 раз быстрее. (Автор: Jelle Zijlstra с последующими улучшениями от INADA Naoki, Serhiy Storchaka и Raymond Hettinger в bpo-28638.)

date.fromordinal() и date.fromtimestamp() теперь работают до 30% быстрее в типичном случае. (Автор: Paul Ganssle в bpo-32403.)

Функция os.fwalk() теперь работает до 2 раз быстрее благодаря использованию os.scandir(). (Автор: Serhiy Storchaka в bpo-25996.)

Скорость функции shutil.rmtree() улучшена на 20–40% благодаря использованию функции os.scandir(). (Автор: Serhiy Storchaka в bpo-28564.)

Оптимизировано регистронезависимое сопоставление и поиск regular expressions. Поиск некоторых шаблонов теперь может быть до 20 раз быстрее. (Автор: Serhiy Storchaka в bpo-30285.)

re.compile() теперь преобразует параметр flags в объект int, если он RegexFlag. Теперь он так же быстр, как Python 3.5, и примерно на 10% быстрее Python 3.6 в зависимости от шаблона. (Автор: INADA Naoki в bpo-31671.)

Методы modify() классов selectors.EpollSelector, selectors.PollSelector и selectors.DevpollSelector могут быть примерно на 10% быстрее при высокой нагрузке. (Автор: Giampaolo Rodola’ в bpo-30014)

Свёртка констант перенесена из peephole-оптимизатора в новый AST-оптимизатор, который способен выполнять оптимизации более согласованно. (Авторы: Eugene Toder и INADA Naoki в bpo-29469 и bpo-11549.)

Большинство функций и методов в abc переписаны на C. Это делает создание абстрактных базовых классов и вызов isinstance() и issubclass() для них в 1.5 раза быстрее. Это также сокращает время запуска Python до 10%. (Авторы: Ivan Levkivskyi и INADA Naoki в bpo-31333)

Значительное ускорение альтернативных конструкторов для datetime.date и datetime.datetime за счёт использования быстрых конструкторов, когда не создаются подклассы. (Автор: Paul Ganssle в bpo-32403)

Скорость сравнения экземпляров array.array значительно улучшена в определённых случаях. Теперь при сравнении массивов, содержащих значения одного целочисленного типа, скорость повышена в 10–70 раз. (Автор: Adrian Wielgosik в bpo-24700.)

Функции math.erf() и math.erfc() теперь на большинстве платформ используют (более быструю) реализацию из библиотеки C. (Автор: Serhiy Storchaka в bpo-26121.)

Прочие изменения в реализации CPythonOther CPython Implementation Changes

  • Хуки трассировки теперь могут отказываться от получения событий line и подписываться на получение событий opcode от интерпретатора, устанавливая соответствующие новые атрибуты f_trace_lines и f_trace_opcodes на трассируемом фрейме. (Автор: Nick Coghlan в bpo-31344.)

  • Исправлены некоторые проблемы согласованности атрибутов модулей пространства имён. Объекты модулей пространства имён теперь имеют __file__, установленный в None (ранее не установлен), и их __spec__.origin также установлен в None (ранее строка "namespace"). См. bpo-32305. Кроме того, __spec__.loader объекта модуля пространства имён установлен в то же значение, что и __loader__ (ранее первый был установлен в None). См. bpo-32303.

  • Словарь locals() теперь отображается в лексическом порядке, в котором были определены переменные. Ранее порядок был неопределённым. (Автор: Raymond Hettinger в bpo-32690.)

  • Команда distutils upload больше не пытается заменять символы конца строки CR на CRLF. Это исправляет проблему повреждения sdists, которые заканчивались байтом, эквивалентным CR. (Автор: Bo Bayles в bpo-32304.)

Устаревшее поведение PythonDeprecated Python Behavior

Выражения yield (как предложения yield, так и yield from) теперь устарели в включениях и генераторных выражениях (за исключением итерируемого выражения в крайнем левом предложении for). Это гарантирует, что включения всегда немедленно возвращают контейнер соответствующего типа (вместо возможного возврата объекта итератора-генератора), а генераторные выражения не будут пытаться смешивать свой неявный вывод с выводом от любых явных выражений yield. В Python 3.7 такие выражения при компиляции выдают DeprecationWarning, в Python 3.8 это будет SyntaxError. (Автор: Serhiy Storchaka в bpo-10544.)

Возврат подкласса complex из object.__complex__() устарел и в будущих версиях Python станет ошибкой. Это делает __complex__() согласованным с object.__int__() и object.__float__(). (Автор: Serhiy Storchaka в bpo-28894.)

Устаревшие модули, функции и методы PythonDeprecated Python modules, functions and methods

aifc

aifc.openfp() устарел и будет удалён в Python 3.9. Используйте aifc.open() вместо него. (Автор: Brian Curtin, bpo-31985.)

asyncio

Поддержка прямого await-инга экземпляров asyncio.Lock и других примитивов синхронизации asyncio устарела. Для получения и освобождения ресурса синхронизации необходимо использовать асинхронный менеджер контекста. (Автор: Andrew Svetlov в bpo-32253.)

Методы asyncio.Task.current_task() и asyncio.Task.all_tasks() устарели. (Автор: Andrew Svetlov в bpo-32250.)

collections

В Python 3.8 абстрактные базовые классы из collections.abc больше не будут доступны в обычном модуле collections. Это поможет создать более чёткое различие между конкретными классами и абстрактными базовыми классами. (Автор: Serhiy Storchaka в bpo-25988.)

dbm

dbm.dumb теперь поддерживает чтение файлов только для чтения и больше не записывает индексный файл, если он не был изменён. Теперь выводится предупреждение об устаревании, если индексный файл отсутствует и воссоздаётся в режимах 'r' и 'w' (в будущих версиях Python это станет ошибкой). (Автор: Serhiy Storchaka в bpo-28847.)

enum

В Python 3.8 попытка проверить наличие объектов, не являющихся Enum, в классах Enum будет вызывать TypeError (например, 1 in Color); аналогично, попытка проверить наличие объектов, не являющихся Flag, у элемента Flag будет вызывать TypeError (например, 1 in Perm.RW); в настоящее время обе операции вместо этого возвращают False. (Автор: Ethan Furman в bpo-33217.)

gettext

Использование нецелочисленного значения для выбора формы множественного числа в gettext теперь устарело. Оно никогда не работало корректно. (Автор: Serhiy Storchaka в bpo-28692.)

importlib

Методы MetaPathFinder.find_module() (заменены на MetaPathFinder.find_spec()) и PathEntryFinder.find_loader() (заменены на PathEntryFinder.find_spec()) оба, устаревшие в Python 3.4, теперь вызывают DeprecationWarning. (Автор: Matthias Bussonnier в bpo-29576)

Абстрактный базовый класс importlib.abc.ResourceLoader устарел в пользу importlib.abc.ResourceReader.

locale

locale.format() устарел, используйте locale.format_string() вместо него. (Автор: Garvit, bpo-10379.)

macpath

macpath теперь устарел и будет удалён в Python 3.8. (Автор: Chi Hsuan Yen, bpo-9850.)

threading

dummy_threading и _dummy_thread устарели. Больше невозможно собрать Python с отключённой поддержкой потоков. Используйте threading вместо них. (Автор: Antoine Pitrou, bpo-31370.)

socket

Тихая обрезка значения аргумента в socket.htons() и socket.ntohs() устарела. В будущих версиях Python, если переданный аргумент превышает 16 бит, будет возбуждаться исключение. (Автор: Oren Milman, bpo-28332.)

ssl

ssl.wrap_socket() устарел. Используйте ssl.SSLContext.wrap_socket() вместо него. (Автор: Christian Heimes, bpo-28124.)

sunau

sunau.openfp() устарел и будет удалён в Python 3.9. Используйте sunau.open() вместо него. (Автор: Brian Curtin, bpo-31985.)

sys

sys.set_coroutine_wrapper() и sys.get_coroutine_wrapper() устарели.

Незадокументированная функция sys.callstats() устарела и будет удалена в одной из будущих версий Python. (Автор: Victor Stinner, bpo-28799.)

wave

wave.openfp() устарел и будет удалён в Python 3.9. Используйте wave.open() вместо него. (Автор: Brian Curtin, bpo-31985.)

Устаревшие функции и типы C APIDeprecated functions and types of the C API

Функция PySlice_GetIndicesEx() устарела и заменена макросом, если Py_LIMITED_API не установлен или установлен в значение в диапазоне от 0x03050400 до 0x03060000 (не включая), или равен 0x03060100 или больше. (Автор: Serhiy Storchaka, bpo-27867.)

PyOS_AfterFork() устарел. Используйте PyOS_BeforeFork(), PyOS_AfterFork_Parent() или PyOS_AfterFork_Child() вместо него. (Автор: Antoine Pitrou, bpo-16500.)

Удаление поддержки платформPlatform Support Removals

  • FreeBSD 9 и более старые версии больше официально не поддерживаются.

  • Для полной поддержки Юникода, в том числе в модулях расширения, на платформах *nix теперь требуется предоставлять хотя бы одну из C.UTF-8 (полная локаль), C.utf8 (полная локаль) или UTF-8 (локаль только LC_CTYPE) в качестве альтернативы устаревшей локали C на основе ASCII.

  • OpenSSL 0.9.8 и 1.0.1 больше не поддерживаются, что означает, что сборка CPython 3.7 с поддержкой SSL/TLS на старых платформах, всё ещё использующих эти версии, требует пользовательских параметров сборки, которые связывают с более новой версией OpenSSL.

    В частности, эта проблема затрагивает дистрибутивы Linux Debian 8 (также известный как «jessie») и Ubuntu 14.04 (также известный как «Trusty») LTS, поскольку они всё ещё используют OpenSSL 1.0.1 по умолчанию.

    Debian 9 («stretch») и Ubuntu 16.04 («xenial»), а также недавние выпуски других дистрибутивов Linux LTS (например, RHEL/CentOS 7.5, SLES 12-SP3) используют OpenSSL 1.0.2 или новее и остаются поддерживаемыми в конфигурации сборки по умолчанию.

    Собственный файл конфигурации CI CPython содержит пример использования инфраструктуры тестирования совместимости SSL в тестовом наборе CPython для сборки и связывания с OpenSSL 1.1.0 вместо устаревшей системной версии OpenSSL.

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

Следующие возможности и API были удалены из Python 3.7:

  • Функция os.stat_float_times() была удалена. Она была введена в Python 2.3 для обратной совместимости с Python 2.2 и была объявлена устаревшей начиная с Python 3.1.

  • Неизвестные управляющие последовательности, состоящие из '\' и буквы ASCII в шаблонах замены для re.sub(), были объявлены устаревшими в Python 3.5, а теперь вызывают ошибку.

  • Удалена поддержка аргумента exclude в tarfile.TarFile.add(). Он был объявлен устаревшим в Python 2.7 и 3.2. Вместо него используйте аргумент filter.

  • Функция splitunc() в модуле ntpath была объявлена устаревшей в Python 3.1 и теперь удалена. Вместо неё используйте функцию splitdrive().

  • collections.namedtuple() больше не поддерживает параметр verbose и атрибут _source, который показывал сгенерированный исходный код для класса именованного кортежа. Это было частью оптимизации, направленной на ускорение создания класса. (Автор: Jelle Zijlstra с дополнениями от INADA Naoki, Serhiy Storchaka и Raymond Hettinger в bpo-28638.)

  • Функции bool(), float(), list() и tuple() больше не принимают именованные аргументы. Первый аргумент int() теперь может передаваться только как позиционный аргумент.

  • Удалены ранее устаревшие (с Python 2.4) классы Plist, Dict и _InternalDict в модуле plistlib. Значения словарей в результате функций readPlist() и readPlistFromBytes() теперь являются обычными словарями. Больше нельзя использовать доступ по атрибуту для получения элементов этих словарей.

  • Функция asyncio.windows_utils.socketpair() была удалена. Вместо неё используйте функцию socket.socketpair(), она доступна на всех платформах начиная с Python 3.5. asyncio.windows_utils.socketpair была просто псевдонимом для socket.socketpair в Python 3.5 и новее.

  • asyncio больше не экспортирует модули selectors и _overlapped как asyncio.selectors и asyncio._overlapped. Замените from asyncio import selectors на import selectors.

  • Прямое создание экземпляров объектов ssl.SSLSocket и ssl.SSLObject теперь запрещено. Конструкторы никогда не документировались, не тестировались и не проектировались как публичные. Пользователи должны были использовать ssl.wrap_socket() или ssl.SSLContext. (Автор: Christian Heimes в bpo-32951.)

  • Неиспользуемая команда distutils install_misc была удалена. (Автор: Eric N. Vander Weele в bpo-29218.)

Удаление модулейModule Removals

Модуль fpectl был удалён. Он никогда не был включён по умолчанию, никогда не работал корректно на x86-64 и изменял Python ABI таким образом, что это вызывало неожиданные поломки C-расширений. (Автор: Nathaniel J. Smith в bpo-29137.)

Изменения только для WindowsWindows-only Changes

Запускатор Python (py.exe) теперь может принимать спецификаторы 32 и 64 бит без необходимости указывать также минорную версию. Так что py -3-32 и py -3-64 становятся допустимыми, как и py -3.7-32, а также формы -m-64 и -m.n-64 теперь принимаются для принудительного использования 64-битного Python, даже если в противном случае был бы использован 32-битный. Если указанная версия недоступна, py.exe завершится с ошибкой. (Автор: Steve Barnes в bpo-30291.)

Запускатель можно запустить как py -0 для получения списка установленных Python, при этом версия по умолчанию помечается звёздочкой. Запуск py -0p выведет также пути. Если py запускается с указанием версии, которой нет, он также выведет краткий список доступных спецификаторов. (Предложено Steve Barnes в bpo-30362.)

Переход на Python 3.7Porting to Python 3.7

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

Изменения в поведении PythonChanges in Python Behavior

  • Имена async и await теперь являются зарезервированными ключевыми словами. Код, использующий эти имена как идентификаторы, теперь будет вызывать SyntaxError. (Автор: Jelle Zijlstra в bpo-30406.)

  • PEP 479 включён для всего кода в Python 3.7, что означает, что исключения StopIteration, возникающие прямо или косвенно в корутинах и генераторах, преобразуются в исключения RuntimeError. (Автор: Yury Selivanov в bpo-32670.)

  • Методы object.__aiter__() больше нельзя объявлять как асинхронные. (Автор: Yury Selivanov в bpo-31709.)

  • Из-за недосмотра более ранние версии Python ошибочно принимали следующий синтаксис:

    f(1 for x in [1],)
    
    class C(1 for x in [1]):
        pass
    

    Python 3.7 теперь корректно вызывает исключение SyntaxError, так как выражение-генератор всегда должно находиться непосредственно внутри круглых скобок и не может иметь запятую с любой стороны, а дублирование скобок может быть опущено только в вызовах. (Автор: Serhiy Storchaka в bpo-32012 и bpo-32023.)

  • При использовании параметра -m начальный рабочий каталог теперь добавляется в sys.path вместо пустой строки (которая динамически обозначала текущий рабочий каталог на момент каждого импорта). Любые программы, которые проверяют пустую строку или иным образом полагаются на предыдущее поведение, должны быть соответствующим образом обновлены (например, также проверять os.getcwd() или os.path.dirname(__main__.__file__), в зависимости от того, зачем код изначально проверял пустую строку).

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

  • socketserver.ThreadingMixIn.server_close() теперь ожидает завершения всех не-демонических потоков. Установите новый атрибут класса socketserver.ThreadingMixIn.block_on_close в False, чтобы получить поведение до версии 3.7. (Автор: Victor Stinner в bpo-31233 и bpo-33540.)

  • socketserver.ForkingMixIn.server_close() теперь ожидает завершения всех дочерних процессов. Установите новый атрибут класса socketserver.ForkingMixIn.block_on_close в False, чтобы получить поведение до версии 3.7. (Автор: Victor Stinner в bpo-31151 и bpo-33540.)

  • Функция locale.localeconv() теперь временно устанавливает локаль LC_CTYPE в значение LC_NUMERIC в некоторых случаях. (Автор: Victor Stinner в bpo-31900.)

  • pkgutil.walk_packages() теперь вызывает исключение ValueError, если path является строкой. Ранее возвращался пустой список. (Автор: Sanyam Khurana в bpo-24744.)

  • Аргумент строки форматирования для string.Formatter.format() теперь является только позиционным. Передача его как именованного аргумента была объявлена устаревшей в Python 3.5. (Автор: Serhiy Storchaka в bpo-29193.)

  • Атрибуты key, value и coded_value класса http.cookies.Morsel теперь доступны только для чтения. Их присваивание было объявлено устаревшим в Python 3.5. Используйте метод set() для их установки. (Автор: Serhiy Storchaka в bpo-29192.)

  • Аргумент mode функции os.makedirs() больше не влияет на биты прав доступа вновь создаваемых каталогов промежуточного уровня. Чтобы установить их биты прав доступа, можно установить umask перед вызовом makedirs(). (Автор изменения: Serhiy Storchaka в bpo-19930.)

  • Тип struct.Struct.format теперь является str вместо bytes. (Автор: Victor Stinner в bpo-21071.)

  • parse_multipart() теперь принимает аргументы encoding и errors и возвращает те же результаты, что и FieldStorage: для полей, не относящихся к файлам, значение, связанное с ключом, является списком строк, а не байтов. (Автор: Pierre Quentel в bpo-29979.)

  • Из-за внутренних изменений в socket вызов socket.fromshare() на сокете, созданном с помощью socket.share в старых версиях Python, не поддерживается.

  • repr для BaseException теперь не включает завершающую запятую. Большинство исключений затронуты этим изменением. (Автор: Serhiy Storchaka в bpo-30399.)

  • repr для datetime.timedelta изменился: теперь в вывод включаются ключевые аргументы. (Автор: Utkarsh Upadhyay в bpo-30302.)

  • Поскольку shutil.rmtree() теперь реализована с помощью функции os.scandir(), пользовательский обработчик onerror теперь вызывается с первым аргументом os.scandir вместо os.listdir, когда не удаётся прочитать содержимое каталога.

  • Поддержка вложенных наборов и операций над наборами в регулярных выражениях, как в Unicode Technical Standard #18, может быть добавлена в будущем. Это изменит синтаксис. Чтобы облегчить это будущее изменение, пока в неоднозначных случаях будет вызываться FutureWarning. Это включает наборы, начинающиеся с литерала '[' или содержащие литеральные последовательности символов '--', '&&', '~~' и '||'. Чтобы избежать предупреждения, экранируйте их обратной косой чертой. (Автор: Serhiy Storchaka в bpo-30349.)

  • Результат разбиения строки по шаблону regular expression, который может совпадать с пустой строкой, был изменён. Например, разбиение по r'\s*' теперь будет разбивать не только по пробельным символам, как раньше, но и по пустым строкам перед всеми непробельными символами и непосредственно перед концом строки. Прежнее поведение можно восстановить, изменив шаблон на r'\s+'. Предупреждение FutureWarning выдавалось для таких шаблонов, начиная с Python 3.5.

    Для шаблонов, которые совпадают как с пустыми, так и с непустыми строками, результат поиска всех совпадений также может измениться в других случаях. Например, в строке 'a\n\n' шаблон r'(?m)^\s*?$' будет совпадать не только с пустыми строками на позициях 2 и 3, но и со строкой '\n' на позициях 2–3. Чтобы сопоставить только пустые строки, шаблон следует переписать как r'(?m)^[^\S\n]*$'.

    re.sub() теперь заменяет пустые совпадения, смежные с предыдущим непустым совпадением. Например, re.sub('x*', '-', 'abxd') теперь возвращает '-a-b--d-' вместо '-a-b-d-' (первый минус между ‘b’ и ‘d’ заменяет ‘x’, а второй минус заменяет пустую строку между ‘x’ и ‘d’).

    (Автор: Serhiy Storchaka в bpo-25054 и bpo-32308.)

  • Изменение re.escape(): теперь экранируются только специальные символы регулярных выражений вместо экранирования всех символов, кроме букв ASCII, цифр и '_'. (Автор: Serhiy Storchaka в bpo-29995.)

  • Фреймы tracemalloc.Traceback теперь сортируются от самого старого к самому новому для большей согласованности с traceback. (Автор: Jesse Bakker в bpo-32121.)

  • В ОС, поддерживающих битовые флаги socket.SOCK_NONBLOCK или socket.SOCK_CLOEXEC, socket.type больше не применяет их. Поэтому проверки вида if sock.type == socket.SOCK_STREAM работают как ожидается на всех платформах. (Автор: Yury Selivanov в bpo-32331.)

  • В Windows значение по умолчанию для аргумента close_fds функции subprocess.Popen было изменено с False на True при перенаправлении стандартных дескрипторов. Если ранее вы полагались на то, что дескрипторы наследуются при использовании subprocess.Popen с перенаправлением стандартного ввода-вывода, вам придётся передать close_fds=False, чтобы сохранить прежнее поведение, или использовать STARTUPINFO.lpAttributeList.

  • importlib.machinery.PathFinder.invalidate_caches() – который неявно влияет на importlib.invalidate_caches() – теперь удаляет записи в sys.path_importer_cache, для которых установлено значение None. (Автор: Brett Cannon в bpo-33169.)

  • В asyncio, loop.sock_recv(), loop.sock_sendall(), loop.sock_accept(), loop.getaddrinfo(), loop.getnameinfo() были изменены, чтобы стать полноценными методами-корутинами в соответствии с их документацией. Ранее эти методы возвращали экземпляры asyncio.Future. (Автор: Yury Selivanov в bpo-32327.)

  • asyncio.Server.sockets теперь возвращает копию внутреннего списка серверных сокетов, вместо того чтобы возвращать его напрямую. (Автор: Yury Selivanov в bpo-32662.)

  • Struct.format теперь является экземпляром str вместо экземпляра bytes. (Автор: Victor Stinner в bpo-21071.)

  • Подпарсеры argparse теперь можно сделать обязательными, передав required=True в ArgumentParser.add_subparsers(). (Автор: Anthony Sottile в bpo-26510.)

  • ast.literal_eval() теперь стал строже. Сложение и вычитание произвольных чисел больше не допускаются. (Автор: Serhiy Storchaka в bpo-31778.)

  • Calendar.itermonthdates теперь будет последовательно вызывать исключение, если дата выходит за пределы диапазона от 0001-01-01 до 9999-12-31. Для поддержки приложений, которые не могут допускать такие исключения, можно использовать новые Calendar.itermonthdays3 и Calendar.itermonthdays4. Новые методы возвращают кортежи и не ограничены диапазоном, поддерживаемым datetime.date. (Автор: Alexander Belopolsky в bpo-28292.)

  • collections.ChainMap теперь сохраняет порядок нижележащих отображений. (Автор: Raymond Hettinger в bpo-32792.)

  • Метод submit() классов concurrent.futures.ThreadPoolExecutor и concurrent.futures.ProcessPoolExecutor теперь вызывает RuntimeError, если он вызывается во время завершения работы интерпретатора. (Автор: Mark Nemec в bpo-33097.)

  • Конструктор configparser.ConfigParser теперь использует read_dict() для обработки значений по умолчанию, что делает его поведение согласованным с остальным парсером. Ключи и значения не строкового типа в словаре defaults теперь неявно преобразуются в строки. (Автор: James Tocknell в bpo-23835.)

  • Несколько недокументированных внутренних импортов были удалены. Один из примеров: os.errno больше не доступен; используйте import errno напрямую. Обратите внимание, что такие недокументированные внутренние импорты могут быть удалены в любое время без предупреждения, даже в микроверсиях.

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

Функция PySlice_GetIndicesEx() считается небезопасной для изменяемых последовательностей. Если индексы среза не являются экземплярами int, а объектами, реализующими метод __index__(), последовательность может быть изменена после передачи её длины в PySlice_GetIndicesEx(). Это может привести к возврату индексов за пределами длины последовательности. Чтобы избежать возможных проблем, используйте новые функции PySlice_Unpack() и PySlice_AdjustIndices(). (Автор: Serhiy Storchaka в bpo-27867.)

Изменения байткода CPythonCPython bytecode changes

Появилось два новых опкода: LOAD_METHOD и CALL_METHOD. (Автор: Yury Selivanov и INADA Naoki в bpo-26110.)

Опкод STORE_ANNOTATION был удалён. (Автор: Mark Shannon в bpo-32550.)

Изменения только для WindowsWindows-only Changes

Файл, используемый для переопределения sys.path, теперь называется <python-executable>._pth вместо 'sys.path'. См. раздел Поиск модулей для получения дополнительной информации. (Автор: Steve Dower в bpo-28137.)

Другие изменения в реализации CPythonOther CPython implementation changes

В рамках подготовки к возможным будущим изменениям в публичном API инициализации CPython (см. PEP 432 – первоначальный, но несколько устаревший черновик), внутренняя логика запуска и управления конфигурацией CPython была значительно переработана. Хотя эти изменения призваны быть полностью прозрачными как для встраиваемых приложений, так и для пользователей обычного CLI CPython, они упоминаются здесь, поскольку рефакторинг меняет внутренний порядок различных операций во время запуска интерпретатора и, следовательно, может выявить ранее скрытые дефекты как во встраиваемых приложениях, так и в самом CPython. (Первоначально добавлено Ником Коглан и Эриком Сноу в рамках bpo-22257, и впоследствии обновлено Ником, Эриком и Виктором Штиннером в ряде других тикетов). Некоторые известные затронутые аспекты:

  • PySys_AddWarnOptionUnicode() в настоящее время непригоден для встраиваемых приложений из-за необходимости создания объекта Unicode перед вызовом Py_Initialize. Вместо этого используйте PySys_AddWarnOption().

  • Фильтры предупреждений, добавленные встраиваемым приложением с помощью PySys_AddWarnOption(), теперь должны более последовательно иметь приоритет над фильтрами по умолчанию, установленными интерпретатором.

Из-за изменений в настройке фильтров предупреждений по умолчанию установка Py_BytesWarningFlag в значение больше единицы больше не является достаточной для того, чтобы одновременно генерировать сообщения BytesWarning и преобразовывать их в исключения. Вместо этого флаг должен быть установлен (чтобы вызвать выдачу предупреждений), и необходимо добавить явный фильтр предупреждений error::BytesWarning для преобразования их в исключения.

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

Текущее состояние исключения было перемещено из объекта фрейма в корутину. Это упростило интерпретатор и исправило несколько трудноуловимых ошибок, вызванных переключением состояния исключения при входе в генератор или выходе из него. (Добавлено Марком Шенноном в bpo-25612.)

Заметные изменения в Python 3.7.1Notable changes in Python 3.7.1

Начиная с версии 3.7.1, Py_Initialize() теперь последовательно читает и учитывает все те же переменные окружения, что и Py_Main() (в более ранних версиях Python учитывался плохо определённый подмножество этих переменных, а в Python 3.7.0 он не читал их вовсе из-за bpo-34247). Если такое поведение нежелательно, установите Py_IgnoreEnvironmentFlag в 1 перед вызовом Py_Initialize().

В версии 3.7.1 C API для контекстных переменных был обновлён для использования указателей PyObject. См. также bpo-34762.

Модули xml.dom.minidom и xml.sax больше не обрабатывают внешние сущности по умолчанию. См. также bpo-17239.

В версии 3.7.1 модуль tokenize теперь неявно генерирует токен NEWLINE, если на вход подаётся строка без завершающего символа новой строки. Такое поведение теперь соответствует тому, что делает C-токенизатор внутри. (Добавлено Аммаром Аскаром в bpo-33899.)

Заметные изменения в Python 3.7.2Notable changes in Python 3.7.2

В версии 3.7.2 venv в Windows больше не копирует исходные бинарные файлы, а вместо этого создаёт скрипты-перенаправители с именами python.exe и pythonw.exe. Это решает давнюю проблему, когда все виртуальные окружения приходилось обновлять или пересоздавать с каждым обновлением Python. Однако обратите внимание, что для получения новых скриптов этот выпуск всё равно потребует пересоздания виртуальных окружений.

Заметные изменения в Python 3.7.6Notable changes in Python 3.7.6

Из-за серьёзных проблем безопасности параметр reuse_address функции asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением опции сокета SO_REUSEADDR в UDP. Подробнее см. документацию loop.create_datagram_endpoint(). (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в bpo-37228.)

Заметные изменения в Python 3.7.10Notable changes in Python 3.7.10

Более ранние версии Python допускали использование как ;, так и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия новым рекомендациям W3C это поведение было изменено: теперь разрешён только один ключ-разделитель, & по умолчанию. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они внутренне используют затронутые функции. Дополнительные сведения см. в их документации. (Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)

Заметные изменения в Python 3.7.11Notable changes in Python 3.7.11

Исправление безопасности изменяет поведение ftplib.FTP: теперь не доверяется IPv4-адресу, отправленному удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для нестандартного кода, которому требуется старое поведение, задайте атрибут trust_server_pasv_ipv4_address экземпляра FTP равным True. (См. bpo-43285)

Наличие символов новой строки или табуляции в частях URL позволяет осуществлять некоторые виды атак. Следуя спецификации WHATWG, обновляющей RFC 3986, ASCII-символы новой строки \n, \r и табуляции \t удаляются из URL парсером urllib.parse(), что предотвращает такие атаки. Удаляемые символы задаются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (См. bpo-43882)

Заметная функция безопасности в 3.7.14Notable security feature in 3.7.14

Преобразование между int и str в системах счисления, отличных от 2 (двоичной), 4, 8 (восьмеричной), 16 (шестнадцатеричной) или 32, например, 10 (десятичной), теперь вызывает ValueError, если количество цифр в строковом представлении превышает предельное значение, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это мера смягчения последствий для CVE-2020-10735. Этот предел можно настроить или отключить с помощью переменной окружения, флага командной строки или sys API. См. документацию ограничение длины преобразования целых чисел в строку. Значение по умолчанию – 4300 цифр в строковом представлении.