Что нового в 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: Новый C API для локального хранения потоков

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

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

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

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

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

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

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

Для получения дополнительной информации см. раздел Аннулирование кэшированного байткода.

См.также

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

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

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

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

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

См.также

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

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

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

Для включения -X можно использовать новый параметр командной строки dev PYTHONDEVMODE или новую переменную окружения Python Development Mode. В режиме разработки 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 написан и реализован Юрием Селивановым

dataclasses

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

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

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

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

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

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

binascii

Функция b2a_uu() теперь принимает необязательный аргумент backtick. Когда он истинен, нули представляются символами '`' вместо пробелов. (Внесено Сянь Чжаном в bpo-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. (Внесено Джесси-Баккером в 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.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).

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

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

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

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

Пересмотрена опция контекста кода редактора. В блоке отображаются все контекстные строки вплоть до maxlines. Щелчок на контекстной строке переводит редактор на эту строку. Цвета контекста для пользовательских тем добавлены на вкладку Выделения диалога Настройки. (Вклад внесли Шерил Сабелла и Терри Ян Риди в 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

ABC importlib.abc.ResourceReader был введен для поддержки загрузки ресурсов из пакетов. См. также 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() может быть использован для того, чтобы заставить преобразование использовать разделители денежных тысяч и группирующие строки. (Внесено Garvit в 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).

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

Метод new 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

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() теперь принимает любой 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).

строка

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() теперь принимает отрицательный лимит, усекая результат до 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. Когда он истинен, нули представляются символами '`' вместо пробелов. (Внесено Сянь Чжаном в bpo-30103).

uuid

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

uuid.getnode() теперь предпочитает универсально администрируемые MAC-адреса локально администрируемым MAC-адресам. Это позволяет лучше гарантировать глобальную уникальность UUID, возвращаемых из uuid.uuid1(). Если доступны только локально администрируемые MAC-адреса, возвращается первый найденный 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: Показывать предупреждение об устаревании в __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 также была добавлена для поддержки сжатия. (Внесено Zhiming Wang в bpo-31638).

zipfile

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

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

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

Реализован новый API для потоково-локального хранения данных. Смотрите PEP 539: Новый C API для локального хранения потоков для обзора и 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, был удален, так как его члены, которые никогда не очищаются, могут вызвать сегфаулт во время финализации интерпретатора. Вклад Ксавье де Гайе в 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 или 1.1, совместимый с libssl. 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% быстрее благодаря изменениям в байткоде, которые позволяют избежать создания связанных экземпляров методов. (Вклад Юрия Селиванова и INADA Naoki в 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 раз быстрее. (Внесено Джелле Зилстра (Jelle Zijlstra) с дальнейшими улучшениями, внесенными Инада Наоки (INADA Naoki), Сергеем Сторчака и Раймондом Хеттингером в 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%. (Вклад Ивана Левкивского и INADA Naoki в bpo-31333)

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

Скорость сравнения экземпляров array.array в некоторых случаях была значительно улучшена. Теперь она составляет от 10x до 70x при сравнении массивов, содержащих значения одного и того же целочисленного типа. (Внесено Адрианом Вельгосиком в 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. Это исправляет проблему повреждения sdist’ов, которые заканчивались байтом, эквивалентным 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)

ABC importlib.abc.ResourceLoader был устаревшим в пользу 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 и старше больше официально не поддерживается.

  • Для полной поддержки Unicode, в том числе в модулях расширения, *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.

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

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

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

  • Удалены ранее deprecated в 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).

  • 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. (Вклад Юрия Селиванова и INADA Naoki в 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 C API для контекстных переменных 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).

Вернуться на верх