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

Редактор:

Элвис Пранскевичус <elvis@magic.io>

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

Резюме - Основные моменты выпуска

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

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

Изменения синтаксиса, несовместимые с обратным ходом событий:

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

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

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

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

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

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

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

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

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

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

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

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

  • PEP 552, детерминированный .pycs

  • New Python Development Mode

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

Улучшения в API на языке C:

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

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

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

  • Новые переводы документации: Japanese, French и Korean.

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

Список изменений, которые могут повлиять на совместимость с предыдущими выпусками 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__ import:

from __future__ import annotations

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

См.также

PEP 563 – Отложенная оценка аннотаций

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

PEP 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

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

В режиме 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 – Встроенная точка останова()

PEP написан и реализован Барри Варшавом

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

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

PEP 539 меняет эту ситуацию, предоставляя CPython новый Thread Specific Storage (TSS) API, который заменяет использование существующего TLS API в интерпретаторе CPython, при этом обесценивая существующий API. API TSS использует новый тип 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 шесть новых «наносекундных» вариантов существующих функций таймера:

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

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

См.также

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

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

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

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

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

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

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

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

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

См.также

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

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

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

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

См.также

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

PEP написан и реализован Иваном Левкивским

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

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

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

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

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

См.также

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

PEP написан и реализован Бенджамином Петерсоном

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

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

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

См.также

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

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

Режим разработки Python (-X dev)

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

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

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

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

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

  • В str, bytes и bytearray появилась поддержка нового метода isascii(), который можно использовать для проверки того, содержит ли строка или байт только символы ASCII. (Вклад INADA Naoki в 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 на tracebacks теперь доступен для записи. (Внесено Натаниэлем Дж. Смитом в bpo-30579).

  • При использовании ключа -m, sys.path[0] теперь охотно расширяется до полного пути к начальному каталогу, а не остается пустым каталогом (что позволяет импортировать из текущего рабочего каталога в момент, когда происходит импорт) (Внесено Ником Когланом в bpo-33053).

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

Новые модули

contextvars

Новый модуль contextvars и набор new C APIs вводят поддержку контекстных переменных. Контекстные переменные концептуально похожи на потоково-локальные переменные. В отличие от 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)   # produces "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 получил множество новых возможностей, удобств и performance improvements. Заметные изменения включают:

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

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

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

  • Новый метод StreamWriter.wait_closed() coroutine позволяет ждать, пока писатель потока не будет закрыт. Новый метод 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:
        # some code
    
    # At this point, srv is closed and no longer accepts new connections.
    

    (Внесено Юрием Селивановым в 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).

  • Методы циклов, принимающие пути сокетов, теперь поддерживают передачу path-like objects. (Внесено Юрием Селивановым в bpo-32066).

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

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

  • Новые классы WindowsSelectorEventLoopPolicy и WindowsProactorEventLoopPolicy. (Внесено Юрием Селивановым в bpo-33792).

Несколько asyncio API были deprecated.

binascii

