Что нового в Python 3.9¶
- Редактор:
Лукаш Ланга
В этой статье описываются новые возможности Python 3.9 по сравнению с версией 3.8. Версия Python 3.9 была выпущена 5 октября 2020 года. Более подробную информацию смотрите в changelog.
См.также
PEP 596 - Расписание выхода Python 3.9
Краткое описание - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 584, операторы объединения добавлены в
dict
;PEP 585, введите обобщенные подсказки в стандартных коллекциях;
PEP 614, смягчены грамматические ограничения для декораторов.
Новые встроенные функции:
PEP 616, строковые методы для удаления префиксов и суффиксов.
Новые возможности в стандартной библиотеке:
PEP 593, гибкие функциональные и переменные аннотации;
os.pidfd_open()
добавлено, что позволяет управлять процессом без скачков и сигналов.
Улучшения в работе переводчика:
PEP 573, быстрый доступ к состоянию модуля из методов типов расширений C;
PEP 617, CPython теперь использует новый синтаксический анализатор, основанный на PEG;
ряд встроенных функций Python (range, tuple, set, frozenset, list, dict) теперь ускорен с помощью вызова PEP 590 vector;
сборка мусора не блокирует воскресшие объекты;
ряд модулей Python (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
) теперь используют многофазную инициализацию, как определено в PEP 489;ряд стандартных библиотечных модулей (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
) теперь используют стабильный ABI, определенный в PEP 384.
Новые библиотечные модули:
PEP 615, база данных часовых поясов IANA теперь присутствует в стандартной библиотеке в модуле
zoneinfo
;реализация топологического вида графа теперь представлена в новом модуле
graphlib
.
Изменения в процессе выпуска:
PEP 602, CPython придерживается ежегодного цикла выпуска.
Вы должны проверить наличие предупреждения об устаревании в вашем коде¶
Когда еще поддерживался Python 2.7, многие функциональные возможности Python 3 были сохранены для обеспечения обратной совместимости с Python 2.7. С прекращением поддержки Python 2 эти уровни обратной совместимости были удалены или будут удалены в ближайшее время. Большинство из них выдавали предупреждение DeprecationWarning
в течение нескольких лет. Например, использование collections.Mapping
вместо collections.abc.Mapping
выдает предупреждение DeprecationWarning
начиная с версии Python 3.3, выпущенной в 2012 году.
Протестируйте свое приложение с помощью -W
default
параметр командной строки для просмотра DeprecationWarning
и PendingDeprecationWarning
, или даже с помощью -W
error
для лечения их как ошибки. Warnings Filter может использоваться для игнорирования предупреждений стороннего кода.
Python 3.9 - это последняя версия, обеспечивающая уровни обратной совместимости с Python 2, чтобы дать сопровождающим Python-проектов больше времени для организации удаления поддержки Python 2 и добавления поддержки Python 3.9.
Псевдонимы Abstract Base Classes в модуле collections
, как и псевдонимы collections.Mapping
в collections.abc.Mapping
, сохранены для последней версии для обеспечения обратной совместимости. Они будут удалены из Python 3.10.
В более общем плане, попробуйте запустить свои тесты в режиме Python Development Mode, который поможет подготовить ваш код к совместимости со следующей версией Python.
Примечание: в этой версии Python также был удален ряд ранее существовавших устаревших функций. Обратитесь к разделу Удаленный.
Новые возможности¶
Операторы слияния и обновления словаря¶
Операторы слияния (|
) и обновления (|=
) были добавлены во встроенный класс dict
. Они дополняют существующие методы объединения словарей dict.update
и {**d1, **d2}
.
Пример:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
Смотрите PEP 584 для получения полного описания. (Автор Брандт Бухер в bpo-36144).
Новые строковые методы для удаления префиксов и суффиксов¶
str.removeprefix(prefix)
и str.removesuffix(suffix)
добавлены для простого удаления ненужного префикса или суффикса из строки. Также были добавлены соответствующие методы bytes
, bytearray
, и collections.UserString
. Полное описание приведено в PEP 616. (Автор: Деннис Суини в статье bpo-39939.)
Введите обобщенные подсказки в стандартных коллекциях¶
В аннотациях к типам теперь можно использовать встроенные типы коллекций, такие как list
и dict
, в качестве универсальных типов вместо импорта соответствующих типов с заглавной буквы (например, List
или Dict
) из typing
. Некоторые другие типы в стандартной библиотеке также теперь являются универсальными, например queue.Queue
.
Пример:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
Смотрите PEP 585 для получения более подробной информации. ((Материалы предоставлены Гвидо ван Россумом, Итаном Смитом и Батуханом Ташкая в bpo-39481.)
Новый синтаксический анализатор¶
В Python 3.9 используется новый синтаксический анализатор, основанный на PEG вместо LL(1). Производительность нового синтаксического анализатора примерно сравнима с производительностью старого синтаксического анализатора, но формализм PEG более гибкий, чем LL(1), когда дело доходит до разработки новых языковых функций. Мы начнем использовать эту гибкость в Python 3.10 и более поздних версиях.
Модуль ast
использует новый синтаксический анализатор и выдает тот же AST, что и старый синтаксический анализатор.
В Python 3.10 старый синтаксический анализатор будет удален, а вместе с ним и вся функциональность, которая от него зависит (в первую очередь модуль parser
, который уже давно устарел). Только в Python 3.9 * вы можете переключиться обратно на синтаксический анализатор LL(1), используя переключатель командной строки (-X oldparser
) или переменную окружения (PYTHONOLDPARSER=1
).
Смотрите PEP 617 для получения более подробной информации. (Материалы предоставлены Гвидо ван Россумом, Пабло Галиндо и Лисандросом Николау в bpo-40334.)
Другие языковые изменения¶
__import__()
теперь вызываетImportError
вместоValueError
, что обычно происходило, когда относительный импорт проходил мимо пакета верхнего уровня. (Добавлено Нгалимом Сирегаром в bpo-37444.)Python теперь получает абсолютный путь к имени файла скрипта, указанному в командной строке (например:
python3 script.py
): атрибут__file__
модуля__main__
стал абсолютным, а не относительным путем. Теперь эти пути остаются действительными после изменения текущего каталога наos.chdir()
. В качестве побочного эффекта обратная трассировка также отображает абсолютный путь для__main__
фреймов модуля в этом случае. (Автор: Виктор Стиннер в bpo-20443.)В Python Development Mode и debug build аргументы encoding и errors теперь проверяются для операций кодирования и декодирования строк. Примеры:
open()
,str.encode()
иbytes.decode()
.По умолчанию, для обеспечения наилучшей производительности, аргумент errors проверяется только при первой ошибке кодирования/декодирования, а аргумент encoding иногда игнорируется для пустых строк. (Добавлено Виктором Стиннером в bpo-37388.)
"".replace("", s, n)
теперь возвращаетs
вместо пустой строки для всех ненулевых значенийn
. Теперь это согласуется с"".replace("", s)
. Аналогичные изменения внесены для объектовbytes
иbytearray
. (Добавлено Сергеем Сторчакой в bpo-28029.)Любое допустимое выражение теперь можно использовать как decorator. Ранее грамматика была гораздо более строгой. Подробности смотрите в PEP 614. (Автор Брандт Бухер в bpo-39702).
Улучшена справка для модуля
typing
. Строки документации теперь отображаются для всех специальных форм и специальных универсальных псевдонимов (например,Union
иList
). Использованиеhelp()
с общим псевдонимом, таким какList[int]
, приведет к отображению справки для соответствующего конкретного типа (в данном случаеlist
). (Добавлено Сергеем Сторчакой в bpo-40257.)Параллельный запуск
aclose()
/asend()
/athrow()
теперь запрещен, иag_running
теперь отражает фактическое состояние работы асинхронного генератора. (Автор: Юрий Селиванов в статье bpo-30773.)Непредвиденные ошибки при вызове метода
__iter__
больше не маскируютсяTypeError
в оператореin
и функцияхcontains()
,indexOf()
иcountOf()
модуляoperator
. (Автор - Сергей Сторчака в bpo-40824.)Лямбда-выражения, не заключенные в скобки, больше не могут быть частью выражения в предложении
if
в понятиях и генераторных выражениях. Подробности см. в bpo-41848 и bpo-43755.
Новые модули¶
информация о зоне¶
Модуль zoneinfo
обеспечивает поддержку базы данных часовых поясов IANA в стандартной библиотеке. Он добавляет zoneinfo.ZoneInfo
, конкретную реализацию datetime.tzinfo
, поддерживаемую данными о часовых поясах системы.
Пример:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
В качестве резервного источника данных для платформ, которые не поддерживают базу данных IANA, модуль tzdata
был выпущен в виде пакета от первого лица, распространяемого через PyPI и поддерживаемого командой CPython core.
См.также
- PEP 615 – Поддержка базы данных часовых поясов IANA в стандартной библиотеке
PEP, написанный и реализованный Полом Гансле
графический файл¶
Был добавлен новый модуль graphlib
, содержащий класс graphlib.TopologicalSorter
, который предлагает функциональность для выполнения топологической сортировки графов. (Авторы Пабло Галиндо, Тим Питерс и Ларри Хастингс в статье bpo-17005).
Улучшенные модули¶
аст¶
Добавлена опция indent в dump()
, которая позволяет выводить многострочный текст с отступом. (Добавлено Сергеем Сторчакой в bpo-37995.)
Добавлена ast.unparse()
в качестве функции в модуле ast
, которая может использоваться для разбора объекта ast.AST
и создания строки с кодом, который при разборе создаст эквивалентный объект ast.AST
. (Материалы предоставлены Пабло Галиндо и Батуханом Таскайей в bpo-38870.)
Добавлены строки документации к узлам AST, содержащие сигнатуру ASDL, используемую для создания этого узла. (Добавлено Батуханом Таскайей в bpo-39638.)
асинхронный¶
Из-за серьезных проблем с безопасностью параметр reuse_address в asyncio.loop.create_datagram_endpoint()
больше не поддерживается. Это связано с поведением параметра сокета SO_REUSEADDR
в протоколе UDP. Более подробную информацию смотрите в документации для loop.create_datagram_endpoint()
. (Авторы: Кайл Стэнли, Антуан Питру и Юрий Селиванов в bpo-37228.)
Добавлен новый coroutine shutdown_default_executor()
, который планирует завершение работы для исполнителя по умолчанию, который ожидает завершения закрытия ThreadPoolExecutor
. Кроме того, asyncio.run()
был обновлен для использования нового coroutine. (Добавлено Кайлом Стэнли в bpo-34037.)
Добавлена asyncio.PidfdChildWatcher
, специфичная для Linux реализация дочернего наблюдателя, которая опрашивает файловые дескрипторы процессов. (bpo-38692)
Добавлен новый coroutine asyncio.to_thread()
. Он в основном используется для запуска функций, связанных с вводом-выводом, в отдельном потоке, чтобы избежать блокировки цикла обработки событий, и по сути работает как высокоуровневая версия run_in_executor()
, которая может напрямую принимать аргументы ключевых слов. (Материалы предоставлены Кайлом Стэнли и Юрием Селивановым в bpo-32309.)
При отмене задачи из-за тайм-аута asyncio.wait_for()
теперь будет ждать завершения отмены также в случае, когда timeout равен <= 0, как это происходит с положительными тайм-аутами. (Автор - Элвис Пранскявичус в bpo-32751.)
asyncio
теперь вызывает TyperError
при вызове несовместимых методов с сокетом ssl.SSLSocket
. (Добавлено Идо Майклом в bpo-37404.)
компилировать все¶
Добавлена новая возможность использовать жесткие ссылки для дублированных файлов .pyc
: параметр hardlink_dupes и параметр командной строки –hardlink-dupes. (Автор - Люмир «Френзи» Балхар в bpo-40495.)
Добавлены новые опции для манипулирования путями в результирующих файлах .pyc
: параметры stripdir, prependdir, limit_sl_dest и параметры командной строки -s, -p, -e. Добавлена возможность многократного указания параметра для уровня оптимизации. (Добавлено Люмиром «Frenzy» Балхаром в bpo-38112.)
параллельные фьючерсы¶
Добавлен новый параметр cancel_futures в concurrent.futures.Executor.shutdown()
, который отменяет все ожидающие выполнения фьючерсы, которые еще не начали выполняться, вместо того, чтобы ждать их завершения перед завершением работы исполнителя. (Добавлено Кайлом Стэнли в bpo-39349.)
Удалены потоки демонов из ThreadPoolExecutor
и ProcessPoolExecutor
. Это улучшает совместимость с вспомогательными интерпретаторами и предсказуемость процессов их завершения. (Добавлено Кайлом Стэнли в bpo-39812).
Рабочие элементы в ProcessPoolExecutor
теперь запускаются по требованию, только когда нет доступных незанятых рабочих элементов для повторного использования. Это оптимизирует затраты на запуск и сокращает количество потерянного процессорного времени для незанятых рабочих элементов. (Добавлено Кайлом Стэнли в bpo-39207).
проклятия¶
Добавлены функции curses.get_escdelay()
, curses.set_escdelay()
, curses.get_tabsize()
, и curses.set_tabsize()
. (Автор Энтони Соттил в bpo-38312.)
дата и время¶
Методы isocalendar()
из datetime.date
и isocalendar()
из datetime.datetime
теперь возвращают namedtuple()
вместо tuple
. (Предоставлено Донхи На в bpo-24416.)
дистрибутивы¶
Команда upload теперь создает дайджесты хэшей SHA2-256 и Blake2b-256. Она пропускает MD5 на платформах, которые блокируют дайджест MD5. (Автор: Кристиан Хеймс в bpo-40698.)
fcntl¶
Добавлены константы F_OFD_GETLK
, F_OFD_SETLK
и F_OFD_SETLKW
. (Добавлено Донхи На в bpo-38602.)
ftplib (продолжение)¶
FTP
и FTP_TLS
теперь создают ValueError
, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Донхи На в bpo-39259.)
gc (общий сбор)¶
Когда сборщик мусора создает коллекцию, в которой некоторые объекты возрождаются (они доступны из-за пределов изолированных циклов после выполнения финализаторов), не блокируйте сбор всех объектов, которые все еще недоступны. (Материалы предоставлены Пабло Галиндо и Тимом Питерсом в bpo-38379.)
Добавлена новая функция gc.is_finalized()
для проверки того, был ли объект завершен сборщиком мусора. (Добавлено Пабло Галиндо в bpo-39322.)
хэшлиб¶
Модуль hashlib
теперь может использовать хэши SHA 3 и использовать XOF из OpenSSL, когда это возможно. (Автор: Кристиан Хеймс в bpo-37630).
Встроенные хэш-модули теперь можно отключить с помощью ./configure --without-builtin-hashlib-hashes
или выборочно включить, например, с помощью ./configure --with-builtin-hashlib-hashes=sha3,blake2
, чтобы принудительно использовать реализацию на основе OpenSSL. (Автор Кристиан Хеймс в bpo-40479)
http¶
Коды состояния HTTP 103 EARLY_HINTS
, 418 IM_A_TEAPOT
и 425 TOO_EARLY
добавляются к http.HTTPStatus
. (Авторы: Донхи На в bpo-39509 и Росс Роудс в bpo-39507.)
ХОЛОСТОЙ ход и idlelib¶
Добавлена возможность отключить мигание курсора. (Автор: Закери Спитц в bpo-4603.)
Клавиша Escape теперь закрывает незанятые окна завершения. (Добавлено Джонни Наджерой в bpo-38944.)
Добавлены ключевые слова в список заполнения названия модуля. (Автор: Терри Дж. Риди в bpo-37765.)
Новое в версиях обслуживания 3.9
Заставьте IDLE вызывать sys.excepthook()
(при запуске без „-n“). Пользовательские перехваты ранее игнорировались. (Добавлено Кеном Хилтоном в bpo-43008.)
Приведенные выше изменения были перенесены в версии обслуживания 3.8.
Измените порядок в диалоговом окне настроек. Разделите вкладку «Общие» на вкладки «Windows» и «Shell/Ed». Переместите источники справки, которые расширяют меню «Справка», на вкладку «Расширения». Освободите место для новых опций и сократите диалоговое окно. Благодаря последнему диалоговое окно лучше подходит для небольших экранов. (Автор: Терри Джан Риди в bpo-40468.) Переместите настройку отступа с вкладки «Шрифт» на новую вкладку «Windows». (Авторы: Марк Роузман и Терри Джан Риди в bpo-33962.)
Примените подсветку синтаксиса к файлам .pyi
. (Авторы - Алекс Уэйгуд и Терри Ян Риди в статье bpo-45447.)
imaplib¶
IMAP4
и IMAP4_SSL
теперь имеют необязательный параметр timeout для своих конструкторов. Кроме того, благодаря этому изменению метод open()
теперь имеет необязательный параметр timeout. Для этого изменения были применены переопределенные методы IMAP4_SSL
и IMAP4_stream
. (Добавлено Донхи На в bpo-38615.)
добавляется imaplib.IMAP4.unselect()
. imaplib.IMAP4.unselect()
освобождает ресурсы сервера, связанные с выбранным почтовым ящиком, и возвращает сервер в состояние аутентификации. Эта команда выполняет те же действия, что и imaplib.IMAP4.close()
, за исключением того, что никакие сообщения не удаляются безвозвратно из текущего выбранного почтового ящика. (Добавлено Донхи На в bpo-40375.)
импортный файл¶
Чтобы улучшить согласованность с инструкциями по импорту, importlib.util.resolve_name()
теперь выдает ImportError
вместо ValueError
для недопустимых попыток относительного импорта. (Добавлено Нгалимом Сирегаром в bpo-37444.)
Загрузчики импорта, которые публикуют неизменяемые объекты модулей, теперь могут публиковать неизменяемые пакеты в дополнение к отдельным модулям. (Автор: Дино Виеланд в bpo-39336.)
Добавлена функция importlib.resources.files()
с поддержкой подкаталогов в данных пакета, соответствующая backport в importlib_resources
версии 1.5. (Добавлено Джейсоном Р. Кумбсом в bpo-39791.)
Обновлено importlib.metadata
с importlib_metadata
версии 1.6.1.
проверить¶
inspect.BoundArguments.arguments
изменено с OrderedDict
на обычный dict. (Добавлено Инадой Наоки в bpo-36350 и bpo-39775.)
ip-адрес¶
ipaddress
теперь поддерживаются адреса с областью действия IPv6 (IPv6-адрес с суффиксом %<scope_id>
).
Адреса IPv6 с ограниченной областью действия могут быть проанализированы с помощью ipaddress.IPv6Address
. Если они присутствуют, идентификатор зоны действия доступен с помощью атрибута scope_id
. (Добавлено Александром Павлюком в bpo-34788.)
Начиная с версии Python 3.9.5, модуль ipaddress
больше не принимает никаких начальных нулей в строках IPv4-адресов. (Добавлено Кристианом Хеймсом в bpo-36384).
математика¶
Расширена функция math.gcd()
для обработки нескольких аргументов. Ранее она поддерживала только два аргумента. (Добавлено Сергеем Сторчакой в bpo-39648.)
Добавлено math.lcm()
: возвращает наименьшее общее кратное из указанных аргументов. (Авторы: Марк Дикинсон, Анантакришнан и Сергей Сторчака в bpo-39479 и bpo-39648.)
Добавлено math.nextafter()
: возвращает следующее значение с плавающей запятой после x в направлении y. (Добавлено Виктором Стиннером в bpo-39288.)
Добавлено math.ulp()
: возвращает значение младшего разряда числа с плавающей точкой. (Добавлено Виктором Стиннером в bpo-39310.)
многопроцессорная обработка¶
В классе multiprocessing.SimpleQueue
есть новый метод close()
для явного закрытия очереди. (Автор Виктор Стиннер в статье bpo-30966).
nntplib¶
NNTP
и NNTP_SSL
теперь создают ValueError
, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Донхи На в bpo-39259.)
ос¶
Добавлены CLD_KILLED
и CLD_STOPPED
для si_code
. (Добавлено Донхи На в bpo-38493.)
Раскрыл специфичные для Linux os.pidfd_open()
(bpo-38692) и os.P_PIDFD
(bpo-38713) возможности управления процессами с помощью файловых дескрипторов.
Функция os.unsetenv()
теперь доступна и в Windows. (Автор: Виктор Стиннер в статье bpo-39413).
Функции os.putenv()
и os.unsetenv()
теперь доступны всегда. (Добавлено Виктором Стиннером в bpo-39395.)
Добавлена функция os.waitstatus_to_exitcode()
: преобразует статус ожидания в код выхода. (Добавлено Виктором Стиннером в bpo-40094.)
файл пути¶
Добавлен pathlib.Path.readlink()
, который действует аналогично os.readlink()
. (Добавлено Гиртсом Фолькманисом в bpo-30618)
pdb (почтовый индекс)¶
В Windows теперь Pdb
поддерживает ~/.pdbrc
. (Авторы - Тим Хоппер и Дэн Лидрал-Портер в bpo-20523.)
поплиб¶
POP3
и POP3_SSL
теперь создают ValueError
, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Донхи На в bpo-39259.)
печать¶
pprint
теперь можно печатать красивым шрифтом types.SimpleNamespace
. (Автор Карл Скука Хансен в bpo-37376.)
pydoc¶
Строка документации теперь отображается не только для класса, функции, метода и т.д., Но и для любого объекта, который имеет свой собственный атрибут __doc__
. (Добавлено Сергеем Сторчакой в bpo-40257.)
случайный¶
Добавлен новый метод random.Random.randbytes
: генерировать случайные байты. (Добавлено Виктором Стиннером в bpo-40286.)
сигнал¶
Раскрыл специфичный для Linux signal.pidfd_send_signal()
для отправки сигналов to процессу, использующему файловый дескриптор вместо pid. (bpo-38712)
smtplib (ссылка)¶
SMTP
и SMTP_SSL
теперь создают ValueError
, если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Донхи На в bpo-39259.)
LMTP
в конструкторе теперь есть необязательный параметр timeout. (Добавлено Донхи На в bpo-39329.)
разъем¶
Модуль socket
теперь экспортирует константу CAN_RAW_JOIN_FILTERS
в Linux 4.1 и более поздних версиях. (Добавлено Стефаном Татшнером и Закери Спитцем в статье bpo-25780.)
Модуль socket теперь поддерживает протокол CAN_J1939
на платформах, которые его поддерживают. (Добавлено Карлом Дингом в bpo-40291.)
Модуль сокета теперь имеет функции socket.send_fds()
и socket.recv_fds()
. (Авторы - Джоанна Нанджекье, Шинья Окано и Виктор Стиннер в статье bpo-28724.)
время¶
В AIX thread_time()
теперь реализован с thread_cputime()
, который имеет наносекундное разрешение, вместо clock_gettime(CLOCK_THREAD_CPUTIME_ID)
, который имеет разрешение 10 миллисекунд. (Автор: Батухан Таскайя в bpo-40192)
sys¶
Добавлен новый атрибут sys.platlibdir
: имя каталога библиотеки, зависящего от платформы. Он используется для построения пути к стандартной библиотеке и путей к установленным модулям расширения. На большинстве платформ он равен "lib"
. В Fedora и SuSE он равен "lib64"
на 64-разрядных платформах. ((Материалы предоставлены Яном Матейеком, Матеем Цеплем, Харалампосом Стратакисом и Виктором Стиннером в bpo-1294959.)
Ранее sys.stderr
буферизовался блоками, когда не был интерактивным. Теперь stderr
по умолчанию всегда буферизуется строками. (Добавлено Джендриком Зиппом в bpo-13601.)
трассировочный блок¶
Добавлен параметр tracemalloc.reset_peak()
для установки максимального размера отслеживаемых блоков памяти на текущий размер, чтобы измерить максимальный размер определенных фрагментов кода. (Добавлено Хуоном Уилсоном в bpo-40630.)
печатание¶
PEP 593 введен тип typing.Annotated
, чтобы дополнить существующие типы контекстно-зависимыми метаданными, и новый параметр include_extras
для typing.get_type_hints()
доступа к метаданным во время выполнения. (Авторы - Тилль Варокво и Константин Кашин.)
данные в юникоде¶
База данных Unicode была обновлена до новой версии 13.0.0. (bpo-39926).
венв¶
Все скрипты активации, предоставляемые venv
, теперь последовательно настраивают свои подсказки, всегда используя значение, указанное в __VENV_PROMPT__
. Ранее некоторые скрипты безоговорочно использовали __VENV_PROMPT__
, другие - только в том случае, если это значение было задано (что было по умолчанию), а в одном вместо этого использовалось __VENV_NAME__
. (Автор Бретт Кэннон в bpo-37663).
xml-код¶
Символы пробела в атрибутах теперь сохраняются при сериализации xml.etree.ElementTree
в XML-файл. EOLNS больше не нормализуются к «n». Это результат обсуждения того, как интерпретировать раздел 2.11 спецификации XML. (Добавлено Мефистотелисом в bpo-39011.)
Оптимизация¶
Оптимизирована идиома для присвоения временной переменной в понятиях. Теперь
for y in [expr]
в понятиях выполняется так же быстро, как простое присвоениеy = expr
. Например:суммы = [s для s в [0] для x в данных для s в [s + x]]
В отличие от оператора
:=
, эта идиома не выводит переменную во внешнюю область видимости.(Автор: Сергей Сторчака в bpo-32856.)
Оптимизирована обработка сигналов в многопоточных приложениях. Если поток, отличный от основного, получает сигнал, цикл обработки байт-кода больше не прерывается при каждой команде байт-кода для проверки ожидающих сигналов, которые невозможно обработать. Только основной поток основного интерпретатора может обрабатывать сигналы.
Ранее цикл обработки байт-кода прерывался при выполнении каждой команды до тех пор, пока основной поток не обработает сигналы. (Добавлено Виктором Стиннером в bpo-40010.)
Оптимизирован модуль
subprocess
во FreeBSD с использованиемclosefrom()
. (Вклад Эда Масте, Конрада Мейера, Кайла Эванса, Кубилая Кочака и Виктора Стиннера в bpo-38061.)PyLong_FromDouble()
теперь работает в 1,87 раза быстрее для значений, которые соответствуют long. (Добавлено Сергеем Федосеевым в bpo-37986.)Ряд встроенных функций Python (
range
,tuple
,set
,frozenset
,list
,dict
) теперь ускорен за счет использования PEP 590 протокола векторных вызовов. (Авторы: Донхи На, Марк Шеннон, Йерун Демейер и Петр Викторин в bpo-37207.)Оптимизирован
difference_update()
для случая, когда другой набор намного больше базового. ((Предложено Евгением Капуном с использованием кода, предоставленного Мишель Орру в bpo-8425.)Распределитель малых объектов в Python (
obmalloc.c
) теперь позволяет (не более чем) одной пустой области оставаться доступной для немедленного повторного использования, не возвращая ее в операционную систему. Это предотвращает сбои в простых циклах, когда область может создаваться и уничтожаться заново на каждой итерации. (Автор: Тим Питерс в статье bpo-37257.)floor division операции float теперь имеют более высокую производительность. Также обновлено сообщение
ZeroDivisionError
для этой операции. (Добавлено Донхи На в bpo-39434.)Декодирование коротких строк ASCII с помощью UTF-8 и ascii-кодов теперь выполняется примерно на 15% быстрее. (Добавлено Инадой Наоки в bpo-37348.)
Вот краткое описание улучшений производительности с Python 3.4 по Python 3.9:
Python version 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 7.1 7.1 5.4 5.1 3.9 3.9
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
read_global 15.5 19.0 14.3 13.6 7.6 7.8
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
Variable and attribute write access:
write_local 8.7 9.3 5.5 5.3 4.3 4.3
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
write_global 19.7 21.2 18.0 18.0 15.8 16.7
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
Data structure read access:
read_list 24.2 24.5 20.8 20.8 19.0 19.5
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
Data structure write access:
write_list 27.1 28.5 22.5 21.6 20.0 20.0
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
Stack (or queue) operations:
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
Эти результаты были получены с помощью тестового скрипта доступа к переменным по адресу: Tools/scripts/var_access_benchmark.py
. Тестовый скрипт отображает время в наносекундах. Тесты были измерены на Intel® Core™ i7-4960HQ processor, на котором были запущены 64-разрядные сборки macOS, найденные по адресу python.org.
Осуждаемый¶
Команда distutils
bdist_msi
теперь устарела, вместо нее используйтеbdist_wheel
(пакеты колес). (Добавлено Хьюго ван Кеменаде в bpo-39586.)В настоящее время
math.factorial()
принимаетfloat
экземпляры с неотрицательными целыми значениями (например,5.0
). Для нецелых и отрицательных значений с плавающей запятой возникаетValueError
. В настоящее время он устарел. В будущих версиях Python это приведет к появлениюTypeError
для всех значений с плавающей точкой. (Добавлено Сергеем Сторчакой в bpo-37315.)Модули
parser
иsymbol
являются устаревшими и будут удалены в будущих версиях Python. В большинстве случаев пользователи могут использовать этап генерации и компиляции абстрактного синтаксического дерева (AST), используя модульast
.Общедоступные функции C API
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
иPyNode_Compile()
устарели и будут удалены в Python 3.10 вместе со старым синтаксическим анализатором.Использование
NotImplemented
в логическом контексте устарело, поскольку оно почти исключительно является результатом некорректных реализаций расширенного компаратора. В будущей версии Python оно будет иметь значениеTypeError
. (Автор: Джош Розенберг в bpo-35712.)Модуль
random
в настоящее время принимает любой хэшируемый тип в качестве возможного начального значения. К сожалению, некоторые из этих типов не гарантированно имеют детерминированное хэш-значение. После выхода Python 3.9 модуль ограничит свои начальные значения значениямиNone
,int
,float
,str
,bytes
, иbytearray
.Открытие файла
GzipFile
для записи без указания аргумента mode не рекомендуется. В будущих версиях Python он всегда будет открыт для чтения по умолчанию. Укажите аргумент mode, чтобы открыть его для записи и отключить предупреждение. (Автор - Сергей Сторчака в bpo-28286.)Отказался от использования метода
split()
из_tkinter.TkappType
в пользу методаsplitlist()
, который обладает более последовательным и предсказуемым поведением. (Добавлено Сергеем Сторчакой в bpo-38371.)Явная передача объектов сопрограммы в
asyncio.wait()
устарела и будет удалена в версии 3.11. (Авторы Юрий Селиванов и Кайл Стэнли в bpo-34790).стандарты binhex4 и hexbin4 теперь устарели. Модуль
binhex
и следующиеbinascii
функции теперь устарели:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Автор: Виктор Стиннер в bpo-39353.)
ast
классыslice
,Index
иExtSlice
считаются устаревшими и будут удалены в будущих версиях Python. самvalue
следует использовать вместоIndex(value)
. вместоExtSlice(slices)
следует использоватьTuple(slices, Load())
. (Добавлено Сергеем Сторчакой в bpo-34822.)ast
классыSuite
,Param
,AugLoad
иAugStore
считаются устаревшими и будут удалены в будущих версиях Python. Они не были сгенерированы синтаксическим анализатором и не были приняты генератором кода на Python 3. (Авторы: Батухан Таскаяа в bpo-39639 и bpo-39969 и Сергей Сторчака в bpo-39988.)Функции
PyEval_InitThreads()
иPyEval_ThreadsInitialized()
теперь устарели и будут удалены в Python 3.11. ВызовPyEval_InitThreads()
теперь ничего не дает. GIL инициализируется с помощьюPy_Initialize()
начиная с версии Python 3.7. (Добавлено Виктором Стиннером в bpo-39877.)Передача
None
в качестве первого аргумента функцииshlex.split()
считается устаревшей. (Добавлено Закери Спитцем в bpo-33262.)smtpd.MailmanProxy()
теперь устарел, так как не может использоваться без внешнего модуля,mailman
. (Добавлено Сэмюэлем Колвином в bpo-35800.)Модуль
lib2to3
теперь выдает значениеPendingDeprecationWarning
. Python 3.9 переключился на синтаксический анализатор PEG (см. PEP 617), а Python 3.10 может включать новый синтаксис языка, который не может быть проанализирован синтаксическим анализатором LL(1) в lib2to3. Модульlib2to3
может быть удален из стандартной библиотеки в будущей версии Python. Рассмотрите сторонние альтернативы, такие как LibCST или parso. (Автор Карл Майер в bpo-40360).Параметр random, равный
random.shuffle()
, устарел. (Добавлено Рэймондом Хеттингером в bpo-40465)
Удаленный¶
Ошибочная версия с
unittest.mock.__version__
была удалена.nntplib.NNTP
:xpath()
и методыxgtitle()
были удалены. Эти методы устарели начиная с версии Python 3.3. Как правило, эти расширения не поддерживаются или не включены администраторами NNTP-сервера. Вместоxgtitle()
, пожалуйста, используйтеnntplib.NNTP.descriptions()
илиnntplib.NNTP.description()
. (Добавлено Донхи На в bpo-39366.)array.array
:tostring()
и методыfromstring()
были удалены. Это были псевдонимыtobytes()
иfrombytes()
, которые устарели начиная с версии Python 3.2. (Автор Виктор Стиннер в bpo-38916).Недокументированная функция
sys.callstats()
была удалена. Начиная с версии Python 3.7, она была признана устаревшей и всегда возвращалаNone
. Для этого требовалась специальная опция сборкиCALL_PROFILE
, которая уже была удалена в Python 3.7. (Добавлено Виктором Стиннером в bpo-37414.)Функции
sys.getcheckinterval()
иsys.setcheckinterval()
были удалены. Они были признаны устаревшими начиная с версии Python 3.2. Вместо них используйтеsys.getswitchinterval()
иsys.setswitchinterval()
. (Автор: Виктор Стиннер в статье bpo-37392.)Функция C
PyImport_Cleanup()
была удалена. Она была задокументирована следующим образом: «Очистить таблицу модуля. Только для внутреннего использования.» (Добавлено Виктором Стиннером в bpo-36710.)Модули
_dummy_thread
иdummy_threading
были удалены. Эти модули были признаны устаревшими начиная с версии Python 3.7, которая требует поддержки многопоточности. (Автор: Виктор Стиннер в bpo-37312).aifc.openfp()
псевдоним наaifc.open()
,sunau.openfp()
псевдоним наsunau.open()
иwave.openfp()
псевдоним наwave.open()
были удалены. Они устарели начиная с версии Python 3.7. (Автор Виктор Стиннер в bpo-37320).Метод
isAlive()
изthreading.Thread
был удален. Он устарел начиная с версии Python 3.8. Вместо него используйтеis_alive()
. (Автор Донхи На в bpo-37804).Методы
getchildren()
иgetiterator()
классовElementTree
иElement
в модулеElementTree
были удалены. Они устарели в Python 3.2. Используйтеiter(x)
илиlist(x)
вместоx.getchildren()
иx.iter()
илиlist(x.iter())
вместоx.getiterator()
. (Автор - Сергей Сторчака в bpo-36543.)Старый
plistlib
API был удален, он устарел начиная с версии Python 3.4. Используйте функцииload()
,loads()
,dump()
, иdumps()
. Кроме того, параметр use_buildin_types был удален, вместо него всегда используются стандартные объектыbytes
. (Автор Джон Янзен в статье bpo-36409).Функция C
PyGen_NeedsFinalizing
была удалена. Она не была задокументирована, протестирована или использована где-либо в CPython после реализации PEP 442. Исправление от Джоанны Нанджекай. (Автор: Джоанна Нанджекай в bpo-15088)base64.encodestring()
иbase64.decodestring()
, псевдонимы, которые устарели начиная с версии Python 3.1, были удалены: вместо них используйтеbase64.encodebytes()
иbase64.decodebytes()
. (Автор: Виктор Стиннер в статье bpo-39351.)fractions.gcd()
функция была удалена, она была признана устаревшей со времен Python 3.5 (bpo-22486): вместо нее используйтеmath.gcd()
. (Автор Виктор Стиннер в bpo-39350.)Параметр буферизации
bz2.BZ2File
был удален. Начиная с версии Python 3.0, он игнорировался, и при его использовании создавалсяDeprecationWarning
. Передайте объект open file, чтобы управлять открытием файла. (Автор: Виктор Стиннер в статье bpo-39357.)Параметр encoding, равный
json.loads()
, был удален. Начиная с Python 3.1, он устарел и игнорировался; его использование приводило к появлениюDeprecationWarning
начиная с Python 3.8. (Добавлено Инадой Наоки в bpo-39377)Операторы
with (await asyncio.lock):
иwith (yield from asyncio.lock):
больше не поддерживаются, вместо них используйтеasync with lock
. То же самое верно дляasyncio.Condition
иasyncio.Semaphore
. (Автор: Андрей Светлов в статье bpo-34793.)Функция
sys.getcounts()
, параметр командной строки-X showalloccount
и полеshow_alloc_count
структуры CPyConfig
были удалены. Для этого потребовалась специальная сборка на Python, в которой был определен макросCOUNT_ALLOCS
. (Добавлено Виктором Стиннером в bpo-39489.)Атрибут
_field_types
классаtyping.NamedTuple
был удален. Он устарел начиная с версии Python 3.8. Вместо него используйте атрибут__annotations__
. (Автор - Сергей Сторчака в bpo-40182.)Метод
symtable.SymbolTable.has_exec()
был удален. Он устарел с 2006 года и возвращает толькоFalse
при вызове. (Автор: Батухан Таскайя в bpo-40208)Символы
asyncio.Task.current_task()
иasyncio.Task.all_tasks()
были удалены. Начиная с версии Python 3.7, они устарели, и вместо них можно использоватьasyncio.current_task()
иasyncio.all_tasks()
. (Автор: Реми Лапейр в статье bpo-40967)Метод
unescape()
в классеhtml.parser.HTMLParser
был удален (он устарел начиная с версии Python 3.4).html.unescape()
следует использовать для преобразования символьных ссылок в соответствующие символы unicode.
Перенос на Python 3.9¶
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать внесения изменений в ваш код.
Изменения в Python API¶
__import__()
иimportlib.util.resolve_name()
теперь поднимаютImportError
там, где ранее поднималиValueError
. Вызывающие программы, перехватывающие определенный тип исключения и поддерживающие как Python 3.9, так и более ранние версии, должны будут перехватывать оба с помощьюexcept (ImportError, ValueError):
.Сценарии активации
venv
больше не являются особым случаем, если для__VENV_PROMPT__
установлено значение""
.Метод
select.epoll.unregister()
больше не игнорирует ошибкуEBADF
. (Добавлено Виктором Стиннером в bpo-39239.)Параметр compresslevel в
bz2.BZ2File
теперь доступен только для ключевых слов, поскольку параметр buffering был удален. (Добавлено Виктором Стиннером в bpo-39357.)Упрощенный AST для подписки. Простые индексы будут представлены по их значению, расширенные фрагменты будут представлены в виде кортежей.
Index(value)
вернет само значениеvalue
,ExtSlice(slices)
вернет значениеTuple(slices, Load())
. (Автор - Сергей Сторчака в bpo-34822.)Модуль
importlib
теперь игнорирует переменную окруженияPYTHONCASEOK
при использовании параметров командной строки-E
или-I
.Параметр encoding был добавлен в классы
ftplib.FTP
иftplib.FTP_TLS
в качестве параметра только для ключевых слов, а кодировка по умолчанию изменена с Latin-1 на UTF-8, чтобы соответствовать RFC 2640.asyncio.loop.shutdown_default_executor()
добавлен вAbstractEventLoop
, что означает, что в альтернативных циклах обработки событий, которые наследуются от него, должен быть определен этот метод. (Добавлено Кайлом Стэнли в bpo-34037.)Постоянные значения будущих флагов в модуле
__future__
обновлены, чтобы предотвратить столкновение с флагами компилятора. РанееPyCF_ALLOW_TOP_LEVEL_AWAIT
конфликтовал сCO_FUTURE_DIVISION
. (Автор: Батухан Таскайя в bpo-39562)array('u')
теперь используетwchar_t
тип asC вместоPy_UNICODE
. Это изменение не влияет на его поведение, потому чтоPy_UNICODE
является псевдонимомwchar_t
начиная с версии Python 3.3. (Добавлено Инадой Наоки в bpo-34538.)API
logging.getLogger()
теперь возвращает корневой регистратор при передаче имени'root'
, тогда как ранее он возвращал некорневой регистратор с именем'root'
. Это может повлиять на случаи, когда пользовательскому коду явно требуется некорневой регистратор с именем'root'
или создается экземпляр регистратора с использованиемlogging.getLogger(__name__)
в каком-либо модуле верхнего уровня с именем'root.py'
. (Автор: Винай Саджип в bpo-37742.)Обработка деления
PurePath
теперь возвращаетNotImplemented
вместоTypeError
при передаче чего-либо, отличного от экземпляраstr
илиPurePath
. Это позволяет создавать совместимые классы, которые не наследуются от упомянутых типов. (Автор Роджер Аюди в bpo-34775).Начиная с версии Python 3.9.5, модуль
ipaddress
больше не принимает начальные нули в строках адресов IPv4. Начальные нули неоднозначны и интерпретируются некоторыми библиотеками как восьмеричная запись. Например, устаревшая функцияsocket.inet_aton()
обрабатывает начальные нули как восьмеричную запись. реализация glibc в современнойinet_pton()
не принимает никаких начальных нулей. (Добавлено Кристианом Хеймсом в bpo-36384).codecs.lookup()
теперь нормализует кодировку имени так же, как иencodings.normalize_encoding()
, за исключением того, чтоcodecs.lookup()
также преобразует имя в нижний регистр. Например, название кодировки"latex+latin1"
теперь нормализовано до"latex_latin1"
. (Добавлено Джордоном Сюем в bpo-37751.)
Изменения в C API¶
Экземпляры heap-allocated types (например, созданные с помощью
PyType_FromSpec()
и аналогичных API) содержат ссылку на свой тип object начиная с версии Python 3.8. Как указано в разделе «Изменения в C API» версии Python 3.8, в подавляющем большинстве случаев, не должно быть никакого побочного эффекта, но для типов, у которых есть пользовательская функцияtp_traverse
, убедитесь, что все пользовательские функцииtp_traverse
типов, выделенных в куче, обращаются к типу объекта.Пример:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
Если ваша функция traverse делегирует
tp_traverse
своего базового класса (или другого типа), убедитесь, чтоPy_TYPE(self)
посещается только один раз. Обратите внимание, что ожидается, что только heap type посетят тип вtp_traverse
.Например, если ваша функция
tp_traverse
включает:base->tp_traverse(self, visit, arg)
затем добавьте:
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
(Смотрите bpo-35810 и bpo-40217 для получения дополнительной информации.)
Функции
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
иPyEval_CallObjectWithKeywords
являются устаревшими. Вместо них используйтеPyObject_Call()
и его варианты. (Смотрите более подробную информацию в разделе bpo-29548.)
Изменения в байт-коде CPython¶
Был добавлен код операции
LOAD_ASSERTION_ERROR
для обработки инструкцииassert
. Ранее инструкция assert не работала корректно, если исключениеAssertionError
было скрыто. (Автор: Закери Спитц в статье bpo-34880.)Код операции
COMPARE_OP
был разделен на четыре отдельные инструкции:COMPARE_OP
для подробного сравненияIS_OP
для тестов «есть» и «нет»CONTAINS_OP
для тестов «в» и «не в» тестахJUMP_IF_NOT_EXC_MATCH
для проверки исключений в операторах „try-except“.
(Автор: Марк Шеннон в bpo-39156.)
Изменения в сборке¶
Добавлена опция
--with-platlibdir
в скриптconfigure
: имя каталога библиотеки для конкретной платформы, сохраняемое в новом атрибутеsys.platlibdir
. Дополнительную информацию смотрите в атрибутеsys.platlibdir
. ((Материалы предоставлены Яном Матейеком, Матеем Цеплем, Харалампосом Стратакисом и Виктором Стиннером в bpo-1294959.)Специальный макрос сборки
COUNT_ALLOCS
был удален. (Добавлено Виктором Стиннером в bpo-39489.)На платформах, отличных от Windows, для сборки Python теперь требуются функции
setenv()
иunsetenv()
. (Добавлено Виктором Стиннером в bpo-39395.)На платформах, отличных от Windows, создание установщиков
bdist_wininst
теперь официально не поддерживается. (Более подробную информацию смотрите в разделе bpo-10945).При сборке Python на macOS из исходного кода
_tkinter
теперь связывается с несистемными фреймворками Tcl и Tk, если они установлены в/Library/Frameworks
, как это было в более старых версиях macOS. Если явно настроен пакет SDK для macOS, используя--enable-universalsdk
или-isysroot
, выполняется поиск только по самому пакету SDK. Поведение по умолчанию все еще можно изменить с помощью--with-tcltk-includes
и--with-tcltk-libs
. (Добавлено Недом Дейли в bpo-34956.)Python теперь можно создать для Windows 10 ARM64. (Автор: Стив Дауэр в bpo-33125.)
Некоторые отдельные тесты теперь пропускаются при использовании
--pgo
. Данные тесты значительно увеличили время выполнения задачи PGO и, вероятно, не помогли улучшить оптимизацию конечного исполняемого файла. Это ускоряет выполнение задачи примерно в 15 раз. Запуск полного набора модульных тестов выполняется медленно. Это изменение может привести к несколько менее оптимизированной сборке, поскольку будет выполнено не так много ветвей кода. Если вы готовы дождаться гораздо более медленной сборки, можно восстановить прежнее поведение с помощью./configure [..] PROFILE_TASK="-m test --pgo-extended"
. Мы не даем никаких гарантий относительно того, какой набор задач PGO обеспечит более быструю сборку. Заинтересованным пользователям следует самостоятельно выполнить соответствующие тесты, поскольку результаты могут зависеть от среды, рабочей нагрузки и цепочки инструментов компилятора. (Более подробную информацию смотрите в разделах bpo-36044 и bpo-37707).
Изменения в C API¶
Новые возможности¶
PEP 573: Добавлены
PyType_FromModuleAndSpec()
для связи модуля с классом;PyType_GetModule()
иPyType_GetModuleState()
для получения модуля и его состояния; иPyCMethod
иMETH_METHOD
, чтобы разрешить методу доступ к классу, в котором он был определен. (Материалы предоставлены Марселем Плчем и Петром Викторином в bpo-38787.)Добавлено
PyFrame_GetCode()
функция: получение кода кадра. Добавлено:c:func:PyFrame_GetBack функция: получение следующего внешнего кадра. (Добавлено Виктором Стиннером в bpo-40421.)Добавлено : c:func:PyFrame_GetLineNumber в ограниченный C API. (Добавлено Виктором Стиннером в bpo-40421.)
Добавлены функции
PyThreadState_GetInterpreter()
иPyInterpreterState_Get()
для получения интерпретатора. Добавлена функцияPyThreadState_GetFrame()
для получения текущего кадра состояния потока Python. Добавлено : функция c:func:PyThreadState_GetID: получение уникального идентификатора состояния потока Python. (Добавлено Виктором Стиннером в bpo-39947.)Добавлена новая функция public
PyObject_CallNoArgs()
в C API, которая вызывает вызываемый объект Python без каких-либо аргументов. Это самый эффективный способ вызвать вызываемый объект Python без каких-либо аргументов. (Автор: Виктор Стиннер в статье bpo-37194.)Изменения в ограниченном C API (если определен макрос
Py_LIMITED_API
):Предоставьте
Py_EnterRecursiveCall()
иPy_LeaveRecursiveCall()
в качестве обычных функций для ограниченного API. Ранее они были определены как макросы, но эти макросы не компилировались с ограниченным C API, который не может получить доступ к полюPyThreadState.recursion_depth
(структура непрозрачна в ограниченном C API).PyObject_INIT()
иPyObject_INIT_VAR()
становятся обычными «непрозрачными» функциями для скрытия деталей реализации.
Добавлена функция
PyModule_AddType()
, помогающая добавлять тип в модуль. (Добавлено Донхи На в bpo-40024.)Добавлены функции
PyObject_GC_IsTracked()
иPyObject_GC_IsFinalized()
в общедоступный API, позволяющие запрашивать, отслеживаются ли объекты Python в данный момент или уже были завершены сборщиком мусора соответственно. (Автор: Пабло Галиндо Сальгадо в bpo-40241.)Добавлено
_PyObject_FunctionStr()
, чтобы получить удобное для пользователя строковое представление функционально-подобного объекта. (Исправление от Йеруна Демейера в bpo-37645.)Добавлено
PyObject_CallOneArg()
для вызова объекта с одним позиционным аргументом (исправление от Йеруна Демейера в bpo-37483).
Перенос на Python 3.9¶
PyInterpreterState.eval_frame
(PEP 523) теперь требуется новый обязательный параметр tstate (PyThreadState*
). (Добавлен Виктором Стиннером в bpo-38500.)Модули расширения:
m_traverse
,m_clear
иm_free
функцииPyModuleDef
больше не вызываются, если состояние модуля было запрошено, но еще не присвоено. Это происходит сразу после создания модуля и перед его выполнением (Py_mod_exec
функция). Точнее, эти функции не вызываются, еслиm_size
больше 0, а состояние модуля (возвращаемоеPyModule_GetState()
) равноNULL
.Модули расширения без состояния модуля (
m_size <= 0
) не затрагиваются.Если
Py_AddPendingCall()
вызывается во вспомогательном интерпретаторе, то теперь функция запланирована для вызова из вспомогательного интерпретатора, а не из основного интерпретатора. У каждого вспомогательного интерпретатора теперь есть свой собственный список запланированных вызовов. (Автор: Виктор Стиннер в статье bpo-39984.)Реестр Windows больше не используется для инициализации
sys.path
при использовании параметра-E
(если для параметраPyConfig.use_environment
установлено значение0
). Это важно при внедрении Python в Windows. (Добавлено Закери Спитцем в bpo-8901.)Глобальная переменная
PyStructSequence_UnnamedField
теперь является константой и ссылается на постоянную строку. (Добавлено Сергеем Сторчакой в bpo-38650.)Структура
PyGC_Head
теперь непрозрачна. Она определена только во внутреннем C API (pycore_gc.h
). (Добавлено Виктором Стиннером в bpo-40241).Символы
Py_UNICODE_COPY
,Py_UNICODE_FILL
,PyUnicode_WSTR_LENGTH
,PyUnicode_FromUnicode()
,PyUnicode_AsUnicode()
,_PyUnicode_AsUnicode
, иPyUnicode_AsUnicodeAndSize()
помечены в C как устаревшие. Они были признаны устаревшими в PEP 393 начиная с версии Python 3.3. (Добавлено Инадой Наоки в bpo-36346.)Функция
Py_FatalError()
заменяется макросом, который автоматически записывает имя текущей функции, если только не определен макросPy_LIMITED_API
. (Добавлено Виктором Стиннером в bpo-39882.)Протокол векторных вызовов теперь требует, чтобы вызывающий абонент передавал только строки в качестве ключевых слов. (Дополнительную информацию смотрите в разделе bpo-37540).
Детали реализации ряда макросов и функций теперь скрыты:
PyObject_IS_GC()
макрос был преобразован в функцию.Макрос
PyObject_NEW()
становится псевдонимом для макросаPyObject_New
, а макросPyObject_NEW_VAR()
становится псевдонимом для макросаPyObject_NewVar
. Они больше не имеют прямого доступа к элементуPyTypeObject.tp_basicsize
.макрос
PyObject_GET_WEAKREFS_LISTPTR()
был преобразован в функцию: макрос напрямую обращался к элементуPyTypeObject.tp_weaklistoffset
.макрос
PyObject_CheckBuffer()
был преобразован в функцию: макрос напрямую обращался к элементуPyTypeObject.tp_as_buffer
.PyIndex_Check()
теперь всегда объявляется как непрозрачная функция, чтобы скрыть детали реализации: удален макросPyIndex_Check()
. Макрос напрямую обращался к элементуPyTypeObject.tp_as_number
.
(Более подробную информацию смотрите в разделе bpo-40170.)
Удаленный¶
Исключены макросы
PyFPE_START_PROTECT()
иPyFPE_END_PROTECT()
дляpyfpe.h
из ограниченного CAPI. (Добавлено Виктором Стиннером в bpo-38835.)Параметр
tp_print
в PyTypeObject был удален. Он использовался для печати объектов в файлах в Python 2.7 и более ранних версиях. Начиная с Python 3.0, он игнорируется и не используется. (Автор - Йерун Демейер в bpo-36974.)Изменения в ограниченном C API (если определен макрос
Py_LIMITED_API
):Исключены следующие функции из ограниченного C API:
PyThreadState_DeleteCurrent()
(Автор Джоанна Нанджекай в bpo-37878.)_Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
Механизм сбора мусора, который никогда не работал в ограниченной СТОЛИЦЕ.
PyTrash_UNWIND_LEVEL
Py_TRASHCAN_BEGIN_CONDITION
Py_TRASHCAN_BEGIN
Py_TRASHCAN_END
Py_TRASHCAN_SAFE_BEGIN
Py_TRASHCAN_SAFE_END
Перенес следующие функции и определения во внутренний C API:
_PyDebug_PrintTotalRefs()
_Py_PrintReferences()
_Py_PrintReferenceAddresses()
_Py_tracemalloc_config
_Py_AddToAllObjects()
(специфично для сборкиPy_TRACE_REFS
)
Удален хук
_PyRuntime.getframe
и макрос_PyThreadState_GetFrame
, который был псевдонимом для_PyRuntime.getframe
. Они были доступны только через внутренний C API. Удален также типPyThreadFrameGetter
. (Автор: Виктор Стиннер в статье bpo-39946.)Удалены следующие функции из C API. Вызовите
PyGC_Collect()
явно, чтобы очистить все свободные списки. (Материалы предоставлены Инадой Наоки и Виктором Стиннером в книге bpo-37340, bpo-38896 и bpo-40428.)PyAsyncGen_ClearFreeLists()
PyContext_ClearFreeList()
PyDict_ClearFreeList()
PyFloat_ClearFreeList()
PyFrame_ClearFreeList()
PyList_ClearFreeList()
PyMethod_ClearFreeList()
иPyCFunction_ClearFreeList()
: удалены свободные списки связанных объектов метода.PySet_ClearFreeList()
: установленный свободный список был удален в Python 3.4.PyTuple_ClearFreeList()
PyUnicode_ClearFreeList()
: в Python 3.3 список, свободный от Unicode, был удален.
Удалена функция
_PyUnicode_ClearStaticStrings()
. (Добавлено Виктором Стиннером в bpo-39465.)Удален
Py_UNICODE_MATCH
. Он устарел в PEP 393 и не работает с версии Python 3.3. Вместо него можно использовать функциюPyUnicode_Tailmatch()
. (Автор - Инада Наоки в bpo-36346.)Очищены заголовочные файлы интерфейсов, определенных, но не имеющих реализации. Удаляемыми общедоступными символами API являются:
_PyBytes_InsertThousandsGroupingLocale
,_PyBytes_InsertThousandsGrouping
,_Py_InitializeFromArgs
,_Py_InitializeFromWideArgs
,_PyFloat_Repr
,_PyFloat_Digits
,_PyFloat_DigitsInit
,PyFrame_ExtendStack
,_PyAIterWrapper_Type
,PyNullImporter_Type
,PyCmpWrapper_Type
,PySortWrapper_Type
,PyNoArgsFunction
. (Автор: Пабло Галиндо Сальгадо в bpo-39372.)
Заметные изменения в Python 3.9.1¶
печатание¶
Поведение typing.Literal
было изменено, чтобы соответствовать PEP 586 и соответствовать поведению средств проверки статических типов, указанных в PEP.
Literal
теперь удаляем дублирование параметров.Сравнение на равенство между объектами
Literal
теперь не зависит от порядка.Literal
при сравнении теперь учитываются типы. Например,Literal[0] == Literal[False]
ранее оценивалось какTrue
. Теперь этоFalse
. Чтобы поддержать это изменение, внутренний кэш типов теперь поддерживает дифференциацию типов.Literal
объекты теперь будут генерировать исключениеTypeError
при сравнении на равенство, если какой-либо из их параметров не соответствует hashable. Обратите внимание, что объявлениеLiteral
с изменяемыми параметрами не приведет к возникновению ошибки:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(Автор: Юрий Карабас в статье bpo-42345.)
Поддержка macOS 11.0 (Big Sur) и Apple Silicon Mac¶
Начиная с версии 3.9.1, Python теперь полностью поддерживает сборку и запуск на macOS 11.0 (Big Sur) и Apple Silicon Mac (на основе архитектуры ARM64
). Теперь доступен новый универсальный вариант сборки, universal2
, который изначально поддерживает как ARM64
, так и Intel 64
в одном наборе исполняемых файлов. Двоичные файлы теперь также можно создавать на основе текущих версий macOS для развертывания на ряде более старых версий macOS (протестированных до версии 10.9), при этом некоторые новые функции и опции ОС становятся условно доступными в зависимости от версии операционной системы, используемой во время выполнения («слабая привязка»).
(Материалы предоставлены Рональдом Оуссореном и Лоуренсом Д’Анной в bpo-41100.)
Заметные изменения в Python 3.9.2¶
сборники.abc¶
collections.abc.Callable
generic теперь сглаживает параметры типа, аналогично тому, что в настоящее время делает typing.Callable
. Это означает, что в collections.abc.Callable[[int, str], str]
будет __args__
из (int, str, str)
; ранее это было ([int, str], str)
. Чтобы разрешить это изменение, types.GenericAlias
теперь может быть разделен на подклассы, и подкласс будет возвращен при указании типа collections.abc.Callable
. Код, который обращается к аргументам через typing.get_args()
или __args__
, должен учитывать это изменение. Может быть выдано значение DeprecationWarning
для недопустимых форм параметризации collections.abc.Callable
, которые, возможно, были пропущены автоматически в Python 3.9.1. Это значение DeprecationWarning
станет значением TypeError
в Python 3.10. (Автор: Кен Джин в bpo-42195.)
urllib.синтаксический анализ¶
Более ранние версии Python позволяли использовать как ;
, так и &
в качестве разделителей параметров запроса в urllib.parse.parse_qs()
и urllib.parse.parse_qsl()
. Из соображений безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить использование только одного разделительного ключа с &
по умолчанию. Это изменение также затрагивает cgi.parse()
и cgi.parse_multipart()
, поскольку они используют затронутые функции внутри системы. Для получения более подробной информации, пожалуйста, ознакомьтесь с соответствующей документацией. (Материалы предоставлены Адамом Гольдшмидтом, Сентилом Кумараном и Кеном Джином в bpo-42967.)
Заметные изменения в Python 3.9.3¶
Исправление безопасности изменяет поведение ftplib.FTP
, чтобы не доверять IPv4-адресу, отправляемому с удаленного сервера, при настройке пассивного канала передачи данных. Вместо этого мы используем IP-адрес ftp-сервера. Для необычного кода, требующего старого поведения, установите для атрибута trust_server_pasv_ipv4_address
в вашем экземпляре FTP значение True
. (Смотрите gh-87451)
Заметные изменения в Python 3.9.5¶
urllib.синтаксический анализ¶
Наличие символов новой строки или табуляции в некоторых частях URL-адреса допускает некоторые формы атак. В соответствии со спецификацией WHATWG, которая обновляет RFC 3986, символы новой строки ASCII \n
, \r
и табуляции \t
удаляются из URL-адреса синтаксическим анализатором в urllib.parse
для предотвращения подобных атак. Удаляемые символы управляются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (Смотрите gh-88048)
Примечательная функция безопасности в версии 3.9.14¶
Преобразование между int
и str
в основаниях, отличных от 2 (двоичных), 4, 8 (восьмеричных), 16 (шестнадцатеричных) или 32, таких как основание 10 (десятичных), теперь приводит к появлению ValueError
, если число количество цифр в виде строки превышает допустимый предел, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за сложности алгоритма. Это ограничение для CVE-2020-10735. Это ограничение можно настроить или отключить с помощью переменной среды, флага командной строки или sys
API. Смотрите документацию по integer string conversion length limitation. Ограничение по умолчанию составляет 4300 цифр в виде строки.
Заметные изменения в версии 3.9.17¶
архивный файл¶
Методы извлечения в
tarfile
иshutil.unpack_archive()
имеют новый аргумент a filter, который позволяет ограничить возможности tar, которые могут быть неожиданными или опасными, например, создание файлов за пределами каталога назначения. Подробнее смотрите в Экстракционные фильтры. В Python 3.12 при использовании без аргумента filter будет отображатьсяDeprecationWarning
. В Python 3.14 значение по умолчанию будет изменено на'data'
. (Автор: Петр Викторин в PEP 706.)