Что нового в Python 3.7
Редактор: | Элвис Пранскевичус |
---|
В данной статье объясняются новые возможности Python 3.7 по сравнению с 3.6. Python 3.7 был выпущен 27 июня 2018 г. Для получения полной информации см. новости.
Резюме. Основные моменты релиза
Новые возможности синтаксиса:
- PEP 563, отложенное вычисление аннотаций типов.
Обратно несовместимые изменения синтаксиса:
Новые модули библиотеки:
contextvars
: PEP 567 – Контекстные переменныеdataclasses
: PEP 557 – Дата классы- importlib.resources
Новые встроенные функции:
- PEP 553, новая функция
breakpoint()
.
Улучшения модели данных Python:
- PEP 562, настройка доступа к атрибутам модуля.
- PEP 560, основная поддержка модуля ввода и универсальных типов.
- объявленное сохранение порядка вставки объектов dict
- должен стать официальной частью спецификации языка Python.
Значительные улучшения в стандартной библиотеке:
- Модуль
asyncio
получил новые функции, важное повышение удобства использования и производительности. - Модуль
time
получил поддержку функции с наносекундным разрешением.
Улучшения реализации CPython:
- Отказ от использования ASCII в качестве кодировки текста по умолчанию:
- PEP 552, детерминированный .pycs
- новый режим выполнения разработки
- PEP 565, улучшенная обработка
DeprecationWarning
Улучшения C API:
- PEP 539, новый C API для локального хранилища потока
Улучшения документации:
- PEP 545, переводы документации Python
- Новые переводы документации: Японский, Французский и Корейский.
Данный релиз отличается заметными улучшениями производительности во многих областях. В разделе Оптимизации они перечислены подробно.
Список изменений, которые могут повлиять на совместимость с предыдущими выпусками Python, см. в разделе Портирование на Python 3.7.
Новые особенности
PEP 563: отложенное вычисление аннотаций
Появление подсказок типов в Python выявило две вопиющие проблемы удобства использования с функциональностью аннотаций, добавленных в PEP 3107 и улучшенных в PEP 526:
- аннотации могли использовать только те имена, которые уже были доступны в текущей области, другими словами, они не поддерживали прямые ссылки любого рода; а также
- аннотирование исходного кода отрицательно сказывалось на времени запуска Python программ.
Обе данные проблемы устраняются путём отсрочки вычисления аннотаций. Вместо
компиляции кода, который выполняет выражения в аннотациях во время их
определения, компилятор сохраняет аннотацию в строковой форме, эквивалентной
AST рассматриваемого выражения. При необходимости аннотации можно разрешить во
время выполнения с помощью typing.get_type_hints()
. В общем случае, когда
это не требуется, аннотации дешевле хранить (поскольку короткие строки
интернируются интерпретатором) и ускоряют время запуска.
С точки зрения удобства использования аннотации теперь поддерживают прямые ссылки, что делает допустимым следующий синтаксис:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Поскольку это изменение нарушает совместимость, новое поведение необходимо
включить для каждого модуля в Python 3.7 с помощью импорта __future__
:
from __future__ import annotations
Он станет значением по умолчанию в Python 3.10.
См.также
- PEP 563 – отложенное вычисление аннотаций
- PEP написан и реализован Лукашем Лангой.
PEP 538: устаревшее принуждение к C локали
Постоянная проблема в серии Python 3 заключалась в определении разумной стратегии по умолчанию для обработки предположения о кодировке текста «7-битный ASCII», которое в настоящее время подразумевается использованием локали C или POSIX по умолчанию на платформах, отличных от Windows.
PEP 538 обновляет интерфейс командной строки интерпретатора по умолчанию,
чтобы автоматически приводить эту локаль к доступной локали на основе UTF-8,
как приведено в документации новой переменной среды
PYTHONCOERCECLOCALE
. Автоматическая установка LC_CTYPE
таким
образом означает, что как основной интерпретатор, так и расширения C с учётом
локали (например readline
) предполагают использование UTF-8 в качестве
кодировки текста по умолчанию, а не ASCII.
Определение поддержки платформы в PEP 11 также было обновлено, чтобы ограничить поддержку полнотекстовой обработки соответствующим образом настроенными языковыми стандартами, отличными от ASCII.
В рамках этого изменения обработчиком ошибок по умолчанию для
stdin
и stdout
теперь является surrogateescape
(а
не strict
) при использовании любого из определённых целевых языковых
стандартов приведения (в настоящее время C.UTF-8
, C.utf8
и UTF-8
).
Обработчиком ошибок по умолчанию для stderr
по-прежнему является
backslashreplace
, независимо от языкового стандарта.
Приведение локали по умолчанию не используется, но для помощи в отладке
потенциально связанных с локалью проблем интеграции можно запросить явные
предупреждения (выдаваемые непосредственно в stderr
), установив
PYTHONCOERCECLOCALE=warn
. Данный параметр также приведёт к тому, что среда
выполнения Python выдаст предупреждение, если устаревшая C локаль остаётся
активной при инициализации основного интерпретатора.
Преимущество приведения локали PEP 538 состоит в том, что оно также влияет
на модули расширения (например GNU readline
), а также на дочерние процессы
(включая те, которые запускают не-Python приложения и более старые версии Python).
Его недостатком является требование наличия подходящей целевой локали
в работающей системе. Чтобы лучше обрабатывать случай,
когда подходящая целевая локаль недоступна (как это происходит, например, в
RHEL/CentOS 7), Python 3.7 также реализует PEP 540: принудительный режим выполнения UTF-8.
См.также
- PEP 538 – Приведение устаревшей C локали к локали на основе UTF-8
- PEP написан и реализован Ником Когланом.
PEP 540: принудительный режим выполнения UTF-8
Для включения CPython UTF-8 режима можно использовать новый параметр командной
строки -X
utf8
и переменную среды PYTHONUTF8
.
В режиме UTF-8 CPython игнорирует настройки локали и по умолчанию использует
кодировку UTF-8. Обработчикам ошибок для потоков sys.stdin
и
sys.stdout
присвоено значение surrogateescape
.
Принудительный режим UTF-8 можно использовать для изменения поведения обработки текста во встроенном интерпретаторе Python без изменения настроек локали приложения для встраивания.
Хотя режим UTF-8 PEP 540 имеет преимущество в том, что он работает
независимо от того, какие локали доступны в работающей системе, у него есть
недостаток, заключающийся в том, что он не влияет на модули расширения
(например GNU readline
), дочерние процессы, выполняющие не-Python-приложения, и
дочерние процессы, работающие под управлением более старых версий
Python. Чтобы снизить риск повреждения текстовых данных при взаимодействии с
такими компонентами, Python 3.7 также реализует PEP 540: принудительный режим выполнения UTF-8.
Режим UTF-8 включён по умолчанию, если локаль C
или POSIX
, а функция
приведения локали PEP 538 не может изменить её на альтернативу на основе
UTF-8 (независимо от того, вызвана ли ошибка установкой
PYTHONCOERCECLOCALE=0
, установкой LC_ALL
или отсутствие подходящего
целевого региона).
См.также
- PEP 540 — Добавлен новый режим UTF-8
- PEP написан и реализован Виктором Стиннером
PEP 553: встроенный breakpoint()
Python 3.7 включает новую встроенную функцию breakpoint()
как простой и
последовательный способ входа в отладчик Python.
Встроенная breakpoint()
вызывает sys.breakpointhook()
. По умолчанию
последний импортирует pdb
, а затем вызывает pdb.set_trace()
, но
привязав sys.breakpointhook()
к выбранной вами функции, breakpoint()
может войти в любой отладчик. Кроме того, переменная среды
PYTHONBREAKPOINT
может быть установлена в значение, вызываемое
выбранным отладчиком. Устанавливает PYTHONBREAKPOINT=0
, чтобы полностью
отключить встроенную breakpoint()
.
См.также
- PEP 553 – Встроенная breakpoint()
- PEP написан и реализован Барри Варшавой
PEP 539: новый C API для локального хранилища потоков
В то время как Python предоставляет C API для поддержки локального хранилища
потока; существующий
API локального хранилища потоков (TLS)
использовал int
для представления ключей TLS на всех
платформах. Обычно это не было проблемой для официально поддерживаемых
платформ, но это не POSIX-совместимость и не переносимость в любом практическом
смысле.
PEP 539 изменяет это, предоставляя новый
API хранилища для потоков (TSS)
для CPython, который заменяет использование
существующего API TLS в интерпретаторе CPython, но при этом объявляет
устаревшим существующий API. TSS API использует новый тип Py_tss_t
вместо int
для представления TSS ключей — непрозрачный тип,
определение которого может зависеть от базовой реализации TLS. Следовательно,
это позволит создавать CPython на платформах, где собственный TLS ключ
определён таким образом, что его нельзя безопасно преобразовать в
int
.
Обратите внимание, что на платформах, где собственный ключ TLS определён таким
образом, что его нельзя безопасно преобразовать в int
, все функции
существующего API TLS будут неактивными и немедленно вернут ошибку. Это ясно
указывает на то, что старый API не поддерживается на платформах, где его
надежное использование невозможно, и что не будет предпринято никаких усилий
для добавления такой поддержки.
См.также
- PEP 539 – Новый C-API для хранилища локальных потоков в CPython
- PEP написан Эриком М. Бреем; реализация Масаюки Ямамото.
PEP 562: настройка доступа к атрибутам модуля
Python 3.7 позволяет определять __getattr__()
для модулей и будет
вызывать его всякий раз, когда атрибут модуля не будет найден. Также разрешено
определение __dir__()
на модулях.
Типичным примером того, где это может быть полезно, является устаревание атрибутов модуля и отложенная загрузка.
См.также
- PEP 562 – Модуль
__getattr__
и__dir__
- PEP написан и реализован Иваном Левкивским
PEP 564: новые функции времени с наносекундным разрешением
Разрешение часов в современных системах может превышать ограниченную точность
числа с плавающей запятой, возвращаемого функцией time.time()
и её
вариантами. Чтобы избежать потери точности, PEP 564 добавляет шесть новых
«наносекундных» вариантов существующих функций таймера в time
time.clock_gettime_ns()
time.clock_settime_ns()
time.monotonic_ns()
time.perf_counter_ns()
time.process_time_ns()
time.time_ns()
Новые функции возвращают количество наносекунд в виде целочисленного значения.
Измерения показывают, что в Linux и Windows разрешение
time.time_ns()
примерно в 3 раза лучше, чем у time.time()
.
См.также
- PEP 564 – Добавлены новые функции времени с разрешением в наносекунды
- PEP написан и реализован Виктором Стиннером
PEP 565: показать предупреждение об устаревании в __main__
Обработка DeprecationWarning
по умолчанию была изменена таким образом,
что данные предупреждения снова отображаются по умолчанию, но только тогда,
когда вызывающий их код, выполняется непосредственно в модуле __main__
.
В результате разработчики однофайловых скриптов и те, кто использует Python в
интерактивном режиме, должны снова начать видеть предупреждения об устаревании
для используемых ими API, но предупреждения об устаревании, вызванные
импортированными модулями приложений, библиотек и фреймворков, по-прежнему
будут скрыты по умолчанию.
В результате этого изменения стандартная библиотека теперь позволяет разработчикам выбирать между тремя различными способами предупреждения об устаревании:
FutureWarning
: всегда отображается по умолчанию, рекомендуется для предупреждений, предназначенных для просмотра конечными пользователями приложения (например, для устаревших параметров конфигурации приложения).DeprecationWarning
: отображается по умолчанию только в__main__
и при выполнении тестов, рекомендуется для предупреждений, предназначенных для просмотра другими разработчиками Python, когда обновление версии может привести к изменению поведения или ошибке.PendingDeprecationWarning
: отображается по умолчанию только при выполнении тестов, предназначенных для случаев, когда обновление будущей версии изменит категорию предупреждения наDeprecationWarning
илиFutureWarning
.
Ранее как DeprecationWarning
, так и PendingDeprecationWarning
были видны только при выполнении тестов, а это означало, что разработчики, в
основном пишущие сценарии с одним файлом или использующие Python в
интерактивном режиме, могли быть удивлены нарушением изменений в используемых
ими API.
См.также
- PEP 565 – Показать предупреждение об устаревании в
__main__
- PEP написан и реализован Ником Когланом
PEP 560: поддержка ядром модуля typing
и общих типов
Первоначально PEP 484 был разработан таким образом, чтобы не вносить
любые изменения в основной CPython интерпретатор. Теперь подсказки типов и
модуль typing
широко используются сообществом, поэтому это ограничение
снято. PEP представляет два специальных метода __class_getitem__()
и
__mro_entries__
, данные методы теперь используются большинством классов и
специальных конструкций в typing
. В результате скорость различных
операций с типами увеличена до 7 раз, общие типы могут использоваться без
конфликтов метаклассов, а также исправлены несколько давних ошибок в модуле
typing
.
См.также
- PEP 560 – Основная поддержка модуля typing и универсальных типов
- PEP написан и реализован Иваном Левкивским
PEP 552: файлы .pyc на основе хеша
Python традиционно проверяет актуальность файлов кэша байт-кода (т. е. файлов
.pyc
) путём сравнения исходных метаданных (отметка времени и размер
последнего изменения) с метаданными исходника, сохранёнными в заголовке файла
кэша при его создании. Несмотря на свою эффективность, данный метод
аннулирования имеет свои недостатки. Когда временные метки файловой системы
слишком приблизительны, Python может пропустить обновления исходного кода, что
приведёт пользователя в замешательство. Кроме того, наличие метки времени в
файле кеша проблематично для
создания воспроизводимости
и систем сборки на основе содержимого.
PEP 552 расширяет формат pyc, позволяя использовать хэш исходного файла для
аннулирования вместо временной метки источника. Такие файлы .pyc
называются
«на основе хэша». По умолчанию Python по-прежнему использует аннулирование на
основе отметок времени и не создаёт файлы .pyc
на основе хэшей во время
выполнения. Файлы .pyc
на основе хеша могут быть созданы с помощью
py_compile
или compileall
.
Файлы .pyc
на основе хеша бывают двух вариантов: проверенные и
непроверенные. Python проверяет проверенные файлы .pyc
на основе хэшей по
сравнению с соответствующими исходными файлами во время выполнения, но не
делает этого для непроверенных pyc на основе хэшей. Непроверенные файлы
.pyc
на основе хэша — это полезная оптимизация производительности для сред,
в которых внешняя по отношению к Python система (например, система сборки)
отвечает за поддержание файлов .pyc
в актуальном состоянии.
См. Инвалидация кэша байткода для получения дополнительной информации.
См.также
- PEP 552 – Детерминированные pyc
- PEP написан и реализован Бенджамином Петерсоном
PEP 545: переводы документации Python
PEP 545 определяет процесс создания и поддержки переводов документации Python.
Добавлены три новых перевода:
См.также
- PEP 545 – Переводы документации Python
- PEP написан и реализован Жюльеном Палардом, Инадой Наоки и Виктором Стиннером.
Режим разработки: -X dev
Для включения CPython режима разработки можно использовать новый параметр
командной строки -X
dev
или новую переменную среды
PYTHONDEVMODE
. В режиме разработки CPython выполняет дополнительные
проверки во время выполнения, которые слишком дороги для включения по
умолчанию. Полное описание эффектов этого режима см. в документации
-X
dev
.
Другие языковые изменения
- Выражение
await
и включения, содержащие предложениеasync for
, были недопустимыми в выражениях форматированные строковые литералы из-за проблемы с реализацией. В Python 3.7 это ограничение было снято. - Теперь в функцию можно передать более 255 аргументов, а функция теперь может иметь более 255 параметров. (Предоставлено Сергеем Сторчакой в bpo-12844 и bpo-18896.)
bytes.fromhex()
иbytearray.fromhex()
теперь игнорируют все пробелы ASCII, а не только пробелы. (Предоставлено Робертом Сяо в bpo-28927.)str
,bytes
иbytearray
получили поддержку нового методаisascii()
, который можно использовать для проверки того, содержат ли строка или байты только ASCII символы. (Предоставлено Инада Наоки в bpo-32677.)ImportError
теперь отображает имя модуля и путь модуля__file__
при сбоеfrom ... import ...
. (Предоставлено Матиасом Буссонье в bpo-29546.)- Теперь поддерживается циклический импорт, включающий абсолютный импорт с привязкой подмодуля к имени. (Предоставил Сергей Сторчака в bpo-30024.)
object.__format__(x, '')
теперь эквивалентенstr(x)
, а неformat(str(self), '')
. (Предоставлено Сергеем Сторчакой в bpo-28974.)- Чтобы лучше поддерживать динамическое создание трассировки стека,
types.TracebackType
теперь может быть создан из кода Python, а атрибутtb_next
в трейсбэках теперь доступен для записи. (Предоставлено Натаниэлем Дж. Смитом в bpo-30579.) - При использовании переключателя
-m
sys.path[0]
теперь с готовностью расширяется до полного пути к начальному каталогу, а не остаётся пустым каталогом (что позволяет импортировать из текущего рабочего каталога во время импорта). (Предоставлено Ником Когланом в bpo-33053 .) - Новая опция
-X
importtime
или переменная средыPYTHONPROFILEIMPORTTIME
могут использоваться для отображения времени импорта каждого модуля. (Предоставлено Виктором Стиннером в bpo-31415.)
Новые модули
contextvars
Новый модуль contextvars
и набор нового C API вводят поддержку контекстных переменных. Переменные
контекста концептуально аналогичны локальным переменным потока. В отличие от
TLS переменные контекста правильно поддерживают асинхронный код.
Модули asyncio
и decimal
были обновлены для использования и
поддержки переменных контекста из коробки. В частности, активный десятичный
контекст теперь хранится в переменной контекста, что позволяет десятичным
операциям работать с правильным контекстом в асинхронном коде.
См.также
- PEP 567 – Переменные контекста
- PEP написан и реализован Юрием Селивановым
Датаклассы
Новый декоратор dataclass()
предоставляет способ объявить
датаклассы. Датакласс определяет свои атрибуты с помощью аннотаций
переменных класса. Его конструктор и другие магические методы, такие как
__repr__()
, __eq__()
и __hash__()
,
генерируются автоматически.
Пример:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # создаёт "Point(x=1.5, y=2.5, z=0.0)"
См.также
- PEP 557 – Датаклассы
- PEP написан и реализован Эриком В. Смитом
importlib.resources
Новый модуль importlib.resources
предоставляет несколько новых API и
один новый ABC для доступа, открытия и чтения ресурсов внутри пакетов.
Ресурсы примерно аналогичны файлам внутри пакетов, но они не обязательно должны
быть настоящими файлами в физической файловой системе. Загрузчики модулей могут
предоставлять функцию get_resource_reader()
, которая возвращает
экземпляр importlib.abc.ResourceReader
для поддержки этого нового API.
Это поддерживают как встроенные загрузчики путей к файлам, так и загрузчики
zip-файлов.
Предоставлено Барри Варшавой и Бреттом Кэнноном в bpo-32248.
См.также
importlib_resources – обратный порт PyPI для более ранних версий Python.
Улучшенные модули
argparse
Новый метод ArgumentParser.parse_intermixed_args()
позволяет смешивать параметры
и позиционные аргументы. (Предоставлено paul.j3 в bpo-14191.)
asyncio
Модуль asyncio
получил множество новых функций, удобство использования и
повышение производительности. Заметные изменения
включают:
Новую предварительную функцию
asyncio.run()
можно используемую для запуска корутины из синхронного кода путём автоматического создания и уничтожения событийного цикла. (Предоставил Юрий Селиванов в bpo-32314.)asyncio получил поддержку
contextvars
.loop.call_soon()
,loop.call_soon_threadsafe()
,loop.call_later()
,loop.call_at()
иFuture.add_done_callback()
имеют новый необязательный только ключевой параметр context.Tasks
теперь автоматически отслеживает их контекст. См. PEP 567 для получения более подробной информации. (Предоставил Юрий Селиванов в bpo-32436.)Новая функция
asyncio.create_task()
была добавлена в качестве ярлыка дляasyncio.get_event_loop().create_task()
. (Предоставлено Эндрю Светловым в bpo-32311.)Новый метод
loop.start_tls()
можно использовать для обновления существующего подключения до TLS. (Предоставлено Юрием Селивановым в bpo-23749.)Новый метод
loop.sock_recv_into()
позволяет считывать данные из сокета непосредственно в предоставленный буфер, что позволяет уменьшить количество копий данных. (Предоставлено Антуаном Питру в bpo-31819.)Новая функция
asyncio.current_task()
возвращает запущенный в данный момент экземплярTask
, а новая функцияasyncio.all_tasks()
возвращает множество всех существующих экземпляровTask
в заданном цикле. МетодыTask.current_task()
иTask.all_tasks()
устарели. (Предоставлено Эндрю Светловым в bpo-32250.)Новый временный класс
BufferedProtocol
позволяет реализовывать потоковые протоколы с ручным управлением приёмным буфером. (Предоставлено Юрием Селивановым в bpo-32251.)Новая функция
asyncio.get_running_loop()
возвращает текущий выполняемый цикл и вызываетRuntimeError
, если цикл не выполняется. Это отличается отasyncio.get_event_loop()
, которая будет создавать новый цикл событий, если ни один из них не запущен. (Предоставлено Юрием Селивановым в bpo-32269.)Новый метод корутины
StreamWriter.wait_closed()
позволяет дождаться закрытия средства записи потока. Новый методStreamWriter.is_closing()
можно использовать, чтобы определить, закрывается ли модуль записи. (Предоставлено Эндрю Светловым в bpo-32391.)Новый метод корутины
loop.sock_sendfile()
позволяет отправлять файлы с использованиемos.sendfile
, когда это возможно. (Предоставлено Андреем Светловым в bpo-32410.)Новые методы
Future.get_loop()
иTask.get_loop()
возвращают экземпляр цикла, в котором была создана задача или будущее.Server.get_loop()
позволяет сделать то же самое для объектовasyncio.Server
. (Предоставлено Юрием Селивановым в bpo-32415 и Шринивасом Редди Татипарти в bpo-32418.)Теперь можно управлять началом обслуживания экземпляров
asyncio.Server
. Раньше сервер начинал обслуживать сразу после создания. Новый ключевой аргумент start_serving дляloop.create_server()
иloop.create_unix_server()
, а такжеServer.start_serving()
иServer.serve_forever()
можно использовать для разделения создания экземпляров сервера и обслуживания. Новый методServer.is_serving()
возвращаетTrue
, если сервер работает. ОбъектыServer
теперь являются асинхронными менеджерами контекста:srv = await loop.create_server(...) async with srv: # некоторый код # В этот момент srv закрыт и больше не принимает новые подключения.
(Предоставил Юрий Селиванов в bpo-32662.)
Объекты обратного вызова, возвращенные
loop.call_later()
, получили новый методwhen()
, который возвращает абсолютную отметку времени запланированного обратного вызова. (Предоставлено Андреем Светловым в bpo-32741.)Метод
loop.create_datagram_endpoint()
получил поддержку Unix сокетов. (Предоставлено Квентином Давансом в bpo-31245.)Функции
asyncio.open_connection()
,asyncio.start_server()
, методыloop.create_connection()
,loop.create_server()
,loop.create_accepted_socket()
и соответствующие им варианты UNIX сокетов теперь принимают ключевой аргумент ssl_handshake_timeout. (Предоставлено Нилом Аспиналлом в bpo-29970.)Новый метод
Handle.cancelled()
возвращаетTrue
, если обратный вызов был отменён. (Предоставлено Маратом Шарафутдиновым в bpo-31943.)Исходный код asyncio был преобразован для использования синтаксиса
async
/await
. (Предоставлено Андреем Светловым в bpo-32193.)Новый метод
ReadTransport.is_reading()
можно использовать для определения состояния чтения транспорта. Кроме того, вызовыReadTransport.resume_reading()
иReadTransport.pause_reading()
теперь являются идемпотентными. (Предоставил Юрий Селиванов в bpo-32356.)Методы цикла, которые принимают пути сокетов, теперь поддерживают передачу путеподобного объекта. (Предоставил Юрий Селиванов в bpo-32066.)
В
asyncio
TCP сокеты в Linux теперь создаются с установленным по умолчанию флагомTCP_NODELAY
. (Предоставлено Юрием Селивановым и Виктором Стиннером в bpo-27456.)Вызываемые исключения в отмененных задачах, больше не регистрируются. (Предоставил Юрий Селиванов в bpo-30508.)
Новые классы
WindowsSelectorEventLoopPolicy
иWindowsProactorEventLoopPolicy
. (Предоставил Юрий Селиванов в bpo-33792.)
Несколько API asyncio
были
запрещены.
binascii
Функция b2a_uu()
теперь принимает необязательный ключевой
аргумент backtick. Когда это правда, нули представлены '`'
вместо
пробелов. (Предоставлено Сян Чжаном в bpo-30103.)
calendar
Класс HTMLCalendar
имеет новые атрибуты класса, упрощающие
настройку CSS классов в создаваемом HTML-календаре. (Предоставлено Озом Тирамом
в bpo-30095.)
collections
collections.namedtuple()
теперь поддерживает значения по умолчанию.
(Предоставлено Рэймондом Хеттингером в bpo-32320.)
compileall
compileall.compile_dir()
узнал новый параметр invalidation_mode,
который можно использовать для включения
проверки .pyc на основе хэша. Режим аннулирования также можно указать в командной
строке с помощью нового аргумента --invalidation-mode
. (Предоставлено
Бенджамином Петерсоном в bpo-31650.)
concurrent.futures
ProcessPoolExecutor
и
ThreadPoolExecutor
теперь
поддерживают новые аргументы конструктора initializer и initargs.
(Предоставлено Антуаном Питру в bpo-21423.)
ProcessPoolExecutor
теперь
может принимать многопроцессорный контекст через новый аргумент mp_context.
(Предоставлено Томасом Моро в bpo-31540.)
contextlib
Новый nullcontext()
— более простой и быстрый контекстный
менеджер без операций, чем ExitStack
. (Предоставлено
Джесси-Баккер в bpo-10049.)
Новые asynccontextmanager()
,
AbstractAsyncContextManager
и
AsyncExitStack
были добавлены в дополнение к их синхронным
аналогам. (Предоставлено Йелле Зейлстрой в bpo-29679 и bpo-30241, а
также Александром Мором и Ильей Кулаковым в bpo-29302.)
cProfile
Командная строка cProfile
теперь принимает -m module_name
в качестве
альтернативы пути к сценарию. (Предоставлено Саньямом Кураной в
bpo-21862.)
crypt
Модуль crypt
теперь поддерживает метод хеширования Blowfish.
(Предоставил Сергей Сторчака в bpo-31664.)
Функция mksalt()
теперь позволяет указать количество раундов
хеширования. (Предоставил Сергей Сторчака в bpo-31702.)
datetime
Новый метод datetime.fromisoformat()
создаёт объект datetime
из строки в одном из форматов,
выводимых datetime.isoformat()
.
(Предоставлено Полом Ганссле в bpo-15873.)
Класс tzinfo
теперь поддерживает смещения меньше
минуты. (Предоставлено Александром Белопольским в bpo-5288.)
dbm
dbm.dumb
теперь поддерживает чтение файлов только для чтения и больше не
записывает индексный файл, если он не изменён.
decimal
Модуль decimal
теперь использует
контекстные переменные для хранения десятичного контекста. (Предоставил Юрий
Селиванов в bpo-32630.)
dis
Функция dis()
теперь способна дизассемблировать вложенные объекты
кода (код вложенных выражений, генераторных выражений и вложенных функций, а
также код, используемый для построения вложенных классов). Максимальная глубина
рекурсии дизассемблирования контролируется новым параметром depth.
(Предоставлено Сергеем Сторчакой в bpo-11822.)
distutils
README.rst
теперь включён в список стандартных README distutils и,
следовательно, включён в дистрибутивы с исходным кодом. (Предоставлено Райаном
Гонсалесом в bpo-11913.)
enum
Enum
получил новое свойство класса _ignore_
,
позволяющий перечислять имена свойств, которые не должны становиться членами
перечисления. (Предоставлено Итаном Фурманом в bpo-31801.)
В Python 3.8 попытка проверить наличие объектов, отличных от Enum, в классах
Enum
вызовет TypeError
(например, 1 in Color
); аналогично,
попытка проверить объекты без флага в элементе Flag
вызовет
TypeError
(например, 1 in Perm.RW
); в настоящее время обе операции
вместо этого возвращают False
и устарели. (Предоставлено Итаном
Фурманом в bpo-33217.)
functools
functools.singledispatch()
теперь поддерживает регистрацию реализаций с
использованием аннотаций типов. (Предоставлено Лукашем Лангой в
bpo-32227.)
gc
Новая функция gc.freeze()
позволяет заморозить все объекты, отслеживаемые
сборщиком мусора, и исключить их из будущих сборок. Это можно использовать
перед вызовом POSIX fork()
, чтобы сделать GC удобным для копирования при
записи или ускорить сбор. Новые функции gc.unfreeze()
отменяют эту
операцию. Кроме того, gc.get_freeze_count()
можно использовать для
получения количества замороженных объектов. (Предоставлено Ли Зекуном в
bpo-31558.)
hmac
Модуль hmac
теперь имеет оптимизированную одноразовую функцию
digest()
, которая работает до трёх раз быстрее, чем
HMAC()
. (Предоставлено Кристианом Хеймсом в bpo-32433.)
http.client
HTTPConnection
и HTTPSConnection
теперь поддерживают новый аргумент blocksize для повышения пропускной
способности загрузки. (Предоставлено Ниром Соффером в bpo-31945.)
http.server
SimpleHTTPRequestHandler
теперь поддерживает заголовок
HTTP If-Modified-Since
. Сервер возвращает статус ответа 304, если целевой
файл не был изменён после времени, указанного в заголовке. (Предоставлено
Пьером Квентелем в bpo-29654.)
SimpleHTTPRequestHandler
принимает новый аргумент
directory в дополнение к новому аргументу командной строки --directory
. С
этим параметром сервер обслуживает указанный каталог, по умолчанию он
использует текущий рабочий каталог. (Предоставлено Стефаном Виртелем и Жюльеном
Паларом в bpo-28707.)
Новый класс ThreadingHTTPServer
использует потоки для обработки запросов с помощью
ThreadingMixin
. Он используется, когда http.server
запускается с -m
. (Предоставлено Жюльеном Палардом в bpo-31639.)
idlelib и IDLE
Несколько исправлений для автозаполнения. (Предоставлено Луи Лу в bpo-15786.)
Браузер модулей (в меню «File», ранее называвшийся «Class Browser») теперь отображает вложенные функции и классы в дополнение к функциям и классам верхнего уровня. (Предоставлено Гильерме Поло, Шерил Сабелла и Терри Джен Риди в bpo-1612262.)
Диалоговое окно «Settings» («Options», «Configure IDLE») было частично переписано для улучшения внешнего вида и функциональности. (Соавторы Шерил Сабелла и Терри Ян Риди в нескольких выпусках)
Образец шрифта теперь включает множество нелатинских символов, чтобы пользователи могли лучше видеть эффект выбора определённого шрифта. (Предоставлено Терри Яном Риди в bpo-13802.) Образец можно отредактировать, включив в него другие символы. (Предоставил Сергей Сторчака в bpo-31860.)
Функции IDLE, ранее реализованные в виде расширений, теперь реализованы как обычные функции. Их настройки были перенесены с вкладок «Extensions» на другие вкладки диалога. (Предоставлено Чарльзом Вольгангером и Терри Джен Риди в bpo-27099.)
Параметр контекста кода редактора изменён. Box отображает все строки контекста до maxlines. Щелчок по строке контекста переводит редактор на эту строку. Контекстные цвета для пользовательских тем добавлены на вкладку Highlights диалогового окна Settings. (Предоставлено Шерил Сабелла и Терри Ян Риди в bpo-33642, bpo-33768 и bpo-33679.)
В Windows новый вызов API сообщает Windows, что tk масштабируется для DPI. В Windows 8.1+ или 10 с неизменными свойствами совместимости DPI двоичного файла Python и разрешением монитора выше 96 DPI это должно сделать текст и линии более чёткими. В противном случае это не должно иметь никакого эффекта. (Предоставлено Терри Яном Риди в bpo-33656.)
Новое в версии 3.7.1:
Вывод в N строк (по умолчанию 50) сжимается до кнопки. N можно изменить в разделе PyShell на странице «General» диалогового окна «Settings». Меньшее количество, но, возможно, очень длинных строк можно сжать, щелкнув правой кнопкой мыши на выходе. Сжатый вывод можно развернуть на месте двойным нажатием кнопки или в буфер обмена или отдельное окно, нажав правой кнопкой мыши кнопку. (Предоставлено Талем Эйнатом в bpo-1529353.)
Вышеупомянутые изменения были перенесены в отладочные версии 3.6.
НОВОЕ в версии 3.7.4:
Добавляет «Run Customized» в меню «Run», чтобы запустить модуль с индивидуальными настройками. Любые введенные аргументы командной строки добавляются в sys.argv. Они снова появляются в поле для следующего индивидуального запуска. Также можно подавить обычный перезапуск основного модуля Shell. (Предоставлено Шерил Сабелла, Терри Ян Риди и другими в bpo-5680 и bpo-37627.)
Новое в версии 3.7.5:
Добавляет необязательные номера строк для окон редактора IDLE. Окна открываются без номеров строк, если не указано иное на вкладке «General» диалогового окна конфигурации. Номера строк для существующего окна отображаются и скрываются в меню «Options». (Предоставлено Тал Эйнат и Саймадхав Хебликар в bpo-17535.)
importlib
importlib.abc.ResourceReader
ABC был введён для поддержки загрузки
ресурсов из пакетов. См. также importlib.resources.
(Предоставлено Барри Варшавой, Бреттом Кэнноном в bpo-32248.)
importlib.reload()
теперь вызывает ModuleNotFoundError
, если у
модуля нет спецификации. (Предоставлено Гарвитом Хатри в bpo-29851.)
importlib.find_spec()
теперь вызывает ModuleNotFoundError
вместо
AttributeError
, если указанный родительский модуль не является пакетом
(т. е. не имеет атрибута __path__
). (Предоставлено Миланом Оберкирхом в
bpo-30436.)
Новый importlib.source_hash()
можно использовать для вычисления хэша
переданного источника. pyc-файл на основе хэша
встраивает значение, возвращаемое этой функцией.
io
Новый метод TextIOWrapper.reconfigure()
можно использовать для перенастройки текстового потока с новыми настройками.
(Предоставлено Антуаном Питру в bpo-30526 и Инада Наоки в bpo-15216.)
ipaddress
Новые методы subnet_of()
и supernet_of()
из
ipaddress.IPv6Network
и ipaddress.IPv4Network
можно
использовать для тестов локализации сети. (Предоставлено Мишелем Альбертом и
Шерил Сабеллой в bpo-20825.)
itertools
itertools.islice()
теперь принимает целочисленные объекты
в качестве аргументов запуска, остановки и среза.
(Предоставлено Уиллом Робертсом в bpo-30537.)
locale
Новый аргумент monetary для locale.format_string()
можно использовать,
чтобы преобразование использовало денежные разделители тысяч и группирующие
строки. (Предоставлено Гарвитом в bpo-10379.)
Функция locale.getpreferredencoding()
теперь всегда возвращает
'UTF-8'
на Android или в принудительный режим UTF-8.
logging
Экземпляры Logger
теперь можно пиклить. (Предоставлено
Винаем Саджипом в bpo-30520.)
Новый метод StreamHandler.setStream()
можно использовать для замены потока логгера после создания обработчика.
(Предоставлено Винаем Саджипом в bpo-30522.)
Теперь можно указать ключевые аргументы для конструкторов обработчиков в
конфигурации, переданной в logging.config.fileConfig()
. (Предоставлено
Престоном Ландерсом в bpo-31080.)
math
Новая функция math.remainder()
реализует операцию остатка в стиле IEEE
754. (Предоставлено Марком Дикинсоном в bpo-29962.)
mimetypes
Тип MIME файла .bmp был изменён с 'image/x-ms-bmp'
на 'image/bmp'
.
(Предоставлено Нитишем Чандрой в bpo-22589.)
msilib
Новый метод Database.Close()
можно использовать
для закрытия базы данных MSI. (Предоставлено Беркером Пексагом в
bpo-20486.)
multiprocessing
Новый метод Process.close()
явно
закрывает объект процесса и освобождает все связанные с ним ресурсы.
ValueError
вызывается, если базовый процесс все ещё выполняется.
(Предоставлено Антуаном Питру в bpo-30596.)
Новый метод Process.kill()
можно
использовать для завершения процесса с помощью сигнала SIGKILL
в Unix.
(Предоставлено Витором Перейрой в bpo-30794.)
Недемонические потоки, созданные с помощью Process
,
теперь объединяются при выходе из процесса. (Предоставлено Антуаном Питру в
bpo-18966.)
os
os.fwalk()
теперь принимает аргумент path как bytes
.
(Предоставлено Сергеем Сторчакой в bpo-28682.)
os.scandir()
получил поддержку файловых дескрипторов.
(Предоставил Сергей Сторчака в bpo-25996.)
Новая функция register_at_fork()
позволяет регистрировать обратные
вызовы Python для выполнения в ответвлении процесса. (Предоставлено Антуаном
Питру в bpo-16500.)
Добавлены функции os.preadv()
(объединяют функциональные возможности
os.readv()
и os.pread()
) и os.pwritev()
(объединяют
функциональные возможности os.writev()
и os.pwrite()
).
(Предоставлено Пабло Галиндо в bpo-31368.)
Аргумент режима os.makedirs()
больше не влияет на биты прав доступа к
файлам вновь созданных каталогов промежуточного уровня. (Предоставлено Сергеем
Сторчакой в bpo-19930.)
os.dup2()
теперь возвращает новый файловый дескриптор. Раньше всегда
возвращался None
. (Предоставлено Бенджамином Петерсоном в bpo-32441.)
Структура, возвращаемая os.stat()
, теперь содержит атрибут
st_fstype
для Solaris и его производных. (Предоставлено
Хесусом Сеа Авионом в bpo-32659.)
pathlib
Новый метод Path.is_mount()
теперь доступен в
POSIX системах и может использоваться для определения того, является ли путь
точкой монтирования. (Предоставлено Купером Рай Лисом в bpo-30897.)
pdb
pdb.set_trace()
теперь принимает необязательный аргумент header только
ключевой. Если задано, оно выводится на консоль непосредственно перед началом
отладки. (Предоставлено Барри Варшавой в bpo-31389.)
Командная строка pdb
теперь принимает -m module_name
в качестве
альтернативы файлу скрипта. (Предоставлено Марио Корчеро в bpo-32206.)
py_compile
py_compile.compile()
и compileall
— теперь
учитывает переменную среды SOURCE_DATE_EPOCH
, безоговорочно создавая
файлы .pyc
для проверки на основе хэша. Это позволяет гарантировать
воспроизводимые сборки файлов из .pyc
, когда
они создаются с готовностью. (Предоставлено Бернхардом М. Видеманном в
bpo-29708.)
pydoc
Сервер pydoc теперь может привязываться к произвольному имени хоста, указанному
новым аргументом командной строки -n
. (Предоставлено Фенилом Пателем в
bpo-31128.)
queue
Новый класс SimpleQueue
представляет собой неограниченную
очередь FIFO. (Предоставлено Антуаном Питру в bpo-14976.)
re
Флаги re.ASCII
, re.LOCALE
и re.UNICODE
могут быть
установлены в рамках группы. (Предоставил Сергей Сторчака в bpo-31690.)
re.split()
теперь поддерживает разбиение по шаблону, например r'\b'
,
'^$'
или (?=-)
, который соответствует пустой строке. (Предоставил
Сергей Сторчака в bpo-25054.)
Регулярные выражения, скомпилированные с флагом re.LOCALE
, больше не
зависят от локали во время компиляции. Настройки локали применяются только при
использовании скомпилированного регулярного выражения. (Предоставлено Сергеем
Сторчакой в bpo-30215.)
FutureWarning
теперь генерируется, если регулярное выражение содержит
конструкции наборов символов, которые изменятся семантически в будущем,
например, вложенные множества и операции над наборами. (Предоставлено Сергеем
Сторчакой в bpo-30349.)
Скомпилированные регулярные выражения и объекты соответствия теперь можно
копировать с помощью copy.copy()
и copy.deepcopy()
. (Предоставил
Сергей Сторчака в bpo-10076.)
signal
Новый аргумент warn_on_full_buffer для функции signal.set_wakeup_fd()
позволяет указать, будет ли Python выводить предупреждение в stderr при
переполнении буфера пробуждения. (Предоставлено Натаниэлем Дж. Смитом в
bpo-30050.)
socket
Новый метод socket.getblocking()
возвращает
True
, если сокет находится в режиме блокировки, и False
в противном
случае. (Предоставил Юрий Селиванов в bpo-32373.)
Новая функция socket.close()
закрывает переданный файловый дескриптор
сокета. Эту функцию следует использовать вместо os.close()
для лучшей
совместимости между платформами. (Предоставлено Кристианом Хеймсом в
bpo-32454.)
Модуль socket
теперь предоставляет константы
socket.TCP_CONGESTION
(Linux 2.6.13), socket.TCP_USER_TIMEOUT
(Linux 2.6.37) и socket.TCP_NOTSENT_LOWAT
(Linux 3.12). (Предоставлено
Омаром Сандовалом в bpo-26273 и Натаниэлем Дж. Смитом в bpo-29728.)
Добавлена поддержка сокетов socket.AF_VSOCK
для обеспечения связи между
виртуальными машинами и их хостами. (Предоставлено Кэти Эйвери в
bpo-27584.)
Сокеты теперь автоматически определяют семейство, тип и протокол по файловому дескриптору по умолчанию. (Предоставлено Кристианом Хеймсом в bpo-28134.)
socketserver
socketserver.ThreadingMixIn.server_close()
теперь ожидает завершения всех
потоков, не являющихся демонами. socketserver.ForkingMixIn.server_close()
теперь ожидает завершения всех дочерних процессов.
Добавляет новый атрибут класса socketserver.ForkingMixIn.block_on_close
в классы socketserver.ForkingMixIn
и
socketserver.ThreadingMixIn
. Устанавливает для атрибута класса
значение False
, чтобы получить поведение до версии 3.7.
sqlite3
sqlite3.Connection
теперь предоставляет метод
backup()
, когда базовая библиотека SQLite имеет
версию 3.6.11 или выше. (Предоставлено Леле Гайфакс в bpo-27645.)
Аргумент database sqlite3.connect()
теперь принимает любой
путеподобный объект, а не только строку. (Предоставлено Андерсом Лорентсеном в
bpo-31843.)
ssl
Модуль ssl
теперь использует встроенный API OpenSSL вместо
match_hostname()
для проверки имени хоста или IP-адреса. Значения
проверяются во время TLS рукопожатия. Любая ошибка проверки сертификата,
включая сбой проверки имени хоста, теперь вызывает
SSLCertVerificationError
и прерывает рукопожатие с правильным
сообщением TLS Alert. Новое исключение содержит дополнительную информацию.
Проверка имени хоста может быть настроена с помощью
SSLContext.hostname_checks_common_name
. (Предоставлено Кристианом
Хеймсом в bpo-31399.)
Примечание
Для улучшенной проверки имени хоста требуется реализация libssl, совместимая с OpenSSL 1.0.2 или 1.1. Следовательно, OpenSSL 0.9.8 и 1.0.1 больше не поддерживаются (дополнительные сведения см. в статье Удаление поддержки платформ). Модуль ssl в основном совместим с LibreSSL 2.7.2 и новее.
Модуль ssl
больше не отправляет IP-адреса в расширении SNI TLS.
(Предоставлено Кристианом Хеймсом в bpo-32185.)
match_hostname()
больше не поддерживает частичные подстановочные
знаки, такие как www*.example.org
. (Предоставлено Мандипом Сингхом в
bpo-23033 и Кристианом Хеймсом в bpo-31399.)
Выбор набора шифров по умолчанию для модуля ssl
теперь использует метод
чёрного списка, а не жёстко запрограммированный белый список. Python больше не
включает повторно шифры, которые были заблокированы обновлениями безопасности
OpenSSL. Выбор набора шифров по умолчанию можно настроить во время компиляции.
(Предоставлено Кристианом Хеймсом в bpo-31429.)
Теперь поддерживается проверка сертификатов сервера, содержащих
интернационализированные доменные имена (IDN). В рамках этого изменения атрибут
SSLSocket.server_hostname
теперь хранит
ожидаемое имя хоста в форме A-метки ("xn--pythn-mua.org"
), а не в форме
U-метки ("pythön.org"
). (Предоставлено Натаниэлем Дж. Смитом и Кристианом
Хаймсом в bpo-28414.)
Модуль ssl
имеет предварительную и экспериментальную поддержку TLS 1.3 и
OpenSSL 1.1.1. На момент релиза Python 3.7.0 OpenSSL 1.1.1 все ещё находился в
стадии разработки, а TLS 1.3 ещё не был завершён. Рукопожатие и протокол TLS
1.3 ведут себя немного иначе, чем TLS 1.2 и более ранние версии, см.
TLS 1.3. (Предоставлено Кристианом Хеймсом в bpo-32947, bpo-20995,
bpo-29136, bpo-30622 и bpo-33618)
SSLSocket
и SSLObject
больше не имеют
общедоступного конструктора. Прямое создание экземпляров никогда не было
задокументированной и поддерживаемой функцией. Экземпляры должны быть созданы с
помощью методов SSLContext
wrap_socket()
и
wrap_bio()
. (Предоставлено Кристианом Хеймсом в
bpo-32951)
API-интерфейсы OpenSSL 1.1 для установки минимальной и максимальной версии
протокола TLS доступны как SSLContext.minimum_version
и SSLContext.maximum_version
. Поддерживаемые протоколы обозначаются
несколькими новыми флагами, такими как HAS_TLSv1_1
. (Предоставлено
Кристианом Хеймсом в bpo-32609.)
string
string.Template
теперь позволяет дополнительно изменять шаблон
регулярного выражения для заполнителей в фигурных скобках и заполнителей без
фигурных скобок отдельно. (Предоставлено Барри Варшавой в bpo-1198569.)
subprocess
Функция subprocess.run()
принимает новый ключевой аргумент
capture_output. При значении истина будут захвачены stdout и stderr. Это
эквивалентно передаче subprocess.PIPE
в качестве аргументов stdout и
stderr. (Предоставлено Бо Бейлсом в bpo-32102.)
Функция subprocess.run
и конструктор subprocess.Popen
теперь
принимают ключевой аргумент text в качестве псевдонима для
universal_newlines. (Предоставлено Эндрю Клеггом в bpo-31756.)
В Windows значение по умолчанию для close_fds было изменено с False
на
True
при перенаправлении стандартных дескрипторов. Теперь можно установить
для close_fds значение истина при перенаправлении стандартных дескрипторов.
См. subprocess.Popen
. Это означает, что close_fds теперь по
умолчанию имеет значение True
на всех поддерживаемых платформах.
(Предоставлено Сегевом Финером в bpo-19764.)
Модуль subprocess теперь более изящно обрабатывает KeyboardInterrupt
во
время subprocess.call()
, subprocess.run()
или в менеджере
контекста Popen
. Теперь он ждет некоторое время, пока
дочерний процесс завершится, прежде чем продолжить обработку исключения
KeyboardInterrupt
. (Предоставлено Грегори П. Смитом в bpo-25942.)
sys
Новая хук функция sys.breakpointhook()
вызывается встроенной функцией
breakpoint()
. (Предоставлено Барри Варшавой в bpo-31353.)
В Android новый sys.getandroidapilevel()
возвращает версию Android API
времени сборки. (Предоставлено Виктором Стиннером в bpo-28740.)
Новая функция sys.get_coroutine_origin_tracking_depth()
возвращает
текущую глубину отслеживания источника корутины, установленную новым
sys.set_coroutine_origin_tracking_depth()
. asyncio
был
преобразован для использования этого нового API вместо устаревшего
sys.set_coroutine_wrapper()
. (Предоставлено Натаниэлем Дж. Смитом в
bpo-32591.)
time
PEP 564 добавляет шесть новых функций с наносекундным разрешением в модуль
time
:
time.clock_gettime_ns()
time.clock_settime_ns()
time.monotonic_ns()
time.perf_counter_ns()
time.process_time_ns()
time.time_ns()
Добавлены новые идентификаторы часов:
time.CLOCK_BOOTTIME
(Linux): Идентиченtime.CLOCK_MONOTONIC
, за исключением того, что он также включает время приостановки работы системы.time.CLOCK_PROF
(FreeBSD, NetBSD и OpenBSD): таймер ЦП для каждого процесса с высоким разрешением.time.CLOCK_UPTIME
(FreeBSD, OpenBSD): абсолютное значение времени, в течение которого система работала и не была приостановлена, обеспечивая точное измерение времени безотказной работы.
Новые функции time.thread_time()
и time.thread_time_ns()
можно
использовать для измерения времени ЦП для каждого потока. (Предоставлено
Антуаном Питру в bpo-32025.)
Новая функция time.pthread_getcpuclockid()
возвращает идентификатор часов
процессорного времени для потока.
tkinter
Теперь доступен новый класс tkinter.ttk.Spinbox
. (Предоставлено Аланом
Муром в bpo-32585.)
tracemalloc
tracemalloc.Traceback
ведёт себя скорее как обычная обратная
трассировка, сортируя фреймы от самых старых до самых последних.
Traceback.format()
теперь принимает
отрицательное значение limit, усекая результат до самых старых фреймов
abs(limit)
. Чтобы получить старое поведение, используйте новый аргумент
most_recent_first для Traceback.format()
. (Предоставлено Джесси Баккером
в bpo-32121.)
types
Теперь доступны новые классы WrapperDescriptorType
,
MethodWrapperType
, MethodDescriptorType
и
ClassMethodDescriptorType
. (Предоставили Мануэль Креббер и
Гвидо ван Россумом в bpo-29377 и Сергей Сторчака в bpo-32265.)
Новая функция types.resolve_bases()
динамически разрешает MRO записи, как
указано в PEP 560. (Предоставлено Иваном Левкивским в bpo-32717.)
unicodedata
Внутренняя база данных unicodedata
была обновлена для использования
Юникода 11. (Предоставлено
Бенджамином Петерсоном.)
unittest
Новый параметр командной строки -k
позволяет фильтровать тесты по подстроке
имени или шаблону, подобному оболочке Unix. Например, python -m unittest -k
foo
запускает foo_tests.SomeTest.test_something
,
bar_tests.SomeTest.test_foo
, но не bar_tests.FooTest.test_something
.
(Предоставлено Йонасом Хаагом в bpo-32071.)
unittest.mock
Атрибуты sentinel
теперь сохраняют свою идентичность,
когда они являются копией
или пиклем
.
(Предоставлено Сергеем Сторчакой в bpo-20804.)
Новая функция seal()
позволяет запечатывать экземпляры
Mock
, что запрещает дальнейшее создание атрибута
мокингов. Рекурсивно печать применяется ко всем атрибутам, у которых есть
мокинги. (Предоставлено Марио Корчеро в bpo-30541.)
urllib.parse
urllib.parse.quote()
был обновлён с RFC 2396 до RFC 3986, добавлен
~
к набору символов, которые по умолчанию никогда не заключаются в кавычки.
(Предоставлено Кристианом Теуном и Ратнадипом Дебнатом в bpo-16285.)
uu
Функция uu.encode()
теперь принимает необязательный ключевой аргумент
backtick. Когда это правда, нули представлены '`'
вместо пробелов.
(Предоставлено Сян Чжаном в bpo-30103.)
uuid
Новый атрибут UUID.is_safe
передает информацию от
платформы о том, генерируются ли сгенерированные UUID с помощью
многопроцессорного безопасного метода. (Предоставлено Барри Варшавой в
bpo-22807.)
uuid.getnode()
теперь отдаёт предпочтение универсально администрируемым
MAC-адресам, а не локально администрируемым MAC-адресам. Это предоставляет
лучшую гарантию глобальной уникальности UUID, возвращенных из
uuid.uuid1()
. Если доступны только локально администрируемые MAC-адреса,
возвращается первый найденный такой адрес. (Предоставлено Барри Варшавой в
bpo-32107.)
warnings
Инициализация фильтров предупреждений по умолчанию изменилась следующим образом:
предупреждения, включенные с помощью параметров командной строки (в том числе для
-b
и нового параметра-X
dev
, специфичного для CPython), всегда передаются механизму предупреждений через атрибутsys.warnoptions
.фильтры предупреждений, включенные через командную строку или среду, теперь имеют следующий порядок приоритета:
- фильтр
BytesWarning
для-b
(или-bb
) - любые фильтры, указанные с опцией
-W
- любые фильтры, указанные в переменной среды
PYTHONWARNINGS
- любые другие специальные фильтры CPython (например, фильтр
default
, добавленный для нового режима-X dev
) - любые неявные фильтры, определённые непосредственно механизмом предупреждений
- фильтр
в отладочных сборках CPython все предупреждения теперь отображаются по умолчанию (список неявных фильтров пуст)
(Предоставлено Ником Когланом и Виктором Стиннером в bpo-20361, bpo-32043 и bpo-32230.)
Предупреждения об устаревании снова отображаются по умолчанию в сценариях с одним файлом и в интерактивной подсказке. Подробности см. в PEP 565: показать предупреждение об устаревании в __main__. (Предоставлено Ником Когланом в bpo-31975.)
xml.etree
Предикаты ElementPath в методах find()
теперь
могут сравнивать текст текущего узла с [. = "text"]
, а не только текст в
дочерних элементах. Предикаты также позволяют добавлять пробелы для лучшей
читабельности. (Предоставлено Стефаном Бенелем в bpo-31648.)
xmlrpc.server
SimpleXMLRPCDispatcher.register_function
теперь можно использовать как
декоратор. (Предоставлено Сян Чжаном в bpo-7769.)
zipapp
Функция create_archive()
теперь принимает необязательный аргумент
filter, позволяющий пользователю выбирать, какие файлы следует включать в
архив. (Предоставлено Ирмен де Йонг в bpo-31072.)
Функция create_archive()
теперь принимает необязательный аргумент
compressed для создания сжатого архива. Параметр командной строки
--compress
также был добавлен для поддержки сжатия. (Предоставлено
Чжимингом Ваном в bpo-31638.)
Изменения C API
Реализован новый API для локального хранилища потока. См. PEP 539: новый C API для локального хранилища потоков для обзора и API хранилища для потоков (TSS) для полной справки. (Предоставлено Масаюки Ямамото в bpo-25658.)
Новая функциональность контекстных переменных предоставляет новое C API.
Новая функция PyImport_GetModule()
возвращает ранее импортированный
модуль с заданным именем. (Предоставлено Эриком Сноу в bpo-28411.)
Новый макрос Py_RETURN_RICHCOMPARE
упрощает написание расширенных
функций сравнения. (Предоставлено Петром Викториным в bpo-23699.)
Новый макрос Py_UNREACHABLE
можно использовать для обозначения
недоступных путей кода. (Предоставлено Барри Варшавой в bpo-31338.)
tracemalloc
теперь предоставляет C API через новые функции
PyTraceMalloc_Track()
и PyTraceMalloc_Untrack()
. (Предоставлено
Виктором Стиннером в bpo-30054.)
Новые статические маркеры import__find__load__start()
и
import__find__load__done()
можно использовать для отслеживания импорта
модулей. (Предоставлено Кристианом Хеймсом в bpo-31574.)
Поля name
и doc
структур PyMemberDef
,
PyGetSetDef
, PyStructSequence_Field
,
PyStructSequence_Desc
и wrapperbase
теперь имеют тип
const char *
, а не char *
. (Предоставил Сергей Сторчака в
bpo-28761.)
Результат PyUnicode_AsUTF8AndSize()
и PyUnicode_AsUTF8()
теперь
имеет тип const char *
, а не char *
. (Предоставлено Сергеем Сторчакой в
bpo-28769.)
Результатом PyMapping_Keys()
, PyMapping_Values()
и
PyMapping_Items()
теперь всегда является список, а не список или
кортеж. (Предоставлено Ореном Милманом в bpo-28280.)
Добавлены функции PySlice_Unpack()
и PySlice_AdjustIndices()
.
(Предоставил Сергей Сторчака в bpo-27867.)
PyOS_AfterFork()
устарел в пользу новых функций
PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
и
PyOS_AfterFork_Child()
. (Предоставлено Антуаном Питру в
bpo-16500.)
Синглтон PyExc_RecursionErrorInst
, который был частью общедоступного API,
был удалён, т. к. его никогда не очищающиеся элементы, могут вызвать
segfault во время финализации интерпретатора. Предоставлено Ксавьером де Гаем в
bpo-22898 и bpo-30697.
Добавлена поддержка C API для часовых поясов с помощью конструкторов часовых
поясов PyTimeZone_FromOffset()
и
PyTimeZone_FromOffsetAndName()
, а также доступ к одноэлементному коду
UTC с помощью PyDateTime_TimeZone_UTC
. Предоставлено Полом Ганссле в
bpo-10381.
Тип результатов PyThread_start_new_thread()
и
PyThread_get_thread_ident()
, а также параметр id
PyThreadState_SetAsyncExc()
изменились с long
на
unsigned long
. (Предоставил Сергей Сторчака в bpo-6532.)
PyUnicode_AsWideCharString()
теперь вызывает ValueError
, если
вторым аргументом является NULL
, а строка wchar_t*
содержит
нулевые символы. (Предоставил Сергей Сторчака в bpo-30708.)
Изменения в последовательности запуска и управлении распределителями
динамической памяти означают, что давно задокументированное требование вызывать
Py_Initialize()
перед вызовом большинства функций C API теперь более
активно используется, и несоблюдение этого требования может привести к ошибкам
сегментации при встраивании приложений. Дополнительные сведения см. в разделе
Портирование на Python 3.7 этого документа и в разделе Перед инициализацией Python
документации C API.
Новый PyInterpreterState_GetID()
возвращает уникальный идентификатор
для данного интерпретатора. (Предоставлено Эриком Сноу в bpo-29102.)
Py_DecodeLocale()
, Py_EncodeLocale()
теперь используют
кодировку UTF-8, когда включён режим UTF-8.
(Предоставлено Виктором Стиннером в bpo-29240.)
PyUnicode_DecodeLocaleAndSize()
и PyUnicode_EncodeLocale()
теперь используют кодировку текущей локали для обработчика ошибок
surrogateescape
. (Предоставлено Виктором Стиннером в bpo-29240.)
Параметры start и end PyUnicode_FindChar()
теперь настроены так,
чтобы вести себя как срезы строк. (Предоставлено Сян Чжаном в bpo-28822.)
Изменения сборки
Поддержка сборки --without-threads
удалена. Модуль threading
теперь
всегда доступен. (Предоставлено Антуаном Питру в bpo-31370.).
Полная копия libffi больше не поставляется для использования при сборке модуля
_ctypes
на платформах, отличных от OSX UNIX. Установленная
копия libffi теперь требуется при сборке _ctypes
на таких платформах.
(Предоставлено Закари Уэр в bpo-27979.)
Процесс сборки Windows больше не зависит от Subversion для загрузки внешних
источников, вместо этого для загрузки zip-файлов с Гитхаб используется скрипт
Python. Если Python 3.6 не найден в системе (через py -3.6
), для этой цели
используется NuGet для загрузки копии 32-разрядного Python. (Предоставлено
Закари Уэр в bpo-30450.)
Для модуля ssl
требуется libssl, совместимый с OpenSSL 1.0.2 или 1.1.
OpenSSL 1.0.1 подошел к концу 2016-12-31 и больше не поддерживается. LibreSSL
также временно не поддерживается. В выпусках LibreSSL до версии 2.6.4
отсутствуют необходимые API OpenSSL 1.0.2.
Оптимизации
Накладные расходы на вызов многих методов различных классов стандартной
библиотеки, реализованных на C, были значительно уменьшены за счёт портирования
большего количества кода для использования соглашения METH_FASTCALL
.
(Предоставлено Виктором Стиннером в bpo-29300, bpo-29507,
bpo-29452 и bpo-29286.)
Различные оптимизации сократили время запуска Python на 10% в Linux и до 30% в macOS. (Предоставлено Виктором Стиннером, Инада Наоки в bpo-29585 и Иваном Левкивским в bpo-31333.)
Вызовы методов теперь до 20% быстрее из-за изменений байт-кода, которые позволяют избежать создания связанных экземпляров метода. (Предоставили Юрий Селиванов и Инада Наоки в bpo-26110.)
Модуль asyncio
получил ряд заметных оптимизаций для часто используемых
функций:
- Функция
asyncio.get_event_loop()
была повторно реализована в C, чтобы сделать её в 15 раз быстрее. (Предоставлено Юрием Селивановым в bpo-32296.) - Оптимизировано управление обратными вызовами
asyncio.Future
. (Предоставлено Юрием Селивановым в bpo-32348.) asyncio.gather()
теперь на 15% быстрее. (Предоставил Юрий Селиванов в bpo-32355.)asyncio.sleep()
теперь работает до 2 раз быстрее, когда аргумент delay равен нулю или отрицателен. (Предоставлено Эндрю Светловым в bpo-32351.)- Снижение производительности в режиме отладки asyncio. (Предоставлено Антуаном Питру в bpo-31970.)
В результате работы над PEP 560 время импорта
typing
сократилось в 7 раз, и многие операции ввода теперь выполняются
быстрее. (Предоставлено Иваном Левкивским в bpo-32226.)
sorted()
и list.sort()
были оптимизированы для распространенных
случаев и теперь работают на 40–75% быстрее. (Предоставлено Эллиотом
Гороховским в bpo-28685.)
dict.copy()
теперь до 5,5 раз быстрее. (Предоставил Юрий Селиванов в
bpo-31179.)
hasattr()
и getattr()
теперь работают примерно в 4 раза быстрее,
если name не найден и obj не переопределяет object.__getattr__()
или
object.__getattribute__()
. (Предоставлено Инада Наоки в bpo-32544.)
Поиск определённых символов Юникода (например, украинской заглавной «Є») в строке был до 25 раз медленнее, чем поиск других символов. Теперь только в 3 раза медленнее в худшем случае. (Предоставил Сергей Сторчака в bpo-24821.)
Фабрика collections.namedtuple()
была переработана, чтобы ускорить
создание именованных кортежей в 4–6 раз. (Предоставлено Йелле Зейлстра с
дальнейшими улучшениями Инады Наоки, Сергеем Сторчака и Раймондом Хеттингером в
bpo-28638.)
date.fromordinal()
и date.fromtimestamp()
теперь в обычном случае
работают до 30% быстрее. (Предоставлено Полом Ганссле в bpo-32403.)
Функция os.fwalk()
теперь работает до 2 раз быстрее благодаря
использованию os.scandir()
. (Предоставил Сергей Сторчака в
bpo-25996.)
Скорость функции shutil.rmtree()
была улучшена на 20–40% благодаря
использованию функции os.scandir()
. (Предоставлено Сергеем Сторчакой в
bpo-28564.)
Оптимизировано сопоставление и поиск обычных выражений
без учёта
регистра. Поиск некоторых шаблонов теперь может быть до 20 раз быстрее.
(Предоставил Сергей Сторчака в bpo-30285.)
re.compile()
теперь преобразует параметр flags
в объект типа int,
если он равен RegexFlag
. Теперь он так же быстр, как Python 3.5, и быстрее,
чем Python 3.6, примерно на 10% в зависимости от шаблона. (Предоставлено Инада
Наоки в bpo-31671.)
Методы modify()
классов
selectors.EpollSelector
, selectors.PollSelector
и
selectors.DevpollSelector
могут быть примерно на 10% быстрее при
больших нагрузках. (Предоставлено Джампаоло Родола в bpo-30014)
Сворачивание констант было перемещено из оптимизатора глазка в новый оптимизатор AST, который может выполнять оптимизацию более последовательно. (Предоставлено Юджином Тодером и Инада Наоки в bpo-29469 и bpo-11549.)
Большинство функций и методов в abc
были переписаны на C. Это позволяет
создавать абстрактные базовые классы и вызывать для них isinstance()
и
issubclass()
в 1,5 раза быстрее. Это также сокращает время запуска Python
до 10%. (Предоставлено Иваном Левкивским и Инада Наоки в bpo-31333)
Значительное повышение скорости альтернативных конструкторов для
datetime.date
и datetime.datetime
за счет использования
конструкторов быстрого пути, когда не создаются подклассы. (Предоставлено Полом
Ганссле в bpo-32403)
В некоторых случаях значительно улучшена скорость сравнения экземпляров
array.array
. Теперь это от 10 до 70 раз быстрее при сравнении
массивов, содержащих значения одного и того же целочисленного типа.
(Предоставлено Адрианом Велгосиком в bpo-24700.)
Функции math.erf()
и math.erfc()
теперь используют (более быструю)
реализацию библиотеки C на большинстве платформ. (Предоставил Сергей Сторчака в
bpo-26121.)
Другие изменения CPython реализации
- Перехватчики трассировки теперь могут отказаться от получения
line
и выбрать получение событийopcode
от интерпретатора, установив соответствующие новые атрибутыf_trace_lines
иf_trace_opcodes
в отслеживаемом фрейме. (Предоставлено Ником Когланом в bpo-31344.) - Исправлены некоторые проблемы согласованности с атрибутами модуля пакета
пространства имён. Объекты модуля пространства имён теперь имеют
__file__
, для которого установлено значениеNone
(ранее не было установлено), и их__spec__.origin
также устанавливается наNone
(ранее строка"namespace"
). См. bpo-32305. Также модуль namespace объекты__spec__.loader
устанавливается на то же значение, что и__loader__
(ранее для первого было установлено значениеNone
). См. bpo-32303. - Словарь
locals()
теперь отображается в лексическом порядке, в котором были определены переменные. Ранее порядок не был определён. (Предоставлено Рэймондом Хеттингером в bpo-32690.) - Команда
distutils
upload
больше не пытается изменить символы конца строки CR на CRLF. Это устраняет проблему с повреждением sdist, которые заканчиваются байтом, эквивалентным CR. (Предоставлено Бо Бейлсом в bpo-32304.)
Устаревшее поведение Python
Выражения yield (предложения yield
и yield from
) теперь устарели в
выражениях и генераторах (за исключением итерируемого выражения в крайнем левом
предложении for
). Это гарантирует, что включения всегда немедленно
возвращают контейнер соответствующего типа (вместо потенциального возврата
объекта генератора), в то время как выражения генератора не
будут пытаться чередовать свой неявный вывод с выводом любых явных yield
выражений. В Python 3.7 такие выражения при компиляции выдают
DeprecationWarning
, в Python 3.8 это будет SyntaxError
.
(Предоставлено Сергеем Сторчакой в bpo-10544.)
Возвращение подкласса complex
из object.__complex__()
устарел и
будет ошибкой в будущих версиях Python. Это делает __complex__()
совместимым с object.__int__()
и object.__float__()
. (Предоставил
Сергей Сторчака в bpo-28894.)
Устаревшие модули, функции и методы Python
aifc
aifc.openfp()
устарела и будет удалена в Python 3.9. Вместо этого
используйте aifc.open()
. (Предоставлено Брайаном Кертином в
bpo-31985.)
asyncio
Поддержка непосредственно await
экземпляров asyncio.Lock
и других
примитивов асинхронной синхронизации устарела. Для получения и освобождения
ресурса синхронизации необходимо использовать асинхронный менеджер контекста.
(Предоставлено Эндрю Светловым в bpo-32253.)
Методы asyncio.Task.current_task()
и asyncio.Task.all_tasks()
устарели. (Предоставлено Эндрю Светловым в bpo-32250.)
collections
В Python 3.8 абстрактные базовые классы в collections.abc
больше не
будут отображаться в обычном модуле collections
. Это поможет создать
более четкое различие между классами и абстрактными базовыми
классами. (Предоставил Сергей Сторчака в bpo-25988.)
dbm
dbm.dumb
теперь поддерживает чтение файлов только для чтения и больше не
записывает индексный файл, если он не изменён. Предупреждение об устаревании
теперь выдается, если индексный файл отсутствует и воссоздан в режимах 'r'
и 'w'
(это будет ошибкой в будущих выпусках Python). (Предоставил Сергей
Сторчака в bpo-28847.)
enum
В Python 3.8 попытка проверить наличие объектов, отличных от Enum, в классах
Enum
вызовет TypeError
(например, 1 in Color
); аналогично,
попытка проверить объекты без флага в элементе Flag
вызовет
TypeError
(например, 1 in Perm.RW
); в настоящее время обе операции
вместо этого возвращают False
. (Предоставлено Итаном Фурманом в
bpo-33217.)
gettext
Использование нецелого значения для выбора формы множественного числа в
gettext
теперь не рекомендуется. Это никогда не работало правильно.
(Предоставлено Сергеем Сторчакой в bpo-28692.)
importlib
Методы MetaPathFinder.find_module()
(заменены на
MetaPathFinder.find_spec()
) и
PathEntryFinder.find_loader()
(заменены на
PathEntryFinder.find_spec()
),
объявленные устаревшими в Python 3.4, теперь вызывают DeprecationWarning
.
(Предоставлено Матиасом Буссонье в bpo-29576)
importlib.abc.ResourceLoader
ABC устарел в пользу
importlib.abc.ResourceReader
.
locale
locale.format()
устарел, вместо него используйте
locale.format_string()
. (Предоставлено Гарвитом в bpo-10379.)
macpath
macpath
теперь устарела и будет удалена в Python 3.8. (Предоставлено Чи
Сюань Йеном в bpo-9850.)
threading
dummy_threading
и _dummy_thread
устарели. Больше невозможно
собрать Python с отключенной многопоточностью. Вместо этого используйте
threading
. (Предоставлено Антуаном Питру в bpo-31370.)
socket
Усечение значения молчаливого аргумента в socket.htons()
и
socket.ntohs()
устарело. В будущих версиях Python, если переданный
аргумент больше 16 бит, будет возбуждено исключение. (Предоставлено Ореном
Милманом в bpo-28332.)
ssl
ssl.wrap_socket()
устарел. Вместо этого используйте
ssl.SSLContext.wrap_socket()
. (Предоставлено Кристианом Хеймсом в
bpo-28124.)
sunau
sunau.openfp()
устарел и будет удалён в Python 3.9. Вместо этого
используйте sunau.open()
. (Предоставлено Брайаном Кертином в
bpo-31985.)
sys
sys.set_coroutine_wrapper()
и sys.get_coroutine_wrapper()
устарели.
Недокументированная функция sys.callstats()
устарела и будет удалена в
будущей версии Python. (Предоставлено Виктором Стиннером в bpo-28799.)
wave
wave.openfp()
устарела и будет удалена в Python 3.9. Вместо этого
используйте wave.open()
. (Предоставлено Брайаном Кертином в
bpo-31985.)
Устаревшие функции и типы C API
Функция PySlice_GetIndicesEx()
устарела и заменена макросом, если
Py_LIMITED_API
не установлен или имеет значение в диапазоне от
0x03050400
до 0x03060000
(не включительно) или 0x03060100
или выше.
(Предоставил Сергей Сторчака в bpo-27867.)
PyOS_AfterFork()
устарел. Вместо этого используйте
PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
или
PyOS_AfterFork_Child()
. (Предоставлено Антуаном Питру в
bpo-16500.)
Удаление поддержки платформ
FreeBSD 9 и более ранние версии официально больше не поддерживаются.
Для полной поддержки Юникода, в том числе в модулях расширения, теперь ожидается, что платформы *nix будут предоставлять по крайней мере одно из:
C.UTF-8
(полная локаль),C.utf8
(полная локаль) илиUTF-8
(локаль только дляLC_CTYPE
) в качестве альтернативы устаревшейASCII
- на основеC
локали.OpenSSL 0.9.8 и 1.0.1 больше не поддерживаются, а это означает, что для создания CPython 3.7 с поддержкой SSL/TLS на старых платформах, использующих данные версии, требуются настраиваемые параметры сборки, которые ссылаются на более новую версию OpenSSL.
Примечательно, что проблема затрагивает дистрибутивы Debian 8 (он же «jessie») и Ubuntu 14.04 (он же «Trusty») LTS Linux, поскольку они по-прежнему используют OpenSSL 1.0.1 по умолчанию.
Debian 9 («stretch») и Ubuntu 16.04 («xenial»), а также последние релизы других релизов LTS Linux (например, RHEL/CentOS 7.5, SLES 12-SP3) используют OpenSSL 1.0.2 или более позднюю версию и продолжают поддерживаться в конфигурации сборки по умолчанию.
Собственный CPython Конфигурационный файл CI представляет собой пример использования SSL инфраструктуры тестирования совместимости в множестве тестов CPython для сборки и связывания с OpenSSL 1.1.0, а не с устаревшей системой, предоставляемой OpenSSL.
Удаление API и функций
Следующие функции и API были удалены из Python 3.7:
- Функция
os.stat_float_times()
удалена. Она была введена в Python 2.3 для обратной совместимости с Python 2.2 и устарела, начиная с Python 3.1. - Неизвестные escape-последовательности, состоящие из
'\'
и буквы ASCII в заменяющих шаблонах дляre.sub()
, устарели в Python 3.5 и теперь вызывают ошибку. - Удалена поддержка аргумента exclude в
tarfile.TarFile.add()
. Он устарел в Python 2.7 и 3.2. Вместо этого используйте аргумент filter. - Функция
splitunc()
в модулеntpath
устарела в Python 3.1 и теперь удалена. Вместо этого используйте функциюsplitdrive()
. collections.namedtuple()
больше не поддерживает параметр verbose или атрибут_source
, которые отображали сгенерированный исходный код для именованного класса кортежа. Это было частью оптимизации, предназначенной для ускорения создания классов. (Предоставлено Йелле Зейлстра с дальнейшими улучшениями Инада Наоки, Сергея Сторчака и Раймонда Хеттингера в bpo-28638.)- Функции
bool()
,float()
,list()
иtuple()
больше не принимают ключевые аргументы. Первый аргументint()
теперь можно передавать только как позиционный аргумент. - Удалены ранее устаревшие в Python 2.4 классы
Plist
,Dict
и_InternalDict
в модулеplistlib
. Значения Dict в результате функцийreadPlist()
иreadPlistFromBytes()
теперь являются обычными словари. Вы больше не можете использовать доступ к атрибутам для доступа к элементам данных словарей. - Функция
asyncio.windows_utils.socketpair()
удалена. Вместо этого используйте функциюsocket.socketpair()
, она доступна на всех платформах, начиная с Python 3.5.asyncio.windows_utils.socketpair
был просто псевдонимомsocket.socketpair
в Python 3.5 и новее. asyncio
больше не экспортирует модулиselectors
и_overlapped
какasyncio.selectors
иasyncio._overlapped
. Заменитьfrom asyncio import selectors
наimport selectors
.- Прямое создание объектов
ssl.SSLSocket
иssl.SSLObject
теперь запрещено. Конструкторы никогда не документировались, не тестировались и не разрабатывались как общедоступные конструкторы. Пользователи должны были использоватьssl.wrap_socket()
илиssl.SSLContext
. (Предоставлено Кристианом Хеймсом в bpo-32951.) - Неиспользуемая команда
distutils
install_misc
удалена. (Предоставлено Эриком Н. Вандер Вил в bpo-29218.)
Удалённые модули
Модуль fpectl
удалён. Он никогда не был включён по умолчанию, никогда не
работал корректно на x86-64 и изменял ABI Python таким образом, что это привело
к неожиданной поломке C расширений. (Предоставлено Натаниэлем Дж. Смитом в
bpo-29137.)
Изменения только для Windows
Средство запуска Python (py.exe) может принимать 32- и 64-битные спецификаторы
без обязательного указания младшей версии. Таким образом, py
-3-32
и py -3-64
становятся действительными, а также py -3.7-32
, а
также формы -m-64 и -m.n-64 теперь принимаются для принудительного
использования 64-битного Python, даже если в противном случае использовался бы
32-битный. Если указанная версия недоступна, py.exe завершит работу с ошибкой.
(Предоставлено Стивом Барнсом в bpo-30291.)
Средство запуска можно запустить как py -0
, чтобы получить список
установленных питонов, со значением по умолчанию, отмеченным звездочкой.
Выполнение py -0p
будет включать пути. Если py запущен со спецификатором версии, который не
может быть сопоставлен, он также напечатает список краткой формы доступных
спецификаторов. (Предоставлено Стивом Барнсом в bpo-30362.)
Портирование на Python 3.7
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.
Изменения в поведении Python
Имена
async
иawait
теперь являются зарезервированными ключевыми словами. Код, использующий данные имена в качестве идентификаторов, теперь будет вызыватьSyntaxError
. (Предоставлено Йелле Зейлстра в bpo-30406.)PEP 479 включён для всего кода в Python 3.7, что означает, что исключения
StopIteration
, вызванные прямо или косвенно в корутинах и генераторах, преобразуются в исключенияRuntimeError
. (Предоставлено Юрием Селивановым в bpo-32670.)Методы
object.__aiter__()
больше нельзя объявлять асинхронными. (Предоставил Юрий Селиванов в bpo-31709.)Из-за недосмотра более ранние версии Python ошибочно принимали следующий синтаксис:
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 теперь правильно генерирует
SyntaxError
, т. к. выражение генератора всегда должно находиться непосредственно внутри набора скобок и не может иметь запятую ни с одной стороны, а дублирование скобок можно пропустить только при вызовах. (Предоставлено Сергеем Сторчакой в bpo-32012 и bpo-32023.)При использовании переключателя
-m
начальный рабочий каталог теперь добавляется вsys.path
, а не пустая строка (которая динамически обозначала текущий рабочий каталог во время каждого импорта). Любые программы, которые проверяют пустую строку или иным образом полагаются на предыдущее поведение, должны быть соответствующим образом обновлены (например, путём проверкиos.getcwd()
илиos.path.dirname(__main__.__file__)
, в зависимости от того, почему код сначала проверял пустую строку).
Изменения в API Python
socketserver.ThreadingMixIn.server_close()
теперь ожидает завершения всех потоков, не являющихся демонами. Устанавливает для нового атрибута классаsocketserver.ThreadingMixIn.block_on_close
значениеFalse
, чтобы получить поведение до версии 3.7. (Предоставлено Виктором Стиннером в bpo-31233 и bpo-33540.)socketserver.ForkingMixIn.server_close()
теперь ожидает завершения всех дочерних процессов. Устанавливает для нового атрибута классаsocketserver.ForkingMixIn.block_on_close
значениеFalse
, чтобы получить поведение до версии 3.7. (Предоставлено Виктором Стиннером в bpo-31151 и bpo-33540.)Функция
locale.localeconv()
теперь временно устанавливает для локалиLC_CTYPE
значениеLC_NUMERIC
в некоторых случаях. (Предоставлено Виктором Стиннером в bpo-31900.)pkgutil.walk_packages()
теперь вызываетValueError
, если path является строкой. Ранее возвращался пустой список. (Предоставлено Саньямом Кураной в bpo-24744.)Аргумент строки формата для
string.Formatter.format()
теперь только позиционный. Передача его в качестве ключевого аргумента устарела в Python 3.5. (Предоставил Сергей Сторчака в bpo-29193.)Атрибуты
key
,value
иcoded_value
классаhttp.cookies.Morsel
теперь доступны только для чтения. Назначение им устарело в Python 3.5. Для их установки используйте методset()
. (Предоставил Сергей Сторчака в bpo-29192.)Аргумент mode
os.makedirs()
больше не влияет на биты прав доступа к файлам вновь созданных каталогов промежуточного уровня. Чтобы установить их биты прав доступа к файлам, вы можете установить umask перед вызовомmakedirs()
. (Предоставлено Сергеем Сторчакой в bpo-19930.)Тип
struct.Struct.format
теперьstr
вместоbytes
. (Предоставлено Виктором Стиннером в bpo-21071.)parse_multipart()
теперь принимает аргументы encoding и errors и возвращает те же результаты, что иFieldStorage
: для нефайловых полей значение, связанное с ключом, представляет собой список строк, а не байтов. (Предоставлено Пьером Квентелем в bpo-29979.)Из-за внутренних изменений в
socket
вызовsocket.fromshare()
для сокета, созданногоsocket.share
, в более старых версиях Python не поддерживается.repr
дляBaseException
изменён, чтобы не включать запятую в конце. Это изменение затрагивает большинство исключений. (Предоставил Сергей Сторчака в bpo-30399.)repr
дляdatetime.timedelta
изменён, чтобы включить ключевые аргументы в выходные данные. (Предоставлено Уткаршем Упадхьяем в bpo-30302.)Поскольку
shutil.rmtree()
теперь реализуется с помощью функцииos.scandir()
, указанный пользователем обработчик onerror теперь вызывается с первым аргументомos.scandir
вместоos.listdir
, когда список каталога не удается.Поддержка вложенных множеств и операций над множествами в регулярных выражениях, как в Техническом стандарте Юникод № 18, может быть добавлена в будущем. Это изменит синтаксис. Чтобы облегчить это будущее изменение,
FutureWarning
будет вызвано в неоднозначных случаях на данный момент. К ним относятся множества, начинающиеся с буквального'['
или содержащие буквенные последовательности символов'--'
,'&&'
,'~~'
и'||'
. Чтобы избежать предупреждения, экранируйте их обратной косой чертой. (Предоставлено Сергеем Сторчакой в bpo-30349.)Изменён результат разделения строки
регулярного выражения
, который может соответствовать пустой строке. Например, разбиение наr'\s*'
теперь будет разбиваться не только на пробелы, как это было раньше, но и на пустые строки перед всеми символами, не являющимися пробелами, и непосредственно перед концом строки. Предыдущее поведение можно восстановить, изменив шаблон наr'\s+'
. Начиная с версии Python 3.5 для таких шаблонов вызываетсяFutureWarning
.Для шаблонов, которые соответствуют как пустым, так и непустым строкам, результат поиска всех совпадений может быть изменён и в других случаях. Например, в строке
'a\n\n'
шаблонr'(?m)^\s*?$'
будет соответствовать не только пустым строкам в позициях 2 и 3, но и строке'\n'
в позициях 2-3. Чтобы соответствовать только пустым строкам, шаблон следует переписать какr'(?m)^[^\S\n]*$'
.re.sub()
теперь заменяет пустые совпадения рядом с предыдущим непустым совпадением. Например,re.sub('x*', '-', 'abxd')
теперь возвращает'-a-b--d-'
вместо'-a-b-d-'
(первый минус между «b» и «d» заменяет «x», а второй минус заменяет пустую строку между «x» и «d»).Изменить
re.escape()
, чтобы экранировать только специальные символы регулярных выражений, а не все символы, кроме букв ASCII, цифр и'_'
. (Предоставил Сергей Сторчака в bpo-29995.)Фреймы
tracemalloc.Traceback
теперь сортируются от самых старых к последним, чтобы лучше соответствоватьtraceback
. (Предоставлено Джесси Баккером в bpo-32121.)В операционных системах, поддерживающих битовые флаги
socket.SOCK_NONBLOCK
илиsocket.SOCK_CLOEXEC
,socket.type
больше не применяется. Поэтому проверки типаif sock.type == socket.SOCK_STREAM
работают должным образом на всех платформах. (Предоставил Юрий Селиванов в bpo-32331.)В Windows значение по умолчанию для аргумента close_fds
subprocess.Popen
было изменено сFalse
наTrue
при перенаправлении стандартных дескрипторов. Если вы ранее зависели от наследуемых дескрипторов при использованииsubprocess.Popen
со стандартным перенаправлением ввода-вывода, вам придется передатьclose_fds=False
, чтобы сохранить предыдущее поведение, или использоватьSTARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
, неявно влияющий наimportlib.invalidate_caches()
, теперь удаляет записи вsys.path_importer_cache
, для которых установлено значениеNone
. (Предоставлено Бреттом Кэнноном в bpo-33169.)В
asyncio
,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop.getaddrinfo()
,loop.getnameinfo()
были изменены методы корутины, соответствующие их документации. Ранее данные методы возвращали экземплярыasyncio.Future
. (Предоставил Юрий Селиванов в bpo-32327.)asyncio.Server.sockets
теперь возвращает копию внутреннего списка сокетов сервера, а не возвращает его напрямую. (Предоставил Юрий Селиванов в bpo-32662.)Struct.format
теперь является экземпляромstr
вместо экземпляраbytes
. (Предоставлено Виктором Стиннером в bpo-21071.)Подпарсеры
argparse
теперь можно сделать обязательными, передавrequired=True
вArgumentParser.add_subparsers()
. (Предоставлено Энтони Соттилем в bpo-26510.)ast.literal_eval()
теперь более строгий. Сложение и вычитание произвольных чисел больше не разрешено. (Предоставлено Сергеем Сторчакой в bpo-31778.)Calendar.itermonthdates
теперь будет постоянно вызывать исключение, когда дата выходит за пределы диапазона от0001-01-01
до9999-12-31
. Для поддержки приложений, которые не допускают таких исключений, можно использовать новыеCalendar.itermonthdays3
иCalendar.itermonthdays4
. Новые методы возвращают кортежи и не ограничены диапазоном, поддерживаемымdatetime.date
. (Предоставлено Александром Белопольским в bpo-28292.)collections.ChainMap
теперь сохраняет порядок базовых сопоставлений. (Предоставлено Рэймондом Хеттингером в bpo-32792.)Метод
submit()
concurrent.futures.ThreadPoolExecutor
иconcurrent.futures.ProcessPoolExecutor
теперь вызываетRuntimeError
, если вызывается во время завершения работы интерпретатора. (Предоставлено Марком Немеком в bpo-33097.)Конструктор
configparser.ConfigParser
теперь используетread_dict()
для обработки значений по умолчанию, что делает его поведение совместимым с остальной частью парсера. Нестроковые ключи и значения в словаре по умолчанию теперь неявно преобразуются в строки. (Предоставлено Джеймсом Токнеллом в bpo-23835.)Несколько недокументированных внутренних импортов были удалены. Одним из примеров является то, что
os.errno
больше не доступен; вместо этого используйтеimport errno
напрямую. Обратите внимание, что такой недокументированный внутренний импорт может быть удалён в любое время без предварительного уведомления, даже в микроверсиях.
Изменения в C API
Функция PySlice_GetIndicesEx()
считается небезопасной для
последовательностей с изменяемым размером. Если индексы слайсов являются не
экземплярами int
, а объектами, реализующими метод __index__()
,
размер последовательности можно изменить после передачи её длины в
PySlice_GetIndicesEx()
. Это может привести к возвращению индексов вне
длины последовательности. Во избежание возможных проблем используйте новые
функции PySlice_Unpack()
и PySlice_AdjustIndices()
.
(Предоставил Сергей Сторчака в bpo-27867.)
Байт-код CPython меняется
Есть два новых кода операции: LOAD_METHOD
и CALL_METHOD
.
(Предоставили Юрий Селиванов и Инада Наоки в bpo-26110.)
Код операции STORE_ANNOTATION
был удалён. (Предоставлено Марком
Шенноном в bpo-32550.)
Изменения только для Windows
Файл, используемый для переопределения sys.path
, теперь называется
<python-executable>._pth
вместо 'sys.path'
. См. Поиск модулей
для получения дополнительной информации. (Предоставлено Стивом Дауэром в
bpo-28137.)
Другие изменения CPython реализации
В рамках подготовки к возможным будущим изменениям общедоступного API инициализации среды выполнения CPython (см. PEP 432 для первоначального, но несколько устаревшего проекта) внутренняя логика управления запуском и конфигурацией CPython была значительно реорганизована. Хотя данные обновления должны быть полностью прозрачными как для встраиваемых приложений, так и для пользователей обычного интерфейса командной строки CPython, они упоминаются здесь, поскольку рефакторинг изменяет внутренний порядок различных операций во время запуска интерпретатора и, следовательно, может выявить ранее скрытые дефекты, либо во встраиваемых приложениях или в самом CPython. (Первоначально предоставлено Ником Когланом и Эриком Сноу как часть bpo-22257, а затем обновлено Ником, Эриком и Виктором Стиннером в ряде других релизов). Затронуты некоторые известные детали:
PySys_AddWarnOptionUnicode()
в настоящее время нельзя использовать для встраивания приложений из-за необходимости создания Юникод объекта перед вызовом Py_Initialize. Вместо этого используйтеPySys_AddWarnOption()
.- Фильтры предупреждений, добавленные приложением для встраивания с кодом
PySys_AddWarnOption()
, теперь должны более последовательно иметь приоритет над фильтрами по умолчанию, установленными интерпретатором.
Из-за изменений в способе настройки фильтров предупреждений по умолчанию
установка Py_BytesWarningFlag
на значение больше единицы больше
недостаточно для отправки сообщений BytesWarning
и их преобразования в
исключения. Вместо этого необходимо установить флаг (чтобы предупреждения
выдавались в первую очередь) и добавить явный фильтр предупреждений
error::BytesWarning
для преобразования их в исключения.
Из-за изменения способа обработки строк документации компилятором неявный
return None
в теле функции, состоящей исключительно из строки документации,
теперь помечен как встречающийся в той же строке, что и строка документации, а
не в строке заголовка функции.
Текущее состояние исключения было перемещено из объекта фрейма в корутину. Это упростило интерпретатор и исправило несколько непонятных ошибок, вызванных наличием состояния исключения подкачки при входе или выходе из генератора. (Предоставлено Марком Шенноном в bpo-25612.)
Заметные изменения в Python 3.7.1
Начиная с версии 3.7.1, Py_Initialize()
теперь последовательно
считывает и учитывает все те же параметры среды, что и Py_Main()
(в
более ранних версиях Python он учитывал неточно определённое подмножество
данных переменных среды, тогда как в Python 3.7.0 он не считывал никаких
параметров из них из-за bpo-34247). Если такое поведение нежелательно,
устанавливает для Py_IgnoreEnvironmentFlag
значение 1 перед вызовом
Py_Initialize()
.
В 3.7.1 API C для переменных контекста был обновлён для использования указателей
PyObject
. См. также bpo-34762.
В версии 3.7.1 модуль tokenize
теперь неявно вызывает токен NEWLINE
при вводе данных без завершающей новой строки. Это поведение теперь
соответствует тому, что делает C токенизатор внутри. (Предоставлено Аммаром
Аскаром в bpo-33899.)
Заметные изменения в Python 3.7.2
В версии 3.7.2 venv
в Windows больше не копирует исходные двоичные
файлы, а вместо этого создаёт сценарии перенаправителя с именами python.exe
и pythonw.exe
. Это решает давнюю проблему, из-за которой все виртуальные
среды приходилось обновлять или создавать заново при каждом обновлении Python.
Однако обратите внимание, что в этом выпуске по-прежнему потребуется
воссоздание виртуальных сред, чтобы получить новые сценарии.
Заметные изменения в Python 3.7.6
Из соображений безопасности параметр reuse_address
asyncio.loop.create_datagram_endpoint()
больше не поддерживается. Это
связано с поведением опции сокета SO_REUSEADDR
в UDP. Дополнительные
сведения см. в документации для loop.create_datagram_endpoint()
.
(Предоставили Кайл Стэнли, Антуан Питру и Юрий Селиванов в bpo-37228.)
Заметные изменения в Python 3.7.10
Более ранние версии Python позволяли использовать как ;
, так и &
в
качестве разделителей параметров запроса в urllib.parse.parse_qs()
и
urllib.parse.parse_qsl()
. Из соображений безопасности и в соответствии с
более новыми рекомендациями W3C это было изменено, чтобы разрешить только один
ключ-разделитель &
по умолчанию. Это изменение также затрагивает
cgi.parse()
и cgi.parse_multipart()
, поскольку они используют
затронутые функции внутри. Для получения более подробной информации см.
соответствующую документацию. (Предоставлено Адамом Голдшмидтом, Сентилом
Кумараном и Кеном Джином в bpo-42967.)