Функция b2a_uu() теперь принимает необязательный ключевой аргумент backtick. Если оно истинно, нули представляются в виде '`' instead of spaces. (Contributed by Xiang Zhang in :issue:`30103“).

календарь

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

коллекции

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

compileall

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

concurrent.futures

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

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

contextlib

Новый nullcontext() - более простой и быстрый no-op менеджер контекста, чем ExitStack. (Внесено Jesse-Bakker в bpo-10049).

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

cProfile

Командная строка cProfile теперь принимает -m module_name в качестве альтернативы пути к сценарию. (Внесено Саньямом Хураной в bpo-21862).

крипта

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

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

datetime

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

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

dbm

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

десятичная

Модуль decimal теперь использует context variables для хранения десятичного контекста. (Внесено Юрием Селивановым в 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 и IDLE

Многочисленные исправления автозаполнения. (Внесено Луи Лу в bpo-15786).

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

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

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

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

Изменена опция контекста кода редактора. В блоке отображаются все контекстные строки вплоть до 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 на странице Общие в диалоге Настройки. Меньшее количество строк, но, возможно, очень длинных, можно сжать, щелкнув правой кнопкой мыши на выводе. Сжатый вывод может быть развернут на месте двойным щелчком по кнопке или в буфер обмена или отдельное окно правым щелчком по кнопке. (Внесено Тал Эйнат в bpo-1529353).

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

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

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

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

Добавьте необязательные номера строк для окон редактора IDLE. Окна открываются без номеров строк, если не установлено иное на вкладке Общие диалогового окна конфигурации. Номера строк для существующего окна показываются и скрываются в меню 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() может быть использован для вычисления хэша переданного источника. В hash-based .pyc file вставляется значение, возвращаемое этой функцией.

io

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

ipaddress

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

itertools

itertools.islice() теперь принимает integer-like objects в качестве аргументов start, stop и slice. (Внесено Уиллом Робертсом в bpo-30537).

локаль

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

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

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

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

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

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

математика

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

mimetypes

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

msilib

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

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

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

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

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

os

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

os.scandir() получил поддержку file descriptors. (Внесено Сергеем Сторчакой в bpo-25996).

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

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

Аргумент mode в 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 файлы для проверки на основе хэша. Это позволяет гарантировать reproducible builds из .pyc файлов при их нетерпеливом создании. (Внесено Бернхардом М. Видеманном в bpo-29708).

pydoc

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

очередь

Новый класс 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).

сигнал

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

сокет

Новый метод 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.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).

Аргумент база данных в sqlite3.connect() теперь принимает любой path-like object, а не только строку. (Внесено Андерсом Лоренценом в 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).

Добавлены ssl.SSLContext.post_handshake_auth для включения и ssl.SSLSocket.verify_client_post_handshake() для инициирования аутентификации TLS 1.3 после рукопожатия. (Внесено Кристианом Хаймсом в gh-78851).

строка

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

подпроцесс

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

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

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

Модуль подпроцесса стал более изящным при обработке 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).

время

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

типы

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

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

unicodedata

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

unittest

Новая опция командной строки -k позволяет фильтровать тесты по подстроке имени или шаблону, подобному Unix shell. Например, 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 теперь сохраняют свою идентичность, когда они являются copied или pickled. (Внесено Сергеем Сторчакой в bpo-20804).

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

urllib.parse

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

uu

Функция uu.encode() теперь принимает необязательный ключевой аргумент backtick. Если оно истинно, нули представляются в виде '`' instead of spaces. (Contributed by Xiang Zhang in :issue:`30103“).

uuid

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

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

предупреждения

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

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

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

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

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

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

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

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

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

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

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

xml

В качестве меры защиты от поиска DTD и внешних сущностей модули xml.dom.minidom и xml.sax больше не обрабатывают внешние сущности по умолчанию. (Внесено Кристианом Хаймсом в gh-61441).

xml.etree

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

xmlrpc.server

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

zipapp

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

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

zip-файл

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

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

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

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

Новая функциональность context variables открывает ряд возможностей new C APIs.

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

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

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

Теперь tracemalloc предоставляет API на языке C через новые функции 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 mode. (Внесено Виктором Стиннером в bpo-29240).

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

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

Изменения в конструкции

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

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

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

Для работы модуля ssl требуется OpenSSL 1.0.2 или libssl, совместимый с 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 work время импорта 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__(). (Внесено INADA Naoki в bpo-32544).

Поиск определенных символов Unicode (например, украинской заглавной буквы «Є») в строке был в 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).

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

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

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

Сложение констант было перенесено из оптимизатора peephole в новый оптимизатор 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. Кроме того, для __spec__.loader объекта модуля пространства имен установлено то же значение, что и для __loader__ (ранее было установлено значение None). См. bpo-32303.

  • Словарь locals() теперь отображается в том лексическом порядке, в котором были определены переменные. Ранее порядок был неопределен. (Внесено Раймондом Хеттингером в bpo-32690).

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

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

