Что нового в Python 3.7

Редактор:Элвис Пранскевичус

В данной статье объясняются новые возможности Python 3.7 по сравнению с 3.6. Python 3.7 был выпущен 27 июня 2018 г. Для получения полной информации см. новости.

Резюме. Основные моменты релиза

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

  • PEP 563, отложенное вычисление аннотаций типов.

Обратно несовместимые изменения синтаксиса:

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

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

Новые встроенные функции:

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

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

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

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

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

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

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

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

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

Новые особенности

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

Появление подсказок типов в 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: устаревшее принуждение к C локали

Постоянная проблема в серии 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

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

В режиме 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 написан и реализован Виктором Стиннером

PEP 553: встроенный breakpoint()

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

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

См.также

PEP 553 – Встроенная breakpoint()
PEP написан и реализован Барри Варшавой

PEP 539: новый C API для локального хранилища потоков

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

PEP 539 изменяет это, предоставляя новый API хранилища для потоков (TSS) для CPython, который заменяет использование существующего API TLS в интерпретаторе CPython, но при этом объявляет устаревшим существующий API. TSS API использует новый тип Py_tss_t вместо int для представления TSS ключей — непрозрачный тип, определение которого может зависеть от базовой реализации TLS. Следовательно, это позволит создавать CPython на платформах, где собственный TLS ключ определён таким образом, что его нельзя безопасно преобразовать в int.

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

См.также

PEP 539 – Новый C-API для хранилища локальных потоков в CPython
PEP написан Эриком М. Бреем; реализация Масаюки Ямамото.

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

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

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

См.также

PEP 562 – Модуль __getattr__ и __dir__
PEP написан и реализован Иваном Левкивским

PEP 564: новые функции времени с наносекундным разрешением

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

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

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

См.также

PEP 564 – Добавлены новые функции времени с разрешением в наносекунды
PEP написан и реализован Виктором Стиннером

PEP 565: показать предупреждение об устаревании в __main__

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

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

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

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

См.также

PEP 565 – Показать предупреждение об устаревании в __main__
PEP написан и реализован Ником Когланом

PEP 560: поддержка ядром модуля typing и общих типов

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

См.также

PEP 560 – Основная поддержка модуля typing и универсальных типов
PEP написан и реализован Иваном Левкивским

PEP 552: файлы .pyc на основе хеша

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

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

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

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

См.также

PEP 552 – Детерминированные pyc
PEP написан и реализован Бенджамином Петерсоном

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

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

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

См.также

PEP 545 – Переводы документации Python
PEP написан и реализован Жюльеном Палардом, Инадой Наоки и Виктором Стиннером.

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

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

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

  • Выражение await и включения, содержащие предложение async for, были недопустимыми в выражениях форматированные строковые литералы из-за проблемы с реализацией. В Python 3.7 это ограничение было снято.
  • Теперь в функцию можно передать более 255 аргументов, а функция теперь может иметь более 255 параметров. (Предоставлено Сергеем Сторчакой в bpo-12844 и bpo-18896.)
  • bytes.fromhex() и bytearray.fromhex() теперь игнорируют все пробелы ASCII, а не только пробелы. (Предоставлено Робертом Сяо в bpo-28927.)
  • str, bytes и bytearray получили поддержку нового метода isascii(), который можно использовать для проверки того, содержат ли строка или байты только ASCII символы. (Предоставлено Инада Наоки в bpo-32677.)
  • ImportError теперь отображает имя модуля и путь модуля __file__ при сбое from ... import .... (Предоставлено Матиасом Буссонье в bpo-29546.)
  • Теперь поддерживается циклический импорт, включающий абсолютный импорт с привязкой подмодуля к имени. (Предоставил Сергей Сторчака в bpo-30024.)
  • object.__format__(x, '') теперь эквивалентен str(x), а не format(str(self), ''). (Предоставлено Сергеем Сторчакой в bpo-28974.)
  • Чтобы лучше поддерживать динамическое создание трассировки стека, types.TracebackType теперь может быть создан из кода Python, а атрибут tb_next в трейсбэках теперь доступен для записи. (Предоставлено Натаниэлем Дж. Смитом в bpo-30579.)
  • При использовании переключателя -m sys.path[0] теперь с готовностью расширяется до полного пути к начальному каталогу, а не остаётся пустым каталогом (что позволяет импортировать из текущего рабочего каталога во время импорта). (Предоставлено Ником Когланом в bpo-33053 .)
  • Новая опция -X importtime или переменная среды PYTHONPROFILEIMPORTTIME могут использоваться для отображения времени импорта каждого модуля. (Предоставлено Виктором Стиннером в bpo-31415.)

Новые модули

contextvars

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

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

См.также

PEP 567 – Переменные контекста
PEP написан и реализован Юрием Селивановым

