Что нового в 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
Улучшения в C API:
PEP 539, новый C API для локального хранилища потоков
Усовершенствования документации:
В этом выпуске представлены заметные улучшения производительности во многих областях. В разделе Оптимизация они подробно перечислены.
Список изменений, которые могут повлиять на совместимость с предыдущими версиями Python, приведен в разделе Перенос на Python 3.7.
Новые возможности¶
ОПТОСОЗ 563: Отложенная оценка аннотаций¶
Появление подсказок о типах в Python выявило две вопиющие проблемы с удобством использования, связанные с функциональностью аннотаций, добавленных в PEP 3107 и доработанных в PEP 526:
в аннотациях могли использоваться только те имена, которые уже были доступны в текущей области видимости, другими словами, они не поддерживали никаких прямых ссылок; и
аннотирование исходного кода отрицательно сказалось на времени запуска программ на Python.
Обе эти проблемы устраняются путем отсрочки вычисления аннотаций. Вместо компиляции кода, который выполняет выражения в аннотациях во время их определения, компилятор сохраняет аннотацию в виде строки, эквивалентной AST рассматриваемого выражения. При необходимости аннотации могут быть разрешены во время выполнения с помощью typing.get_type_hints()
. В общем случае, когда это не требуется, хранение аннотаций обходится дешевле (поскольку интерпретатор вставляет короткие строки) и сокращает время запуска.
С точки зрения удобства использования, аннотации теперь поддерживают прямые ссылки, что делает следующий синтаксис допустимым:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Поскольку это изменение нарушает совместимость, новое поведение должно быть включено для каждого модуля в Python 3.7 с использованием __future__
импорта:
from __future__ import annotations
Это станет значением по умолчанию в Python 3.10.
См.также
- PEP 563 – Отложенная оценка аннотаций
PEP, написанный и реализованный Лукашем Лангой.
PEP 538: Устаревшее приведение языковых стандартов C¶
Постоянной задачей в рамках серии Python 3 было определение разумной стратегии по умолчанию для обработки допущения о кодировке текста в формате «7-битный ASCII», которое в настоящее время подразумевается при использовании языка C или POSIX по умолчанию на платформах, отличных от Windows.
PEP 538 обновляет интерфейс командной строки интерпретатора по умолчанию, чтобы автоматически привести этот языковой стандарт к доступному языковому стандарту на основе UTF-8, как описано в документации к новой переменной окружения PYTHONCOERCECLOCALE
. Автоматическая настройка LC_CTYPE
таким образом означает, что как основной интерпретатор, так и поддерживающие языковые стандарты расширения C (такие как readline
) будут использовать UTF-8 в качестве кодировки текста по умолчанию, а не ASCII.
Определение поддержки платформы в PEP 11 также было обновлено, чтобы ограничить поддержку полной обработки текста соответствующим образом настроенными языками, не основанными на ASCII.
В рамках этого изменения обработчиком ошибок по умолчанию для stdin
и stdout
теперь является surrogateescape
(а не strict
) при использовании любой из определенных целевых локалей приведения (в настоящее время C.UTF-8
, C.utf8
, и UTF-8
). Обработчиком ошибок по умолчанию для stderr
остается backslashreplace
, независимо от языкового стандарта.
Приведение к языковому стандарту по умолчанию отключено, но для облегчения устранения проблем интеграции, потенциально связанных с языковыми стандартами, можно запросить явные предупреждения (которые выдаются непосредственно при stderr
), установив значение PYTHONCOERCECLOCALE=warn
. Этот параметр также приведет к тому, что среда выполнения Python выдаст предупреждение, если устаревший языковой стандарт C остается активным при инициализации основного интерпретатора.
Несмотря на то, что использование PEP 538 имеет преимущество в том, что оно также влияет на модули расширения (такие как GNU readline
), а также дочерние процессы (включая те, которые запускают приложения, отличные от Python, и более старые версии Python), оно имеет недостаток в том, что требует в работающей системе должна присутствовать подходящая целевая локаль. Чтобы лучше справиться со случаем, когда подходящая целевая локаль недоступна (как, например, в RHEL/CentOS 7), в Python 3.7 также реализована PEP 540: Принудительный режим выполнения в формате UTF-8.
См.также
- PEP 538 – Приведение устаревшего языкового стандарта C к языковому стандарту на основе UTF-8
PEP, написанный и реализованный Ником Когланом.
PEP 540: Принудительный режим выполнения в формате UTF-8¶
Новый параметр командной строки -X
utf8
и переменная среды PYTHONUTF8
могут быть использованы для включения функции Python UTF-8 Mode.
В режиме UTF-8 CPython игнорирует настройки языкового стандарта и по умолчанию использует кодировку UTF-8. Обработчики ошибок для потоков sys.stdin
и sys.stdout
имеют значение surrogateescape
.
Принудительный режим UTF-8 можно использовать для изменения поведения при обработке текста во встроенном интерпретаторе Python без изменения языковых настроек встраиваемого приложения.
Хотя преимущество режима PEP 540 UTF-8 заключается в том, что он работает независимо от того, какие языковые стандарты доступны в запущенной системе, его недостаток заключается в том, что он не влияет на модули расширения (такие как 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 использует новый тип : c:type:Py_tss_t вместо int для представления ключей TSS - непрозрачный тип, определение которого может зависеть от базовой реализации TLS. Следовательно, это позволит создавать CPython на платформах, где собственный ключ TLS определен таким образом, что его невозможно безопасно привести к int.
Обратите внимание, что на платформах, где собственный ключ TLS определен таким образом, что его невозможно безопасно преобразовать в int, все функции существующего TLS API будут недоступны и немедленно вернут ошибку. Это ясно указывает на то, что старый API не поддерживается на платформах, где его невозможно надежно использовать, и что не будет предпринято никаких усилий для добавления такой поддержки.
См.также
- PEP 539 – Новый C-API для локального хранилища потоков в CPython
ВДОХНОВЛЯЮЩИЙ текст написан Эриком М. Брэем; автор - Масаюки Ямамото.
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
, на соответствие соответствующим исходным файлам во время выполнения, но не делает этого для непроверенных 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
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. (Добавлено ИНАДОЙ Наоки в 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
и набор 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.ресурсы¶
Новый модуль importlib.resources
предоставляет несколько новых API и один новый ABC для доступа, открытия и чтения ресурсов внутри пакетов. Ресурсы примерно аналогичны файлам внутри пакетов, но они не обязательно должны быть реальными файлами в физической файловой системе. Загрузчики модулей могут предоставлять функцию get_resource_reader()
, которая возвращает экземпляр importlib.abc.ResourceReader
для поддержки этого нового API. Встроенные загрузчики путей к файлам и загрузчики zip-файлов поддерживают это.
Авторы: Барри Уоршоу и Бретт Кэннон в bpo-32248.
См.также
importlib_resources – серверный порт PyPI для более ранних версий Python.
Улучшенные модули¶
аргументированный анализ¶
Новый метод ArgumentParser.parse_intermixed_args()
позволяет смешивать параметры и позиционные аргументы. (Добавлено paul.j3 в bpo-14191.)
асинхронный¶
Модуль 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.)Новый предварительный
BufferedProtocol
класс позволяет реализовывать потоковые протоколы с ручным управлением буфером приема. (Добавлено Юрием Селивановым в bpo-32251.)Новая функция
asyncio.get_running_loop()
возвращает текущий цикл и создаетRuntimeError
, если цикл не запущен. Это отличается от функцииasyncio.get_event_loop()
, которая создает новый цикл обработки событий, если цикл не запущен. (Автор: Юрий Селиванов в статье bpo-32269.)Новый метод сопрограммы
StreamWriter.wait_closed()
позволяет дождаться закрытия streamwriter. Новый методStreamWriter.is_closing()
можно использовать для определения того, закрывается ли writer. (Добавлено Андреем Светловым в 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()
functions,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.
бинаскии¶
Функция b2a_uu()
теперь принимает необязательный аргумент ключевого слова backtick. Когда это значение равно true, нули обозначаются символом '`'
вместо пробелов. (Добавлено Сян Чжаном в bpo-30103.)
календарь¶
Класс HTMLCalendar
имеет новые атрибуты class, которые упрощают настройку CSS-классов в создаваемом HTML-календаре. ((Добавлено Озом Тирамом в bpo-30095.)
коллекции¶
collections.namedtuple()
теперь поддерживаются значения по умолчанию. (Добавлено Раймондом Хеттингером в bpo-32320.)
компилировать все¶
compileall.compile_dir()
узнал о новом параметре invalidation_mode, который можно использовать для включения hash-based .pyc invalidation. Режим аннулирования также можно указать в командной строке с помощью нового аргумента --invalidation-mode
. (Автор: Бенджамин Питерсон в статье bpo-31650.)
параллельные фьючерсы¶
ProcessPoolExecutor
и ThreadPoolExecutor
теперь поддерживают новые аргументы конструктора initializer и initargs. (Добавлено Антуаном Питру в bpo-21423.)
Параметр ProcessPoolExecutor
теперь может принимать контекст многопроцессорной обработки с помощью нового аргумента mp_context. (Добавлено Томасом Моро в bpo-31540.)
контекстная библиотека¶
Новый nullcontext()
является более простым и быстрым контекстным менеджером без операций, чем ExitStack
. (Автор Джесси-Баккер в bpo-10049).
Новые asynccontextmanager()
, AbstractAsyncContextManager
, и AsyncExitStack
были добавлены в дополнение к их синхронным аналогам. (Материалы предоставлены Джелле Зейлстрой в bpo-29679 и bpo-30241, а также Александром Мором и Ильей Кулаковым в bpo-29302.)
Профайл¶
Командная строка cProfile
теперь принимает -m module_name
в качестве альтернативы пути к скрипту. (Добавлено Саньямом Хураной в bpo-21862.)
склеп¶
Модуль crypt
теперь поддерживает метод хэширования Blowfish. (Добавлено Сергеем Сторчакой в bpo-31664.)
Функция mksalt()
теперь позволяет указывать количество раундов для хэширования. (Добавлено Сергеем Сторчакой в bpo-31702.)
дата и время¶
Новый метод datetime.fromisoformat()
создает объект datetime
из строки в одном из форматов, выводимых с помощью datetime.isoformat()
. (Добавлено Полом Гансслом в bpo-15873.)
Класс tzinfo
теперь поддерживает субминутные смещения. (Добавлено Александром Белопольским в bpo-5288.)
дбм¶
dbm.dumb
теперь поддерживается чтение файлов, доступных только для чтения, и больше не записывается в индексный файл, если он не изменен.
десятичный¶
Модуль decimal
теперь использует context variables для хранения десятичного контекста. (Добавлено Юрием Селивановым в bpo-32630.)
дис¶
Функция dis()
теперь способна дизассемблировать вложенные объекты кода (код понимания, генераторные выражения и вложенные функции, а также код, используемый для создания вложенных классов). Максимальная глубина рекурсии дизассемблирования регулируется новым параметром depth. (Автор - Сергей Сторчака в bpo-11822.)
дистрибутивы¶
README.rst
теперь включен в список дистрибутивов стандарта Readme и, следовательно, включен в исходные тексты дистрибутивов. (Добавлено Райаном Гонсалесом в bpo-11913.)
перечисление¶
Enum
изучено новое свойство класса _ignore_
, которое позволяет выводить имена свойств, которые не должны становиться элементами перечисления. (Добавлено Итаном Фурманом в bpo-31801.)
В Python 3.8 попытка проверить наличие объектов, отличных от Enum, в классах Enum
приведет к появлению TypeError
(например, 1 in Color
); аналогично, попытка проверить наличие объектов, отличных от Flag, в классе Flag
элемент вызовет TypeError
(например, 1 in Perm.RW
); в настоящее время обе операции возвращают вместо этого False
и являются устаревшими. (Автор: Итан Фурман в bpo-33217.)
функциональные средства¶
functools.singledispatch`<< < 0>>> now supports registering implementations using type annotations. (Contributed by Lukasz Langa in :issue:`32227()
.)
gc¶
Новая функция gc.freeze()
позволяет замораживать все объекты, отслеживаемые сборщиком мусора, и исключать их из будущих коллекций. Ее можно использовать перед вызовом POSIX fork()
, чтобы упростить копирование при записи в GC или ускорить сбор. Новые функции gc.unfreeze()
отменяют эту операцию. Кроме того, gc.get_freeze_count()
можно использовать для получения количества замороженных объектов. (Добавлено Ли Цзекуном в bpo-31558).
hmac (ВМС)¶
Модуль hmac
теперь имеет оптимизированную функцию однократного запуска digest()
, которая работает в три раза быстрее, чем HMAC()
. (Автор Кристиан Хеймс в bpo-32433.)
http.клиент¶
HTTPConnection
и HTTPSConnection
теперь поддерживают новый параметр размер блока для повышения производительности загрузки. (Добавлено Ниром Соффером в bpo-31945.)
http.сервер¶
SimpleHTTPRequestHandler
теперь поддерживается заголовок HTTP If-Modified-Since
. Сервер возвращает статус ответа 304, если целевой файл не был изменен по истечении времени, указанного в заголовке. (Автор: Пьер Квентель в статье bpo-29654.)
SimpleHTTPRequestHandler
принимает новый аргумент directory в дополнение к новому аргументу командной строки --directory
. С этим параметром сервер обслуживает указанный каталог, по умолчанию он использует текущий рабочий каталог. ((Материалы предоставлены Стефаном Виртелем и Жюльеном Паларом в bpo-28707.)
Новый класс ThreadingHTTPServer
использует потоки для обработки запросов с использованием ThreadingMixin
. Он используется, когда http.server
запускается с помощью -m
. (Автор: Жюльен Палар в статье bpo-31639.)
idlelib и ХОЛОСТОЙ ход¶
Несколько исправлений для автозавершения. (Добавлено Луи Лу в bpo-15786.)
Обозреватель модулей (в меню «Файл», ранее называвшемся «Обозреватель классов») теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Авторы: Гильерме Поло, Шерил Сабелла и Терри Ян Риди в bpo-1612262.)
Диалоговое окно настроек (Options, Configure IDLE) было частично переписано, чтобы улучшить внешний вид и функциональность. (Авторы - Шерил Сабелла и Терри Джен Риди в нескольких выпусках).
Образец шрифта теперь включает в себя набор нелатинских символов, чтобы пользователи могли лучше видеть эффект от выбора определенного шрифта. (Автор: Терри Ян Риди в bpo-13802.) Образец можно отредактировать, включив в него другие символы. (Автор - Сергей Сторчака в bpo-31860.)
Функции IDLE, ранее реализованные в виде расширений, были переопределены как обычные функции. Их настройки были перенесены со вкладки «Расширения» на другие вкладки диалогового окна. (Авторы Чарльз Вольгангер и Терри Ян Риди в bpo-27099).
Изменен параметр контекста кода редактора. В окне отображаются все контекстные строки, вплоть до максимального количества строк. Щелчок по контекстной строке приводит к переходу редактора к этой строке. Цвета контекста для пользовательских тем добавлены на вкладку «Основные моменты» диалогового окна настроек. (Авторы: Шерил Сабелла и Терри Джен Риди в статье bpo-33642, bpo-33768, и bpo-33679.)
В Windows новый вызов API сообщает Windows, что tk масштабируется с учетом DPI. В Windows 8.1+ или 10, при неизменных свойствах совместимости с DPI в двоичном коде Python и разрешении монитора более 96 точек на дюйм, это должно сделать текст и линии более четкими. В противном случае это не возымеет никакого эффекта. (Автор: Терри Джен Риди в bpo-33656.)
Новое в версии 3.7.1:
Вывод в N строках (по умолчанию 50) сокращается до размера кнопки. N можно изменить в разделе PyShell на странице «Общие» диалогового окна настроек. Меньшее количество строк, но, возможно, и более длинных, можно сжать, щелкнув правой кнопкой мыши на выводе. Сжатый вывод можно развернуть на месте, дважды щелкнув по кнопке, или перенести в буфер обмена, или в отдельное окно, щелкнув по кнопке правой кнопкой мыши. (Добавлено Tal Einat в bpo-1529353.)
Приведенные выше изменения были перенесены в версии обслуживания 3.6.
НОВОЕ в версии 3.7.4:
Добавьте «Запустить настроенный» в меню «Выполнить», чтобы запустить модуль с настроенными настройками. Все введенные аргументы командной строки добавляются в файл sys.argv. Они снова отображаются в окне для следующего настроенного запуска. Также можно отключить обычный перезапуск основного модуля Shell. (Авторы: Шерил Сабелла, Терри Джен Риди и другие в bpo-5680 и bpo-37627.)
Новое в версии 3.7.5:
Добавьте дополнительные номера строк для незанятых окон редактора. Окна открываются без номеров строк, если не указано иное на вкладке Общие диалогового окна настройки. Номера строк для существующего окна отображаются и скрываются в меню Параметров. (Материалы предоставлены Тал Эйнат и Саймадхавом Хебликаром в bpo-17535.)
импортный файл¶
importlib.abc.ResourceReader
ABC был введен для поддержки загрузки ресурсов из пакетов. Смотрите также importlib.ресурсы. (Авторы - Барри Уоршоу, Бретт Кэннон в bpo-32248).
importlib.reload()
теперь вызывает ModuleNotFoundError
, если в модуле отсутствует спецификация. (Добавлено Гарвитом Хатри в bpo-29851.)
importlib.find_spec()
теперь вызывает ModuleNotFoundError
вместо AttributeError
, если указанный родительский модуль не является пакетом (т.е. не имеет атрибута __path__
). (Предоставлено Миланом Оберкирхом в bpo-30436.)
Новый importlib.source_hash()
может быть использован для вычисления хэша переданного источника. A hash-based .pyc file вставляет значение, возвращаемое этой функцией.
ио¶
Новый метод TextIOWrapper.reconfigure()
может быть использован для перенастройки текстового потока с учетом новых настроек. (Авторы: Антуан Питру в bpo-30526 и ИНАДА Наоки в bpo-15216).
ip-адрес¶
Новые subnet_of()
и supernet_of()
методы ipaddress.IPv6Network
и ipaddress.IPv4Network
могут быть использованы для тестирования защиты сети. ((Материалы предоставлены Мишелем Альбертом и Шерил Сабеллой в bpo-20825.)
итеративные инструменты¶
itertools.islice()
теперь принимает integer-like objects
в качестве аргументов start, stop и slice. (Добавлено Уиллом Робертсом в bpo-30537.)
место действия¶
Новый аргумент monetary для locale.format_string()
может быть использован для того, чтобы при преобразовании использовались денежные разделители тысяч и группирующие строки. (Добавлено Гарвитом в bpo-10379.)
Функция locale.getpreferredencoding()
теперь всегда возвращает 'UTF-8'
на Android или в режиме forced UTF-8 mode.
регистрация¶
Logger
экземпляры теперь можно мариновать. (Добавлено Винаем Саджипом в bpo-30520.)
Новый метод StreamHandler.setStream()
может быть использован для замены потока регистратора после создания обработчика. (Добавлено Винаем Саджипом в bpo-30522.)
Теперь можно указывать ключевые аргументы для конструкторов обработчиков в конфигурации, передаваемой в logging.config.fileConfig()
. (Добавлено Престоном Ландерсом в bpo-31080.)
математика¶
Новая функция math.remainder()
реализует операцию с остатком в соответствии с IEEE 754. (Добавлено Марком Дикинсоном в bpo-29962.)
миметипы¶
MIME-тип файла .bmp был изменен с 'image/x-ms-bmp'
на 'image/bmp'
. (Добавлено Нитишем Чандрой в bpo-22589.)
msilib¶
Новый метод Database.Close()
может быть использован для закрытия базы данных MSI. (Предоставлено Беркером Пексагом в статье bpo-20486.)
многопроцессорная обработка¶
Новый метод Process.close()
явно закрывает объект process и освобождает все связанные с ним ресурсы. ValueError
вызывается, если базовый процесс все еще выполняется. (Добавлено Антуаном Питру в bpo-30596).
Новый метод Process.kill()
может быть использован для завершения процесса с помощью сигнала SIGKILL
в Unix. (Добавлено Витором Перейрой в bpo-30794.)
Недемонические потоки, созданные с помощью Process
, теперь объединяются при выходе из процесса. (Добавлено Антуаном Питру в bpo-18966.)
ос¶
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.)
библиотека путей¶
Новый метод 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
. (Добавлено Feanil Patel в bpo-31128.)
очередь¶
Новый класс SimpleQueue
представляет собой неограниченную очередь FIFO. (Добавлено Антуаном Питру в статье bpo-14976.)
ре¶
Флаги 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
class к классам socketserver.ForkingMixIn
и socketserver.ThreadingMixIn
. Установите для атрибута class значение 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. Новое исключение содержит дополнительную информацию. Проверку имени хоста можно настроить с помощью 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-label ("xn--pythn-mua.org"
),, а не в форме U-label ("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()
возвращает текущую глубину отслеживания происхождения сопрограммы, установленную в new 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.ttk.Spinbox
. (Добавлено Аланом Муром в bpo-32585.)
трассировочный блок¶
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
была обновлена для использования Unicode 11. (Автор - Бенджамин Питерсон.)
единичный тест¶
Новая опция командной строки -k
позволяет фильтровать тесты по подстроке имени или шаблону, подобному оболочке Unix. Например, python -m unittest -k foo
выполняется foo_tests.SomeTest.test_something
, bar_tests.SomeTest.test_foo
,, но не bar_tests.FooTest.test_something
. (Добавлено Йонасом Хаагом в bpo-32071.)
единичный тест.имитация¶
Атрибуты sentinel
теперь сохраняют свою идентичность, когда они равны copied
или pickled
. (Добавлено Сергеем Сторчакой в bpo-20804.)
Новая функция seal()
позволяет запечатывать экземпляры Mock
, что запрещает дальнейшее создание макетов атрибутов. Печать применяется рекурсивно ко всем атрибутам, которые сами по себе являются макетами. (Автор Марио Корчеро в статье bpo-30541.)
urllib.синтаксический анализ¶
urllib.parse.quote()
был обновлен с RFC 2396 до RFC 3986, добавив ~
к набору символов, которые по умолчанию никогда не заключаются в кавычки. (Материалы предоставлены Кристианом Теуном и Ратнадипом Дебнатом в bpo-16285.)
ууу¶
Функция uu.encode()
теперь принимает необязательный аргумент ключевого слова backtick. Когда это значение равно true, нули обозначаются символом '`'
вместо пробелов. (Добавлено Сян Чжаном в bpo-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: Отображение предупреждения об отмене в __main__. (Автор: Ник Коглан в bpo-31975).
xml-код¶
В качестве защиты от DTD и поиска внешних объектов модули xml.dom.minidom
и xml.sax
больше не обрабатывают внешние объекты по умолчанию. (Автор Кристиан Хеймс в статье gh-61441).
xml.это дерево¶
ElementPath предикаты в методах find()
теперь могут сравнивать текст текущего узла с [. = "text"]
, а не только текст в дочерних элементах. Предикаты также позволяют добавлять пробелы для лучшей читаемости. (Автор: Стефан Бенель в статье bpo-31648.)
xmlrpc.сервер¶
SimpleXMLRPCDispatcher.register_function
теперь можно использовать в качестве декоратора. (Добавлено Сян Чжаном в bpo-7769.)
zipapp¶
Функция create_archive()
теперь принимает необязательный аргумент filter, позволяющий пользователю выбирать, какие файлы следует включить в архив. (Добавлено Ирменом де Йонгом в bpo-31072.)
Функция create_archive()
теперь принимает необязательный аргумент compressed для создания сжатого архива. Также добавлена опция командной строки --compress
для поддержки сжатия. (Автор Чжимин Ван в bpo-31638).
почтовый файл¶
ZipFile
теперь принимает новый параметр compresslevel для управления уровнем сжатия. (Добавлено Бо Бейлсом в bpo-21417.)
Подкаталоги в архивах, созданных ZipFile
, теперь хранятся в алфавитном порядке. (Автор Бернхард М. Видеманн в bpo-30693.)
Изменения в C API¶
Реализован новый API для локального хранилища потоков. Смотрите PEP 539: Новый C API для локального хранилища потоков для получения общего обзора и API хранилища для конкретных потоков (TSS) для получения полной ссылки. (Добавлено Масаюки Ямамото в bpo-25658).
Новая функциональность context variables предоставляет ряд возможностей new C APIs.
Функция new PyImport_GetModule()
возвращает ранее импортированный модуль с заданным именем. (Добавлено Эриком Сноу в bpo-28411.)
Новый макрос Py_RETURN_RICHCOMPARE
упрощает написание расширенных функций сравнения. ((Добавлено Петром Викторином в bpo-23699.)
Новый макрос Py_UNREACHABLE
можно использовать для обозначения недоступных путей к коду. (Добавлено Барри Варшавой в bpo-31338.)
В tracemalloc
теперь доступен C API с помощью новых функций PyTraceMalloc_Track()
и PyTraceMalloc_Untrack()
. (Добавлено Виктором Стиннером в bpo-30054.)
Новые статические маркеры import__find__load__start()
и import__find__load__done()
можно использовать для отслеживания импорта модулей. (Автор Кристиан Хеймс в bpo-31574).
Поля name
и doc
структур PyMemberDef
, PyGetSetDef
, PyStructSequence_Field
, PyStructSequence_Desc
, и wrapperbase
теперь имеют тип const char *
, а не char *
. (Автор - Сергей Сторчака в bpo-28761.)
Результат PyUnicode_AsUTF8AndSize()
и PyUnicode_AsUTF8()
теперь имеет тип const char *
, а не char *
. (Добавлено Сергеем Сторчакой в bpo-28769.)
Результатом выполнения PyMapping_Keys()
, PyMapping_Values()
и PyMapping_Items()
теперь всегда является список, а не список или кортеж. (Автор: Орен Мильман в bpo-28280.)
Добавлены функции : c:func: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 для часовых поясов с помощью конструкторов часовых поясов:c:func: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. Установленная копия libffi теперь требуется при сборке _ctypes
на таких платформах. (Автор: Закари Уэр в статье bpo-27979.)
Процесс сборки Windows больше не зависит от использования Subversion внешних источников, вместо этого для загрузки zip-файлов с GitHub используется скрипт на Python. Если Python 3.6 не найден в системе (через py -3.6
), для загрузки копии 32-разрядного Python для этой цели используется NuGet. (Добавлено Закари Уэром в bpo-30450.)
Для модуля ssl
требуется libssl, совместимый с OpenSSL 1.0.2 или 1.1. Срок службы OpenSSL 1.0.1 истек в 2016-12-31 и больше не поддерживается. LibreSSL также временно не поддерживается. В версиях LibreSSL до версии 2.6.4 отсутствуют необходимые API для OpenSSL 1.0.2.
Оптимизация¶
Накладные расходы на вызов многих методов различных стандартных библиотечных классов, реализованных на C, были значительно снижены за счет переноса большего количества кода для использования соглашения METH_FASTCALL
. (Автор: Виктор Стиннер в статье bpo-29300, bpo-29507, bpo-29452, и bpo-29286.)
Различные оптимизации позволили сократить время запуска Python на 10% в Linux и до 30% в Mac OS. (Авторы: Виктор Стиннер, ИНАДА Наоки в bpo-29585 и Иван Левкивский в bpo-31333.)
Вызовы методов теперь выполняются на 20% быстрее благодаря изменениям в байт-коде, которые позволяют избежать создания связанных экземпляров методов. (Авторы: Юрий Селиванов и ИНАДА Наоки в bpo-26110.)
Модуль asyncio
получил ряд заметных улучшений для часто используемых функций:
Функция
asyncio.get_event_loop()
была переопределена на языке Си, чтобы ускорить ее в 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__()
. (Добавлено ИНАДОЙ Наоки в bpo-32544.)
Поиск определенных символов Юникода (например, украинской заглавной буквы «Є») в строке выполнялся в 25 раз медленнее, чем поиск других символов. Теперь в худшем случае он выполняется всего в 3 раза медленнее. (Добавлено Сергеем Сторчакой в bpo-24821.)
Фабрика collections.namedtuple()
была переработана, чтобы ускорить создание именованных кортежей в 4-6 раз. (Автор: Джелле Зейлстра, с дополнительными улучшениями, внесенными Инадой Наоки, Сергеем Сторчакой и Раймондом Хеттингером в bpo-28638.)
date.fromordinal()
и date.fromtimestamp()
теперь работают на 30% быстрее в обычном случае. (Добавлено Полом Гансслом в bpo-32403.)
Функция os.fwalk()
теперь работает в 2 раза быстрее благодаря использованию os.scandir()
. (Добавлено Сергеем Сторчакой в bpo-25996.)
Скорость работы функции shutil.rmtree()
была увеличена на 20-40% благодаря использованию функции os.scandir()
. (Автор Сергей Сторчака в статье bpo-28564).
Оптимизировано сопоставление и поиск по regular expressions
без учета регистра. Поиск по некоторым шаблонам теперь может выполняться в 20 раз быстрее. (Добавлено Сергеем Сторчакой в bpo-30285.)
re.compile()
теперь преобразует параметр flags
в объект int, если он равен RegexFlag
. Это не так быстро, как в Python 3.5, и примерно на 10% быстрее, чем в Python 3.6, в зависимости от шаблона. (Автор - ИНАДА Наоки в 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. Это устраняет проблему с повреждением sadists, которая заканчивалась байтом, эквивалентным CR. (Автор Бо Бейлз в статье bpo-32304.)
Устаревшее поведение Python¶
Выражения Yield (как yield
, так и yield from
) теперь не используются в понятиях и генераторных выражениях (за исключением повторяемого выражения в крайнем левом предложении for
). Это гарантирует, что вычисления всегда немедленно возвращают контейнер соответствующего типа (вместо того, чтобы потенциально возвращать объект 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.openfp()
устарел и будет удален в Python 3.9. Вместо него используйте aifc.open()
. (Автор Брайан Кертин в bpo-31985).
асинхронный¶
Поддержка прямого 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.dumb
теперь поддерживается чтение файлов, доступных только для чтения, и больше не записывается в индексный файл, если он не изменен. Предупреждение об устаревании теперь выдается, если индексный файл отсутствует и создается заново в режимах 'r'
и 'w'
(это будет ошибкой в будущих версиях Python). (Автор - Сергей Сторчака в bpo-28847.)
перечисление¶
В Python 3.8 попытка проверить наличие объектов, отличных от Enum, в классах Enum
приведет к появлению TypeError
(например, 1 in Color
); аналогично, попытка проверить наличие объектов, отличных от Flag, в классе Flag
элемент вызовет TypeError
(например, 1 in Perm.RW
); в настоящее время обе операции возвращают вместо этого False
. (Автор: Итан Фурман в bpo-33217.)
получить текст¶
Использование нецелого значения для выбора формы множественного числа в gettext
теперь устарело. Это никогда не работало корректно. (Добавлено Сергеем Сторчакой в bpo-28692.)
импортный файл¶
Методы 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
теперь устарел и будет удален в 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).
Устаревшие функции и типы C API¶
Функция PySlice_GetIndicesEx()
считается устаревшим и заменяется макросом, если Py_LIMITED_API
не задано или установлено значение в диапазоне от 0x03050400
до 0x03060000
(не включительно), или если 0x03060100
или выше. (Автор - Сергей Сторчака в bpo-27867.)
PyOS_AfterFork()
считается устаревшим. Вместо этого используйте PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
или PyOS_AfterFork_Child()
. (Автор: Антуан Питру в статье bpo-16500.)
Удаление поддержки платформы¶
FreeBSD 9 и более ранних версий больше официально не поддерживается.
Ожидается, что для полной поддержки 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.Функция
ntpath.splitunc()
была признана устаревшей в Python 3.1 и теперь удалена. Вместо нее используйтеsplitdrive()
.collections.namedtuple()
больше не поддерживается параметр verbose или атрибут_source
, которые отображали сгенерированный исходный код для класса namedtuple. Это было частью оптимизации, направленной на ускорение создания класса. (Автор: Джелле Зейлстра, с дополнительными улучшениями, внесенными Инадой Наоки, Сергеем Сторчакой и Раймондом Хеттингером в bpo-28638.)Функции
bool()
,float()
,list()
иtuple()
больше не принимают аргументы по ключевым словам. Первый аргументint()
теперь может передаваться только как позиционный аргумент.Удалены ранее устаревшие классы в Python 2.4
Plist
,Dict
и_InternalDict
в модулеplistlib
. Значения Dict в результате выполнения функцийreadPlist()
иreadPlistFromBytes()
теперь являются обычными dicts. Вы больше не можете использовать доступ к атрибутам для доступа к элементам этих словарей.Функция
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 и изменил API 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-разрядный python был бы в противном случае был использован. Если указанная версия недоступна py.exe произойдет вывод ошибки. (Добавлено Стивом Барнсом в bpo-30291.)
Программу запуска можно запустить как py -0
, чтобы получить список установленных pythons, по умолчанию помеченных звездочкой. При запуске py -0p
будут указаны пути. Если py запускается со спецификатором версии, который не может быть сопоставлен, он также выведет *краткий список доступных спецификаторов. (Добавлено Стивом Барнсом в bpo-30362.)
Перенос на Python 3.7¶
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении Python¶
Имена
async
иawait
теперь являются зарезервированными ключевыми словами. Код, использующий эти имена в качестве идентификаторов, теперь будет генерироватьSyntaxError
. (Добавлено Джелле Зейлстрой в bpo-30406.)PEP 479 включен для всего кода в Python 3.7, что означает, что
StopIteration
исключения, создаваемые прямо или косвенно в сопрограммах и генераторах, преобразуются вRuntimeError
исключения. (Автор: Юрий Селиванов в статье bpo-32670.)object.__aiter__()
методы больше не могут быть объявлены как асинхронные. (Добавлено Юрием Селивановым в bpo-31709.)Из-за недосмотра в более ранних версиях Python ошибочно использовался следующий синтаксис:
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 теперь корректно генерирует
SyntaxError
, поскольку выражение генератора всегда должно быть непосредственно внутри набора круглых скобок и не может содержать запятую с обеих сторон, а дублирование круглых скобок может быть опущено только при вызовах. (Автор - Сергей Сторчака в bpo-32012 и bpo-32023.)При использовании параметра
-m
исходный рабочий каталог теперь добавляется вsys.path
, а не в пустую строку (которая динамически обозначала текущий рабочий каталог во время каждого импорта). Любые программы, которые проверяют наличие пустой строки или иным образом полагаются на предыдущее поведение, необходимо соответствующим образом обновить (например, также проверив наличиеos.getcwd()
илиos.path.dirname(__main__.__file__)
, в зависимости от того, почему код проверял наличие пустой строки в первом случае место).
Изменения в Python API¶
socketserver.ThreadingMixIn.server_close()
теперь ожидает завершения работы всех потоков, не связанных с демонами. Установите для нового атрибутаsocketserver.ThreadingMixIn.block_on_close
class значениеFalse
, чтобы получить поведение, аналогичное поведению до версии 3.7. (Автор - Виктор Стиннер в bpo-31233 и bpo-33540.)socketserver.ForkingMixIn.server_close()
теперь ожидает завершения всех дочерних процессов. Установите для нового атрибутаsocketserver.ForkingMixIn.block_on_close
class значение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
изменено, чтобы включить в выходные данные ключевое слово arguments. (Добавлено Уткаршем Упадхьяем в 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()
, чтобы экранировать только специальные символы регулярных выражений, вместо того, чтобы экранировать все символы, кроме букв ASCII, цифр и'_'
. (Добавлено Сергеем Сторчакой в bpo-29995.)tracemalloc.Traceback
кадры теперь отсортированы от самых старых к самым свежим, чтобы лучше соответствоватьtraceback
. (Добавлено Джесси Баккером в bpo-32121.)В операционных системах, поддерживающих битовые флаги
socket.SOCK_NONBLOCK
илиsocket.SOCK_CLOEXEC
, они больше не применяются кsocket.type
. Таким образом, проверки типаif sock.type == socket.SOCK_STREAM
работают должным образом на всех платформах. (Автор: Юрий Селиванов в статье bpo-32331.)В Windows значение по умолчанию для аргумента close_fds
subprocess.Popen
было изменено сFalse
наTrue
при перенаправлении стандартных дескрипторов. Если ранее вы зависели от наследования дескрипторов при использованииsubprocess.Popen
со стандартным перенаправлением ввода-вывода, вам придется передатьclose_fds=False
, чтобы сохранить предыдущее поведение, или использоватьSTARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
- который неявно влияет наimportlib.invalidate_caches()
- теперь удаляет записи вsys.path_importer_cache
, для которых установлено значениеNone
. (Добавлено Бреттом Кэнноном в bpo-33169.)В
asyncio
,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop.getaddrinfo()
,loop.getnameinfo()
были изменены соответствующие методы сопрограммы в соответствии с их документацией. Ранее эти методы возвращалиasyncio.Future
экземпляров. (Добавлено Юрием Селивановым в bpo-32327.)asyncio.Server.sockets
теперь возвращает копию внутреннего списка серверных сокетов, вместо того, чтобы возвращать его напрямую. (Добавлено Юрием Селивановым в bpo-32662.)Struct.format
теперь является экземпляромstr
вместо экземпляраbytes
. (Добавлено Виктором Стиннером в bpo-21071.)argparse
синтаксические анализаторы теперь можно сделать обязательными, передавrequired=True
вArgumentParser.add_subparsers()
. (Добавлено Энтони Соттилом в bpo-26510.)ast.literal_eval()
теперь более строгий режим. Сложение и вычитание произвольных чисел больше не допускается. (Добавлено Сергеем Сторчакой в bpo-31778.)Calendar.itermonthdates
теперь будет последовательно вызывать исключение, когда дата выходит за пределы диапазона от0001-01-01
до9999-12-31
. Для поддержки приложений, которые не могут допускать такие исключения, можно использовать новые методыCalendar.itermonthdays3
иCalendar.itermonthdays4
. Новые методы возвращают кортежи и не ограничены диапазоном, поддерживаемымdatetime.date
. (Автор: Александр Белопольский в bpo-28292.)collections.ChainMap
теперь сохраняется порядок базовых отображений. (Добавлено Раймондом Хеттингером в bpo-32792.)Метод
submit()
изconcurrent.futures.ThreadPoolExecutor
иconcurrent.futures.ProcessPoolExecutor
теперь вызываетRuntimeError
, если вызывается во время завершения работы интерпретатора. (Добавлено Марком Немеком в bpo-33097.)Конструктор
configparser.ConfigParser
теперь используетread_dict()
для обработки значений по умолчанию, что делает его поведение согласованным с остальной частью синтаксического анализатора. Нестроковые ключи и значения в словаре defaults теперь неявно преобразуются в строки. (Автор Джеймс Токнелл в bpo-23835.)Были удалены некоторые недокументированные внутренние импортные файлы. Одним из примеров является то, что
os.errno
больше недоступен; вместо этого используйтеimport errno
напрямую. Обратите внимание, что такой недокументированный внутренний импорт может быть удален в любое время без предварительного уведомления, даже в микро-версиях.
Изменения в C API¶
Функция PySlice_GetIndicesEx()
считается небезопасной для последовательностей с изменяемым размером. Если индексы фрагментов являются не экземплярами int
, а объектами, реализующими метод __index__()
, размер последовательности может быть изменен после передачи ее длины в PySlice_GetIndicesEx()
. Это может привести к возврату индексов, не соответствующих длине последовательности. Чтобы избежать возможных проблем, используйте новые функции PySlice_Unpack()
и PySlice_AdjustIndices()
. (Добавлено Сергеем Сторчакой в bpo-27867.)
Изменения в байт-коде CPython¶
Появилось два новых кода операций: LOAD_METHOD
и CALL_METHOD
. (Добавлено Юрием Селивановым и ИНАДОЙ Наоки в bpo-26110.)
Код операции STORE_ANNOTATION
был удален. (Добавлено Марком Шенноном в bpo-32550.)
Изменения только для Windows¶
Файл, используемый для переопределения sys.path
, теперь называется <python-executable>._pth
вместо 'sys.path'
. Дополнительную информацию смотрите в Поиск модулей. (Автор: Стив Дауэр в bpo-28137.)
Другие изменения в реализации CPython¶
В рамках подготовки к возможным будущим изменениям в общедоступном API инициализации среды выполнения CPython (первоначальный, но несколько устаревший черновик смотрите в PEP 432) внутренняя логика запуска и управления конфигурацией CPython была значительно переработана. Хотя эти обновления предназначены для того, чтобы быть полностью прозрачными как для встраиваемых приложений, так и для пользователей обычного CPython CLI, они упоминаются здесь, поскольку рефакторинг изменяет внутренний порядок различных операций при запуске интерпретатора и, следовательно, может выявить ранее скрытые дефекты либо во встраиваемых приложениях, либо в самом CPython. (Первоначально статья была опубликована Ником Когланом и Эриком Сноу в рамках bpo-22257, а затем дополнена Ником, Эриком и Виктором Стиннером в ряде других выпусков). Некоторые известные детали затронули:
PySys_AddWarnOptionUnicode()
в настоящее время недоступен для встраиваемых приложений из-за необходимости создания объекта Unicode перед вызовомPy_Initialize
. Вместо этого используйтеPySys_AddWarnOption()
.фильтры предупреждений, добавленные встраиваемым приложением с помощью
PySys_AddWarnOption()
, теперь должны более последовательно иметь приоритет над фильтрами по умолчанию, установленными интерпретатором
В связи с изменениями в настройке фильтров предупреждений по умолчанию, значение Py_BytesWarningFlag
, превышающее единицу, больше не является достаточным как для отправки BytesWarning
сообщений, так и для их преобразования в исключения. Вместо этого необходимо установить флаг (чтобы в первую очередь выводились предупреждения) и добавить явный фильтр предупреждений error::BytesWarning
для преобразования их в исключения.
Из-за изменения способа обработки строк документации компилятором неявный return None
в теле функции, состоящем исключительно из строки документации, теперь помечается как встречающийся в той же строке, что и строка документации, а не в строке заголовка функции.
Текущее состояние исключения было перенесено из объекта frame в совместную процедуру. Это упростило интерпретатор и исправило пару малоизвестных ошибок, связанных с заменой состояния исключения при входе в генератор или выходе из него. (Добавлено Марком Шенноном в 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.)
Заметные изменения в 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 цифр в виде строки.