Выражения Yield (как yield, так и yield from) теперь не используются в осмыслениях и генераторных выражениях (за исключением выражения iterable в крайнем левом предложении for). Это гарантирует, что comprehensions всегда сразу возвращают контейнер соответствующего типа (а не потенциально возвращают объект generator iterator), а выражения-генераторы не будут пытаться совместить свой неявный вывод с выводом из явных выражений 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 и других примитивов синхронизации asyncio была отменена. Для получения и освобождения ресурса синхронизации необходимо использовать асинхронный менеджер контекста. (Внесено Андреем Светловым в bpo-32253).

Методы asyncio.Task.current_task() и asyncio.Task.all_tasks() были устаревшими. (Внесено Андреем Светловым в bpo-32250).

коллекции

В 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 в членах 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.format() был устаревшим, вместо него используйте locale.format_string(). (Внесено Гарвитом в bpo-10379).

macpath

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

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

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

сокет

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

ssl

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

сунау

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

sys

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

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

волна

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

Утраченные функции и типы API языка C

Функция 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 или более позднюю версию, и по-прежнему поддерживаются в конфигурации сборки по умолчанию.

    В собственном CI configuration file CPython приведен пример использования SSL compatibility testing infrastructure в тестовом наборе CPython для сборки и компоновки с OpenSSL 1.1.0, а не с устаревшим OpenSSL, предоставляемым системой.

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

Следующие функции и 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.

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

  • collections.namedtuple() больше не поддерживает параметр verbose или атрибут _source, который показывал сгенерированный исходный код для класса named tuple. Это было частью оптимизации, направленной на ускорение создания классов. (Внесено 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. (Внесено Кристианом Хаймсом в 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. (Внесено Jelle Zijlstra в 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() теперь positional-only. Передача его в качестве аргумента ключевого слова была отменена в 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).

  • cgi.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.

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

  • Изменен результат разбиения строки на regular expression, который может соответствовать пустой строке. Например, при разбиении на 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(), чтобы он экранировал только специальные символы regex вместо экранирования всех символов, кроме букв 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 со стандартным перенаправлением io, вам придется передать 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() были изменены на правильные методы coroutine, чтобы соответствовать их документации. Ранее эти методы возвращали экземпляры 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() для обработки значений по умолчанию, что делает его поведение согласованным с остальной частью парсера. Нестроковые ключи и значения в словаре defaults теперь неявно преобразуются в строки. (Внесено Джеймсом Токнеллом в bpo-23835).

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

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

Функция 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 CLI, они упоминаются здесь, поскольку рефакторинг изменяет внутренний порядок различных операций при запуске интерпретатора, и, следовательно, может выявить ранее скрытые дефекты либо в встраиваемых приложениях, либо в самом CPython. (Изначально внесено Ником Когланом и Эриком Сноу в рамках bpo-22257, а затем обновлено Ником, Эриком и Виктором Стиннером в ряде других выпусков). Затронуты некоторые известные детали:

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

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

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

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

Текущее состояние исключения было перенесено из объекта фрейма в ко-программу. Это упростило интерпретатор и исправило пару непонятных ошибок, вызванных наличием подменного состояния исключения при входе и выходе из генератора. (Внесено Марком Шенноном в 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 для контекстных переменных was updated используются указатели 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).

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

Исправление безопасности изменяет поведение ftplib.FTP, чтобы не доверять IPv4-адресу, отправленному с удаленного сервера при установке пассивного канала передачи данных. Вместо этого мы используем IP-адрес ftp-сервера. Для необычного кода, требующего старого поведения, установите для атрибута trust_server_pasv_ipv4_address экземпляра FTP значение True (см. gh-87451).

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

Примечательная функция безопасности в 3.7.14

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