Датаклассы

Новый декоратор 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 написан и реализован Эриком В. Смитом

importlib.resources

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

Предоставлено Барри Варшавой и Бреттом Кэнноном в bpo-32248.

См.также

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

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

argparse

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

asyncio

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

  • Новую предварительную функцию asyncio.run() можно используемую для запуска корутины из синхронного кода путём автоматического создания и уничтожения событийного цикла. (Предоставил Юрий Селиванов в 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 для получения более подробной информации. (Предоставил Юрий Селиванов в bpo-32436.)

  • Новая функция asyncio.create_task() была добавлена в качестве ярлыка для asyncio.get_event_loop().create_task(). (Предоставлено Эндрю Светловым в bpo-32311.)

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

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

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

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

  • Новая функция asyncio.get_running_loop() возвращает текущий выполняемый цикл и вызывает RuntimeError, если цикл не выполняется. Это отличается от asyncio.get_event_loop(), которая будет создавать новый цикл событий, если ни один из них не запущен. (Предоставлено Юрием Селивановым в bpo-32269.)

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

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

  • Новые методы Future.get_loop() и Task.get_loop() возвращают экземпляр цикла, в котором была создана задача или будущее. Server.get_loop() позволяет сделать то же самое для объектов asyncio.Server. (Предоставлено Юрием Селивановым в bpo-32415 и Шринивасом Редди Татипарти в 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 закрыт и больше не принимает новые подключения.
    

    (Предоставил Юрий Селиванов в bpo-32662.)

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

  • Метод loop.create_datagram_endpoint() получил поддержку Unix сокетов. (Предоставлено Квентином Давансом в bpo-31245.)

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

  • Новый метод Handle.cancelled() возвращает True, если обратный вызов был отменён. (Предоставлено Маратом Шарафутдиновым в bpo-31943.)

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

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

  • Методы цикла, которые принимают пути сокетов, теперь поддерживают передачу путеподобного объекта. (Предоставил Юрий Селиванов в bpo-32066.)

  • В asyncio TCP сокеты в Linux теперь создаются с установленным по умолчанию флагом TCP_NODELAY. (Предоставлено Юрием Селивановым и Виктором Стиннером в bpo-27456.)

  • Вызываемые исключения в отмененных задачах, больше не регистрируются. (Предоставил Юрий Селиванов в bpo-30508.)

  • Новые классы WindowsSelectorEventLoopPolicy и WindowsProactorEventLoopPolicy. (Предоставил Юрий Селиванов в bpo-33792.)

Несколько API asyncio были запрещены.

binascii

Функция b2a_uu() теперь принимает необязательный ключевой аргумент backtick. Когда это правда, нули представлены '`' вместо пробелов. (Предоставлено Сян Чжаном в bpo-30103.)

calendar

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

collections

collections.namedtuple() теперь поддерживает значения по умолчанию. (Предоставлено Рэймондом Хеттингером в bpo-32320.)

compileall

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

concurrent.futures

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

ProcessPoolExecutor теперь может принимать многопроцессорный контекст через новый аргумент mp_context. (Предоставлено Томасом Моро в bpo-31540.)

contextlib

Новый nullcontext() — более простой и быстрый контекстный менеджер без операций, чем ExitStack. (Предоставлено Джесси-Баккер в bpo-10049.)

Новые asynccontextmanager(), AbstractAsyncContextManager и AsyncExitStack были добавлены в дополнение к их синхронным аналогам. (Предоставлено Йелле Зейлстрой в bpo-29679 и bpo-30241, а также Александром Мором и Ильей Кулаковым в bpo-29302.)

cProfile

Командная строка cProfile теперь принимает -m module_name в качестве альтернативы пути к сценарию. (Предоставлено Саньямом Кураной в 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 вызовет 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 и IDLE

Несколько исправлений для автозаполнения. (Предоставлено Луи Лу в bpo-15786.)

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

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

Образец шрифта теперь включает множество нелатинских символов, чтобы пользователи могли лучше видеть эффект выбора определённого шрифта. (Предоставлено Терри Яном Риди в bpo-13802.) Образец можно отредактировать, включив в него другие символы. (Предоставил Сергей Сторчака в bpo-31860.)

Функции IDLE, ранее реализованные в виде расширений, теперь реализованы как обычные функции. Их настройки были перенесены с вкладок «Extensions» на другие вкладки диалога. (Предоставлено Чарльзом Вольгангером и Терри Джен Риди в bpo-27099.)

Параметр контекста кода редактора изменён. Box отображает все строки контекста до maxlines. Щелчок по строке контекста переводит редактор на эту строку. Контекстные цвета для пользовательских тем добавлены на вкладку Highlights диалогового окна Settings. (Предоставлено Шерил Сабелла и Терри Ян Риди в bpo-33642, bpo-33768 и bpo-33679.)

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

Новое в версии 3.7.1:

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

Вышеупомянутые изменения были перенесены в отладочные версии 3.6.

НОВОЕ в версии 3.7.4:

Добавляет «Run Customized» в меню «Run», чтобы запустить модуль с индивидуальными настройками. Любые введенные аргументы командной строки добавляются в sys.argv. Они снова появляются в поле для следующего индивидуального запуска. Также можно подавить обычный перезапуск основного модуля Shell. (Предоставлено Шерил Сабелла, Терри Ян Риди и другими в bpo-5680 и bpo-37627.)

Новое в версии 3.7.5:

Добавляет необязательные номера строк для окон редактора IDLE. Окна открываются без номеров строк, если не указано иное на вкладке «General» диалогового окна конфигурации. Номера строк для существующего окна отображаются и скрываются в меню «Options». (Предоставлено Тал Эйнат и Саймадхав Хебликар в bpo-17535.)

importlib

importlib.abc.ResourceReader ABC был введён для поддержки загрузки ресурсов из пакетов. См. также importlib.resources. (Предоставлено Барри Варшавой, Бреттом Кэнноном в bpo-32248.)

importlib.reload() теперь вызывает ModuleNotFoundError, если у модуля нет спецификации. (Предоставлено Гарвитом Хатри в bpo-29851.)

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

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

io

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

ipaddress

Новые методы subnet_of() и supernet_of() из ipaddress.IPv6Network и ipaddress.IPv4Network можно использовать для тестов локализации сети. (Предоставлено Мишелем Альбертом и Шерил Сабеллой в bpo-20825.)

itertools

itertools.islice() теперь принимает целочисленные объекты в качестве аргументов запуска, остановки и среза. (Предоставлено Уиллом Робертсом в bpo-30537.)

locale

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

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

logging

Экземпляры Logger теперь можно пиклить. (Предоставлено Винаем Саджипом в bpo-30520.)

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

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

math

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

mimetypes

Тип MIME файла .bmp был изменён с 'image/x-ms-bmp' на 'image/bmp'. (Предоставлено Нитишем Чандрой в bpo-22589.)

msilib

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

multiprocessing

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

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

Недемонические потоки, созданные с помощью Process, теперь объединяются при выходе из процесса. (Предоставлено Антуаном Питру в bpo-18966.)

os

os.fwalk() теперь принимает аргумент path как bytes. (Предоставлено Сергеем Сторчакой в bpo-28682.)

os.scandir() получил поддержку файловых дескрипторов. (Предоставил Сергей Сторчака в bpo-25996.)

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

Добавлены функции os.preadv() (объединяют функциональные возможности os.readv() и os.pread()) и os.pwritev() (объединяют функциональные возможности os.writev() и os.pwrite()). (Предоставлено Пабло Галиндо в bpo-31368.)

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

os.dup2() теперь возвращает новый файловый дескриптор. Раньше всегда возвращался None. (Предоставлено Бенджамином Петерсоном в bpo-32441.)

Структура, возвращаемая os.stat(), теперь содержит атрибут st_fstype для Solaris и его производных. (Предоставлено Хесусом Сеа Авионом в bpo-32659.)

pathlib

Новый метод Path.is_mount() теперь доступен в POSIX системах и может использоваться для определения того, является ли путь точкой монтирования. (Предоставлено Купером Рай Лисом в bpo-30897.)

pdb

pdb.set_trace() теперь принимает необязательный аргумент header только ключевой. Если задано, оно выводится на консоль непосредственно перед началом отладки. (Предоставлено Барри Варшавой в bpo-31389.)

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

py_compile

py_compile.compile() и compileall — теперь учитывает переменную среды SOURCE_DATE_EPOCH, безоговорочно создавая файлы .pyc для проверки на основе хэша. Это позволяет гарантировать воспроизводимые сборки файлов из .pyc, когда они создаются с готовностью. (Предоставлено Бернхардом М. Видеманном в bpo-29708.)

pydoc

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

queue

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

re

Флаги re.ASCII, re.LOCALE и re.UNICODE могут быть установлены в рамках группы. (Предоставил Сергей Сторчака в bpo-31690.)

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

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

FutureWarning теперь генерируется, если регулярное выражение содержит конструкции наборов символов, которые изменятся семантически в будущем, например, вложенные множества и операции над наборами. (Предоставлено Сергеем Сторчакой в bpo-30349.)

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

signal

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

socket

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

Новая функция socket.close() закрывает переданный файловый дескриптор сокета. Эту функцию следует использовать вместо os.close() для лучшей совместимости между платформами. (Предоставлено Кристианом Хеймсом в 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). (Предоставлено Омаром Сандовалом в bpo-26273 и Натаниэлем Дж. Смитом в bpo-29728.)

Добавлена поддержка сокетов socket.AF_VSOCK для обеспечения связи между виртуальными машинами и их хостами. (Предоставлено Кэти Эйвери в bpo-27584.)

Сокеты теперь автоматически определяют семейство, тип и протокол по файловому дескриптору по умолчанию. (Предоставлено Кристианом Хеймсом в 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 или выше. (Предоставлено Леле Гайфакс в bpo-27645.)

Аргумент database sqlite3.connect() теперь принимает любой путеподобный объект, а не только строку. (Предоставлено Андерсом Лорентсеном в bpo-31843.)

ssl

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

Примечание

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

Модуль ssl больше не отправляет IP-адреса в расширении SNI TLS. (Предоставлено Кристианом Хеймсом в bpo-32185.)

match_hostname() больше не поддерживает частичные подстановочные знаки, такие как www*.example.org. (Предоставлено Мандипом Сингхом в bpo-23033 и Кристианом Хеймсом в bpo-31399.)

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

Теперь поддерживается проверка сертификатов сервера, содержащих интернационализированные доменные имена (IDN). В рамках этого изменения атрибут SSLSocket.server_hostname теперь хранит ожидаемое имя хоста в форме A-метки ("xn--pythn-mua.org"), а не в форме U-метки ("pythön.org"). (Предоставлено Натаниэлем Дж. Смитом и Кристианом Хаймсом в 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. (Предоставлено Кристианом Хеймсом в bpo-32947, bpo-20995, bpo-29136, bpo-30622 и bpo-33618)

SSLSocket и SSLObject больше не имеют общедоступного конструктора. Прямое создание экземпляров никогда не было задокументированной и поддерживаемой функцией. Экземпляры должны быть созданы с помощью методов SSLContext wrap_socket() и wrap_bio(). (Предоставлено Кристианом Хеймсом в bpo-32951)

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

string

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

subprocess

Функция subprocess.run() принимает новый ключевой аргумент capture_output. При значении истина будут захвачены stdout и stderr. Это эквивалентно передаче subprocess.PIPE в качестве аргументов stdout и stderr. (Предоставлено Бо Бейлсом в bpo-32102.)

Функция subprocess.run и конструктор subprocess.Popen теперь принимают ключевой аргумент text в качестве псевдонима для universal_newlines. (Предоставлено Эндрю Клеггом в bpo-31756.)

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

Модуль subprocess теперь более изящно обрабатывает KeyboardInterrupt во время subprocess.call(), subprocess.run() или в менеджере контекста Popen. Теперь он ждет некоторое время, пока дочерний процесс завершится, прежде чем продолжить обработку исключения KeyboardInterrupt. (Предоставлено Грегори П. Смитом в bpo-25942.)

sys

Новая хук функция sys.breakpointhook() вызывается встроенной функцией breakpoint(). (Предоставлено Барри Варшавой в bpo-31353.)

В Android новый sys.getandroidapilevel() возвращает версию Android API времени сборки. (Предоставлено Виктором Стиннером в bpo-28740.)

Новая функция sys.get_coroutine_origin_tracking_depth() возвращает текущую глубину отслеживания источника корутины, установленную новым sys.set_coroutine_origin_tracking_depth(). asyncio был преобразован для использования этого нового API вместо устаревшего sys.set_coroutine_wrapper(). (Предоставлено Натаниэлем Дж. Смитом в 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() можно использовать для измерения времени ЦП для каждого потока. (Предоставлено Антуаном Питру в bpo-32025.)

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

tkinter

Теперь доступен новый класс tkinter.ttk.Spinbox. (Предоставлено Аланом Муром в bpo-32585.)

tracemalloc

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

types

Теперь доступны новые классы WrapperDescriptorType, MethodWrapperType, MethodDescriptorType и ClassMethodDescriptorType. (Предоставили Мануэль Креббер и Гвидо ван Россумом в bpo-29377 и Сергей Сторчака в bpo-32265.)

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

unicodedata

Внутренняя база данных unicodedata была обновлена для использования Юникода 11. (Предоставлено Бенджамином Петерсоном.)

unittest

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

unittest.mock

Атрибуты sentinel теперь сохраняют свою идентичность, когда они являются копией или пиклем. (Предоставлено Сергеем Сторчакой в bpo-20804.)

Новая функция seal() позволяет запечатывать экземпляры Mock, что запрещает дальнейшее создание атрибута мокингов. Рекурсивно печать применяется ко всем атрибутам, у которых есть мокинги. (Предоставлено Марио Корчеро в bpo-30541.)

urllib.parse

urllib.parse.quote() был обновлён с RFC 2396 до RFC 3986, добавлен ~ к набору символов, которые по умолчанию никогда не заключаются в кавычки. (Предоставлено Кристианом Теуном и Ратнадипом Дебнатом в bpo-16285.)

uu

Функция uu.encode() теперь принимает необязательный ключевой аргумент backtick. Когда это правда, нули представлены '`' вместо пробелов. (Предоставлено Сян Чжаном в bpo-30103.)

uuid

Новый атрибут UUID.is_safe передает информацию от платформы о том, генерируются ли сгенерированные UUID с помощью многопроцессорного безопасного метода. (Предоставлено Барри Варшавой в bpo-22807.)

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

warnings

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

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

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

    • фильтр BytesWarning для -b (или -bb)
    • любые фильтры, указанные с опцией -W
    • любые фильтры, указанные в переменной среды PYTHONWARNINGS
    • любые другие специальные фильтры CPython (например, фильтр default, добавленный для нового режима -X dev)
    • любые неявные фильтры, определённые непосредственно механизмом предупреждений
  • в отладочных сборках CPython все предупреждения теперь отображаются по умолчанию (список неявных фильтров пуст)

(Предоставлено Ником Когланом и Виктором Стиннером в bpo-20361, bpo-32043 и bpo-32230.)

Предупреждения об устаревании снова отображаются по умолчанию в сценариях с одним файлом и в интерактивной подсказке. Подробности см. в PEP 565: показать предупреждение об устаревании в __main__. (Предоставлено Ником Когланом в bpo-31975.)

xml.etree

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

xmlrpc.server

SimpleXMLRPCDispatcher.register_function теперь можно использовать как декоратор. (Предоставлено Сян Чжаном в bpo-7769.)

zipapp

Функция create_archive() теперь принимает необязательный аргумент filter, позволяющий пользователю выбирать, какие файлы следует включать в архив. (Предоставлено Ирмен де Йонг в bpo-31072.)

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

zipfile

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

Подкаталоги в архивах, созданных ZipFile, теперь хранятся в алфавитном порядке. (Предоставлено Бернхардом М. Видеманном в bpo-30693.)

Изменения C API

Реализован новый API для локального хранилища потока. См. PEP 539: новый C API для локального хранилища потоков для обзора и API хранилища для потоков (TSS) для полной справки. (Предоставлено Масаюки Ямамото в bpo-25658.)

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

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

Новый макрос Py_RETURN_RICHCOMPARE упрощает написание расширенных функций сравнения. (Предоставлено Петром Викториным в bpo-23699.)

Новый макрос Py_UNREACHABLE можно использовать для обозначения недоступных путей кода. (Предоставлено Барри Варшавой в bpo-31338.)

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

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

Поля name и doc структур PyMemberDef, PyGetSetDef, PyStructSequence_Field, PyStructSequence_Desc и wrapperbase теперь имеют тип const char *, а не char *. (Предоставил Сергей Сторчака в bpo-28761.)

Результат PyUnicode_AsUTF8AndSize() и PyUnicode_AsUTF8() теперь имеет тип const char *, а не char *. (Предоставлено Сергеем Сторчакой в bpo-28769.)

Результатом PyMapping_Keys(), PyMapping_Values() и PyMapping_Items() теперь всегда является список, а не список или кортеж. (Предоставлено Ореном Милманом в bpo-28280.)

Добавлены функции PySlice_Unpack() и PySlice_AdjustIndices(). (Предоставил Сергей Сторчака в bpo-27867.)

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

Синглтон PyExc_RecursionErrorInst, который был частью общедоступного API, был удалён, т. к. его никогда не очищающиеся элементы, могут вызвать segfault во время финализации интерпретатора. Предоставлено Ксавьером де Гаем в bpo-22898 и bpo-30697.

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

Тип результатов PyThread_start_new_thread() и PyThread_get_thread_ident(), а также параметр id PyThreadState_SetAsyncExc() изменились с long на unsigned long. (Предоставил Сергей Сторчака в bpo-6532.)

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

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

Новый PyInterpreterState_GetID() возвращает уникальный идентификатор для данного интерпретатора. (Предоставлено Эриком Сноу в bpo-29102.)

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

PyUnicode_DecodeLocaleAndSize() и PyUnicode_EncodeLocale() теперь используют кодировку текущей локали для обработчика ошибок surrogateescape. (Предоставлено Виктором Стиннером в bpo-29240.)

Параметры start и end PyUnicode_FindChar() теперь настроены так, чтобы вести себя как срезы строк. (Предоставлено Сян Чжаном в bpo-28822.)

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

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

Полная копия libffi больше не поставляется для использования при сборке модуля _ctypes на платформах, отличных от OSX UNIX. Установленная копия libffi теперь требуется при сборке _ctypes на таких платформах. (Предоставлено Закари Уэр в bpo-27979.)

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

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

Оптимизации

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

Различные оптимизации сократили время запуска Python на 10% в Linux и до 30% в macOS. (Предоставлено Виктором Стиннером, Инада Наоки в bpo-29585 и Иваном Левкивским в bpo-31333.)

Вызовы методов теперь до 20% быстрее из-за изменений байт-кода, которые позволяют избежать создания связанных экземпляров метода. (Предоставили Юрий Селиванов и Инада Наоки в bpo-26110.)

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

  • Функция asyncio.get_event_loop() была повторно реализована в C, чтобы сделать её в 15 раз быстрее. (Предоставлено Юрием Селивановым в bpo-32296.)
  • Оптимизировано управление обратными вызовами asyncio.Future. (Предоставлено Юрием Селивановым в bpo-32348.)
  • asyncio.gather() теперь на 15% быстрее. (Предоставил Юрий Селиванов в bpo-32355.)
  • asyncio.sleep() теперь работает до 2 раз быстрее, когда аргумент delay равен нулю или отрицателен. (Предоставлено Эндрю Светловым в bpo-32351.)
  • Снижение производительности в режиме отладки asyncio. (Предоставлено Антуаном Питру в bpo-31970.)

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

sorted() и list.sort() были оптимизированы для распространенных случаев и теперь работают на 40–75% быстрее. (Предоставлено Эллиотом Гороховским в bpo-28685.)

dict.copy() теперь до 5,5 раз быстрее. (Предоставил Юрий Селиванов в bpo-31179.)

hasattr() и getattr() теперь работают примерно в 4 раза быстрее, если name не найден и obj не переопределяет object.__getattr__() или object.__getattribute__(). (Предоставлено Инада Наоки в bpo-32544.)

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

Фабрика collections.namedtuple() была переработана, чтобы ускорить создание именованных кортежей в 4–6 раз. (Предоставлено Йелле Зейлстра с дальнейшими улучшениями Инады Наоки, Сергеем Сторчака и Раймондом Хеттингером в bpo-28638.)

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

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

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

Оптимизировано сопоставление и поиск обычных выражений без учёта регистра. Поиск некоторых шаблонов теперь может быть до 20 раз быстрее. (Предоставил Сергей Сторчака в bpo-30285.)

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

Методы modify() классов selectors.EpollSelector, selectors.PollSelector и selectors.DevpollSelector могут быть примерно на 10% быстрее при больших нагрузках. (Предоставлено Джампаоло Родола в bpo-30014)

Сворачивание констант было перемещено из оптимизатора глазка в новый оптимизатор AST, который может выполнять оптимизацию более последовательно. (Предоставлено Юджином Тодером и Инада Наоки в bpo-29469 и bpo-11549.)

Большинство функций и методов в abc были переписаны на C. Это позволяет создавать абстрактные базовые классы и вызывать для них isinstance() и issubclass() в 1,5 раза быстрее. Это также сокращает время запуска Python до 10%. (Предоставлено Иваном Левкивским и Инада Наоки в bpo-31333)

Значительное повышение скорости альтернативных конструкторов для datetime.date и datetime.datetime за счет использования конструкторов быстрого пути, когда не создаются подклассы. (Предоставлено Полом Ганссле в bpo-32403)

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

Функции math.erf() и math.erfc() теперь используют (более быструю) реализацию библиотеки C на большинстве платформ. (Предоставил Сергей Сторчака в bpo-26121.)

Другие изменения CPython реализации

  • Перехватчики трассировки теперь могут отказаться от получения line и выбрать получение событий opcode от интерпретатора, установив соответствующие новые атрибуты f_trace_lines и f_trace_opcodes в отслеживаемом фрейме. (Предоставлено Ником Когланом в bpo-31344.)
  • Исправлены некоторые проблемы согласованности с атрибутами модуля пакета пространства имён. Объекты модуля пространства имён теперь имеют __file__, для которого установлено значение None (ранее не было установлено), и их __spec__.origin также устанавливается на None (ранее строка "namespace"). См. bpo-32305. Также модуль namespace объекты __spec__.loader устанавливается на то же значение, что и __loader__ (ранее для первого было установлено значение None). См. bpo-32303.
  • Словарь locals() теперь отображается в лексическом порядке, в котором были определены переменные. Ранее порядок не был определён. (Предоставлено Рэймондом Хеттингером в bpo-32690.)
  • Команда distutils upload больше не пытается изменить символы конца строки CR на CRLF. Это устраняет проблему с повреждением sdist, которые заканчиваются байтом, эквивалентным CR. (Предоставлено Бо Бейлсом в bpo-32304.)

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

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

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

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

aifc

aifc.openfp() устарела и будет удалена в Python 3.9. Вместо этого используйте aifc.open(). (Предоставлено Брайаном Кертином в bpo-31985.)

asyncio

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

Методы asyncio.Task.current_task() и asyncio.Task.all_tasks() устарели. (Предоставлено Эндрю Светловым в bpo-32250.)

collections

В Python 3.8 абстрактные базовые классы в collections.abc больше не будут отображаться в обычном модуле collections. Это поможет создать более четкое различие между классами и абстрактными базовыми классами. (Предоставил Сергей Сторчака в bpo-25988.)

dbm

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

enum

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

gettext

Использование нецелого значения для выбора формы множественного числа в gettext теперь не рекомендуется. Это никогда не работало правильно. (Предоставлено Сергеем Сторчакой в bpo-28692.)

importlib

Методы MetaPathFinder.find_module() (заменены на MetaPathFinder.find_spec()) и PathEntryFinder.find_loader() (заменены на PathEntryFinder.find_spec()), объявленные устаревшими в Python 3.4, теперь вызывают DeprecationWarning. (Предоставлено Матиасом Буссонье в bpo-29576)

importlib.abc.ResourceLoader ABC устарел в пользу importlib.abc.ResourceReader.

locale

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

macpath

macpath теперь устарела и будет удалена в Python 3.8. (Предоставлено Чи Сюань Йеном в bpo-9850.)

threading

dummy_threading и _dummy_thread устарели. Больше невозможно собрать Python с отключенной многопоточностью. Вместо этого используйте threading. (Предоставлено Антуаном Питру в bpo-31370.)

socket

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

ssl

ssl.wrap_socket() устарел. Вместо этого используйте ssl.SSLContext.wrap_socket(). (Предоставлено Кристианом Хеймсом в bpo-28124.)

sunau

sunau.openfp() устарел и будет удалён в Python 3.9. Вместо этого используйте sunau.open(). (Предоставлено Брайаном Кертином в bpo-31985.)

sys

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

Недокументированная функция sys.callstats() устарела и будет удалена в будущей версии Python. (Предоставлено Виктором Стиннером в bpo-28799.)

wave

wave.openfp() устарела и будет удалена в Python 3.9. Вместо этого используйте wave.open(). (Предоставлено Брайаном Кертином в bpo-31985.)

Устаревшие функции и типы C API

Функция PySlice_GetIndicesEx() устарела и заменена макросом, если Py_LIMITED_API не установлен или имеет значение в диапазоне от 0x03050400 до 0x03060000 (не включительно) или 0x03060100 или выше. (Предоставил Сергей Сторчака в bpo-27867.)

PyOS_AfterFork() устарел. Вместо этого используйте PyOS_BeforeFork(), PyOS_AfterFork_Parent() или PyOS_AfterFork_Child(). (Предоставлено Антуаном Питру в bpo-16500.)

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

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

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

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

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

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

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

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

Следующие функции и API были удалены из Python 3.7:

  • Функция os.stat_float_times() удалена. Она была введена в Python 2.3 для обратной совместимости с Python 2.2 и устарела, начиная с Python 3.1.
  • Неизвестные escape-последовательности, состоящие из '\' и буквы 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, которые отображали сгенерированный исходный код для именованного класса кортежа. Это было частью оптимизации, предназначенной для ускорения создания классов. (Предоставлено Йелле Зейлстра с дальнейшими улучшениями Инада Наоки, Сергея Сторчака и Раймонда Хеттингера в bpo-28638.)
  • Функции bool(), float(), list() и tuple() больше не принимают ключевые аргументы. Первый аргумент int() теперь можно передавать только как позиционный аргумент.
  • Удалены ранее устаревшие в Python 2.4 классы Plist, Dict и _InternalDict в модуле plistlib. Значения Dict в результате функций 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. (Предоставлено Кристианом Хеймсом в bpo-32951.)
  • Неиспользуемая команда distutils install_misc удалена. (Предоставлено Эриком Н. Вандер Вил в bpo-29218.)

Удалённые модули

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

Изменения только для Windows

Средство запуска 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 завершит работу с ошибкой. (Предоставлено Стивом Барнсом в bpo-30291.)

Средство запуска можно запустить как py -0, чтобы получить список установленных питонов, со значением по умолчанию, отмеченным звездочкой. Выполнение py -0p будет включать пути. Если py запущен со спецификатором версии, который не может быть сопоставлен, он также напечатает список краткой формы доступных спецификаторов. (Предоставлено Стивом Барнсом в bpo-30362.)

Портирование на Python 3.7

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

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

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

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

  • Методы object.__aiter__() больше нельзя объявлять асинхронными. (Предоставил Юрий Селиванов в bpo-31709.)

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

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

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

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

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

  • socketserver.ThreadingMixIn.server_close() теперь ожидает завершения всех потоков, не являющихся демонами. Устанавливает для нового атрибута класса socketserver.ThreadingMixIn.block_on_close значение False, чтобы получить поведение до версии 3.7. (Предоставлено Виктором Стиннером в bpo-31233 и bpo-33540.)

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

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

  • pkgutil.walk_packages() теперь вызывает ValueError, если path является строкой. Ранее возвращался пустой список. (Предоставлено Саньямом Кураной в bpo-24744.)

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

  • Атрибуты key, value и coded_value класса http.cookies.Morsel теперь доступны только для чтения. Назначение им устарело в Python 3.5. Для их установки используйте метод set(). (Предоставил Сергей Сторчака в bpo-29192.)

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

  • Тип struct.Struct.format теперь str вместо bytes. (Предоставлено Виктором Стиннером в bpo-21071.)

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

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

  • repr для BaseException изменён, чтобы не включать запятую в конце. Это изменение затрагивает большинство исключений. (Предоставил Сергей Сторчака в bpo-30399.)

  • repr для datetime.timedelta изменён, чтобы включить ключевые аргументы в выходные данные. (Предоставлено Уткаршем Упадхьяем в bpo-30302.)

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

  • Поддержка вложенных множеств и операций над множествами в регулярных выражениях, как в Техническом стандарте Юникод № 18, может быть добавлена в будущем. Это изменит синтаксис. Чтобы облегчить это будущее изменение, FutureWarning будет вызвано в неоднозначных случаях на данный момент. К ним относятся множества, начинающиеся с буквального '[' или содержащие буквенные последовательности символов '--', '&&', '~~' и '||'. Чтобы избежать предупреждения, экранируйте их обратной косой чертой. (Предоставлено Сергеем Сторчакой в bpo-30349.)

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

    Для шаблонов, которые соответствуют как пустым, так и непустым строкам, результат поиска всех совпадений может быть изменён и в других случаях. Например, в строке '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»).

    (Предоставлено Сергеем Сторчакой в bpo-25054 и bpo-32308.)

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

  • Фреймы tracemalloc.Traceback теперь сортируются от самых старых к последним, чтобы лучше соответствовать traceback. (Предоставлено Джесси Баккером в bpo-32121.)

  • В операционных системах, поддерживающих битовые флаги socket.SOCK_NONBLOCK или socket.SOCK_CLOEXEC, socket.type больше не применяется. Поэтому проверки типа if sock.type == socket.SOCK_STREAM работают должным образом на всех платформах. (Предоставил Юрий Селиванов в 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. (Предоставлено Бреттом Кэнноном в bpo-33169.)

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

  • asyncio.Server.sockets теперь возвращает копию внутреннего списка сокетов сервера, а не возвращает его напрямую. (Предоставил Юрий Селиванов в bpo-32662.)

  • Struct.format теперь является экземпляром str вместо экземпляра bytes. (Предоставлено Виктором Стиннером в bpo-21071.)

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

  • ast.literal_eval() теперь более строгий. Сложение и вычитание произвольных чисел больше не разрешено. (Предоставлено Сергеем Сторчакой в bpo-31778.)

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

  • collections.ChainMap теперь сохраняет порядок базовых сопоставлений. (Предоставлено Рэймондом Хеттингером в bpo-32792.)

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

  • Конструктор configparser.ConfigParser теперь использует read_dict() для обработки значений по умолчанию, что делает его поведение совместимым с остальной частью парсера. Нестроковые ключи и значения в словаре по умолчанию теперь неявно преобразуются в строки. (Предоставлено Джеймсом Токнеллом в bpo-23835.)

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

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

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

Байт-код CPython меняется

Есть два новых кода операции: LOAD_METHOD и CALL_METHOD. (Предоставили Юрий Селиванов и Инада Наоки в bpo-26110.)

Код операции STORE_ANNOTATION был удалён. (Предоставлено Марком Шенноном в bpo-32550.)

Изменения только для Windows

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

Другие изменения CPython реализации

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

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

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

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

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

Заметные изменения в 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 API C для переменных контекста был обновлён для использования указателей PyObject. См. также bpo-34762.

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

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

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

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

Из соображений безопасности параметр reuse_address asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением опции сокета SO_REUSEADDR в UDP. Дополнительные сведения см. в документации для loop.create_datagram_endpoint(). (Предоставили Кайл Стэнли, Антуан Питру и Юрий Селиванов в bpo-37228.)

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

Более ранние версии Python позволяли использовать как ;, так и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из соображений безопасности и в соответствии с более новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель & по умолчанию. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они используют затронутые функции внутри. Для получения более подробной информации см. соответствующую документацию. (Предоставлено Адамом Голдшмидтом, Сентилом Кумараном и Кеном Джином в bpo-42967.)