Что нового в Python 3.7¶
- Редактор:
Элвис Пранскевичус <elvis@magic.io>
В этой статье рассказывается о новых возможностях в Python 3.7 по сравнению с 3.6. Python 3.7 был выпущен 27 июня 2018 года. Для получения полной информации смотрите changelog.
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 563, отложена оценка аннотаций типов.
Изменения синтаксиса, несовместимые с обратным ходом событий:
Новые библиотечные модули:
Новые встроенные функции:
PEP 553, новая функция
breakpoint()
.
Улучшение модели данных Python:
PEP 562, настройка доступа к атрибутам модуля.
PEP 560, основная поддержка модуля типизации и общих типов.
характер сохранения порядка вставки для объектов dict has been declared должен стать официальной частью спецификации языка Python.
Значительные улучшения в стандартной библиотеке:
Модуль
asyncio
получил новые возможности, значительные usability and performance improvements.Модуль
time
получил поддержку functions with nanosecond resolution.
Улучшения в реализации CPython:
Отказ от использования ASCII в качестве кодировки текста по умолчанию:
PEP 552, детерминированный .pycs
PEP 565, улучшенная обработка
DeprecationWarning
.
Улучшения в API на языке C:
PEP 539, новый C API для локального хранения данных в потоке
Улучшение документации:
В этом выпуске заметно улучшена производительность во многих областях. В разделе Оптимизации они перечислены подробно.
Список изменений, которые могут повлиять на совместимость с предыдущими выпусками Python, см. в разделе Переход на Python 3.7.
Новые возможности¶
PEP 563: Отложенная оценка аннотаций¶
Появление подсказок типов в Python выявило две вопиющие проблемы с функциональностью аннотаций, добавленные в PEP 3107 и доработанные в PEP 526:
аннотации могли использовать только те имена, которые уже были доступны в текущей области видимости, другими словами, они не поддерживали прямые ссылки любого рода; и
аннотирование исходного кода негативно сказалось на времени запуска программ на Python.
Обе эти проблемы решаются путем откладывания оценки аннотаций. Вместо того чтобы компилировать код, выполняющий выражения в аннотациях во время их определения, компилятор хранит аннотацию в строковой форме, эквивалентной AST данного выражения. При необходимости аннотации могут быть разрешены во время выполнения с помощью typing.get_type_hints()
. В общем случае, когда это не требуется, аннотации дешевле хранить (поскольку короткие строки интерпритируются интерпретатором) и быстрее запускать.
С точки зрения удобства использования, аннотации теперь поддерживают прямые ссылки, что позволяет использовать следующий синтаксис:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Поскольку это изменение нарушает совместимость, в Python 3.7 новое поведение должно быть включено на основе каждого модуля с помощью __future__
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.
Добавлены три новых перевода:
Японский: https://docs.python.org/ja/
Французский: https://docs.python.org/fr/
Корейский: https://docs.python.org/ko/
См.также
- 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“).Измените
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 цифр в строковой форме.