Содержание страницы
Что нового в Python 3.9¶What’s New In Python 3.9
- Редактор:
Łukasz Langa
В этой статье описываются новые возможности Python 3.9 по сравнению с 3.8. Python 3.9 был выпущен 5 октября 2020 года. Подробнее см. в списке изменений.
См. также
PEP 596 – график выпуска Python 3.9
Итоги – основные изменения¶Summary – Release highlights
Новые синтаксические возможности:
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 vectorcall;
сборка мусора не блокируется на воскрешённых объектах;
ряд модулей 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 переходит на ежегодный цикл выпуска.
Следует проверять наличие DeprecationWarning в коде¶You should check for DeprecationWarning in your code
Когда 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, чтобы обрабатывать их как ошибки. Фильтр предупреждений можно использовать для игнорирования предупреждений из стороннего кода.
Python 3.9 – последняя версия, предоставляющая эти прослойки обратной совместимости с Python 2, чтобы дать разработчикам проектов на Python больше времени для организации удаления поддержки Python 2 и добавления поддержки Python 3.9.
Псевдонимы абстрактных базовых классов в модуле collections, например псевдоним collections.Mapping для collections.abc.Mapping, сохраняются в последнем релизе для обратной совместимости. Они будут удалены из Python 3.10.
В более общем смысле, старайтесь запускать тесты в режиме разработки Python, который помогает подготовить код к совместимости со следующей версией Python.
Примечание: в этой версии Python также были удалены некоторые ранее существовавшие устаревшие возможности. Обратитесь к разделу Удалено.
Новые возможности¶New Features
Операторы слияния и обновления словарей¶Dictionary Merge & Update Operators
Операторы слияния (|) и обновления (|=) были добавлены во встроенный класс 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 для полного описания. (Автор: Brandt Bucher в bpo-36144.)
Новые строковые методы для удаления префиксов и суффиксов¶New String Methods to Remove Prefixes and Suffixes
Добавлены str.removeprefix(prefix) и str.removesuffix(suffix) для простого удаления ненужного префикса или суффикса из строки. Также добавлены соответствующие методы bytes, bytearray и collections.UserString. См. PEP 616 для полного описания. (Автор: Dennis Sweeney в bpo-39939.)
Обобщения (generics) для подсказок типов в стандартных коллекциях¶Type Hinting Generics in Standard Collections
В аннотациях типов теперь можно использовать встроенные типы коллекций, такие как list и dict, в качестве обобщённых типов, вместо импорта соответствующих типов с заглавной буквы (например, List или Dict) из typing. Некоторые другие типы в стандартной библиотеке теперь также являются обобщёнными, например queue.Queue.
Пример:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
См. PEP 585 для подробностей. (Авторы: Guido van Rossum, Ethan Smith и Batuhan Taşkaya в bpo-39481.)
Новый парсер¶New Parser
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 для подробностей. (Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в bpo-40334.)
Прочие изменения языка ¶Other Language Changes
__import__()теперь вызываетImportErrorвместоValueError, что ранее происходило, когда относительный импорт выходил за пределы своего пакета верхнего уровня. (Автор: Ngalim Siregar в bpo-37444.)Python теперь получает абсолютный путь к имени файла сценария, указанному в командной строке (например:
python3 script.py): атрибут__file__модуля__main__стал абсолютным путём, а не относительным. Эти пути теперь остаются действительными после изменения текущего каталога с помощьюos.chdir(). Как побочный эффект, трассировка также отображает абсолютный путь для кадров модуля__main__в этом случае. (Автор: Victor Stinner в bpo-20443.)В режиме разработки Python и в отладочной сборке теперь проверяются аргументы encoding и errors для операций кодирования и декодирования строк. Примеры:
open(),str.encode()иbytes.decode().По умолчанию для максимальной производительности аргумент errors проверяется только при первой ошибке кодирования/декодирования, а аргумент encoding иногда игнорируется для пустых строк. (Автор: Victor Stinner в bpo-37388.)
"".replace("", s, n)теперь возвращаетsвместо пустой строки для всех ненулевыхn. Теперь это согласовано с"".replace("", s). Аналогичные изменения внесены для объектовbytesиbytearray. (Автор: Serhiy Storchaka в bpo-28029.)Любое допустимое выражение теперь может использоваться в качестве декоратора. Ранее грамматика была гораздо более ограничительной. См. PEP 614 для подробностей. (Автор: Brandt Bucher в bpo-39702.)
Улучшена справка для модуля
typing. Теперь докстринги отображаются для всех специальных форм и специальных обобщённых псевдонимов (например,UnionиList). Использованиеhelp()с обобщённым псевдонимом, напримерList[int], покажет справку для соответствующего конкретного типа (listв данном случае). (Автор: Serhiy Storchaka в bpo-40257.)Параллельный запуск
aclose()/asend()/athrow()теперь запрещён, аag_runningтеперь отражает фактический статус выполнения асинхронного генератора. (Автор: Yury Selivanov в bpo-30773.)Неожиданные ошибки при вызове метода
__iter__больше не маскируютсяTypeErrorв оператореinи функцияхcontains(),indexOf()иcountOf()модуляoperator. (Автор: Serhiy Storchaka в bpo-40824.)Лямбда-выражения без скобок больше не могут быть частью выражения в предложении
ifв включениях и генераторных выражениях. См. bpo-41848 и bpo-43755 для подробностей.
Новые модули¶New Modules
zoneinfo¶
Модуль zoneinfo добавляет поддержку базы данных часовых поясов IANA в стандартную библиотеку. Он добавляет zoneinfo.ZoneInfo – конкретную реализацию datetime.tzinfo, основанную на системных данных о часовых поясах.
Пример:
>>> from zoneinfo import ZoneInfo
>>> import datetime as dt
>>> # Летнее время
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'
>>> # Стандартное время
>>> when += dt.timedelta(days=7)
>>> print(when)
2020-11-07 12:00:00-08:00
>>> print(when.tzname())
PST
В качестве резервного источника данных для платформ, не поставляющих базу данных IANA, модуль tzdata был выпущен как пакет первого уровня – распространяется через PyPI и поддерживается основной командой CPython.
См. также
- PEP 615 – Поддержка базы данных часовых поясов IANA в стандартной библиотеке
PEP написан и реализован Полом Ганслом.
graphlib¶
Добавлен новый модуль graphlib, содержащий класс graphlib.TopologicalSorter для топологической сортировки графов. (Авторы: Pablo Galindo, Tim Peters и Larry Hastings в bpo-17005.)
Улучшенные модули¶Improved Modules
ast¶
Добавлена опция indent в dump(), позволяющая создавать многострочный вывод с отступами. (Автор: Serhiy Storchaka в bpo-37995.)
Добавлена функция ast.unparse() в модуль ast, которую можно использовать для обратного синтаксического анализа объекта ast.AST и получения строки с кодом, который при разборе даст эквивалентный объект ast.AST. (Авторы: Pablo Galindo и Batuhan Taskaya в bpo-38870.)
Добавлены строки документации к узлам AST, содержащие сигнатуру ASDL, используемую для создания этого узла. (Автор: Batuhan Taskaya в bpo-39638.)
asyncio¶
Из-за серьёзных проблем безопасности параметр reuse_address функции asyncio.loop.create_datagram_endpoint() больше не поддерживается. Это связано с поведением опции сокета SO_REUSEADDR в UDP. Подробнее см. документацию loop.create_datagram_endpoint(). (Авторы: Kyle Stanley, Antoine Pitrou и Yury Selivanov в bpo-37228.)
Добавлена новая корутина shutdown_default_executor(), которая планирует завершение работы для исполнителя по умолчанию, ожидая закрытия ThreadPoolExecutor. Кроме того, asyncio.run() обновлена для использования новой корутины. (Автор: Kyle Stanley в bpo-34037.)
Добавлена asyncio.PidfdChildWatcher, реализация наблюдателя за дочерними процессами для Linux, которая опрашивает файловые дескрипторы процессов. (bpo-38692)
Добавлена новая корутина asyncio.to_thread(). В основном используется для выполнения функций, связанных с вводом-выводом, в отдельном потоке, чтобы не блокировать цикл событий, и по сути работает как высокоуровневая версия run_in_executor(), которая может напрямую принимать именованные аргументы. (Авторы: Kyle Stanley и Yury Selivanov в bpo-32309.)
При отмене задачи из-за тайм-аута asyncio.wait_for() теперь будет ждать завершения отмены также и в случае, когда timeout <= 0, как и при положительных значениях тайм-аута. (Автор: Elvis Pranskevichus в bpo-32751.)
asyncio теперь вызывает TypeError при вызове несовместимых методов с сокетом ssl.SSLSocket. (Автор: Ido Michael в bpo-37404.)
compileall¶
Добавлена новая возможность использовать жёсткие ссылки для дублирующихся файлов .pyc: параметр hardlink_dupes и опция командной строки –hardlink-dupes. (Автор: Lumír ‘Frenzy’ Balhar в bpo-40495.)
Добавлены новые опции для управления путями в результирующих файлах .pyc: параметры stripdir, prependdir, limit_sl_dest и опции командной строки -s, -p, -e. Добавлена возможность указывать опцию для уровня оптимизации несколько раз. (Автор: Lumír ‘Frenzy’ Balhar в bpo-38112.)
concurrent.futures¶
Добавлен новый параметр cancel_futures в concurrent.futures.Executor.shutdown(), который отменяет все ожидающие выполнения future, которые ещё не начали выполняться, вместо ожидания их завершения перед остановкой исполнителя. (Автор: Kyle Stanley в bpo-39349.)
Удалены потоки-демоны из ThreadPoolExecutor и ProcessPoolExecutor. Это улучшает совместимость с под-интерпретаторами и предсказуемость процессов их завершения. (Автор: Kyle Stanley в bpo-39812.)
Рабочие процессы в ProcessPoolExecutor теперь создаются по требованию, только когда нет свободных рабочих процессов для повторного использования. Это оптимизирует накладные расходы при запуске и уменьшает количество потерянного процессорного времени на простаивающие рабочие процессы. (Автор: Kyle Stanley в bpo-39207.)
curses¶
Добавлены функции curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize() и curses.set_tabsize(). (Автор: Anthony Sottile в bpo-38312.)
datetime¶
Методы isocalendar() класса datetime.date и isocalendar() класса datetime.datetime теперь возвращают namedtuple() вместо tuple. (Автор: Donghee Na в bpo-24416.)
distutils¶
Команда upload теперь создаёт хеш-дайджесты SHA2-256 и Blake2b-256. Она пропускает MD5 на платформах, которые блокируют дайджест MD5. (Автор: Christian Heimes в bpo-40698.)
fcntl¶
Добавлены константы fcntl.F_OFD_GETLK, fcntl.F_OFD_SETLK и fcntl.F_OFD_SETLKW. (Автор: Donghee Na в bpo-38602.)
ftplib¶
FTP и FTP_TLS теперь вызывают исключение ValueError,
если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)
gc¶
Когда сборщик мусора выполняет сборку, в ходе которой некоторые объекты воскресают (они становятся доступны извне изолированных циклов после выполнения финализаторов), сборка всех объектов, которые всё ещё недоступны, не блокируется. (Авторы: Pablo Galindo и Tim Peters в bpo-38379.)
Добавлена новая функция gc.is_finalized() для проверки, был ли объект
финализирован сборщиком мусора. (Автор: Pablo Galindo в
bpo-39322.)
hashlib¶
Модуль hashlib теперь может использовать хеши SHA3 и SHAKE XOF из OpenSSL
при их наличии.
(Автор: Christian Heimes в bpo-37630.)
Встроенные хеш-модули теперь можно отключить с помощью
./configure --without-builtin-hashlib-hashes или выборочно включить, например,
./configure --with-builtin-hashlib-hashes=sha3,blake2, чтобы принудительно использовать
реализацию на основе OpenSSL.
(Автор: Christian Heimes в bpo-40479)
http¶
Коды состояния HTTP 103 EARLY_HINTS, 418 IM_A_TEAPOT и 425 TOO_EARLY добавлены в
http.HTTPStatus. (Авторы: Donghee Na в bpo-39509 и Ross Rhodes в bpo-39507.)
IDLE и idlelib¶IDLE and idlelib
Добавлена опция для отключения мигания курсора. (Автор: Zackery Spytz в bpo-4603.)
Клавиша Escape теперь закрывает окна автодополнения IDLE. (Автор: Johnny Najera в bpo-38944.)
Добавлены ключевые слова в список завершения имён модулей. (Автор: Terry J. Reedy в bpo-37765.)
Новое в корректирующих выпусках 3.9
IDLE теперь вызывает sys.excepthook() (при запуске без «-n»).
Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в
bpo-43008.)
Приведённые выше изменения были перенесены в корректирующие выпуски 3.8.
Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в bpo-40468.) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в bpo-33962.)
Применять подсветку синтаксиса для файлов .pyi. (Авторы: Alex Waygood и Terry Jan Reedy, bpo-45447.)
imaplib¶
IMAP4 и IMAP4_SSL теперь имеют необязательный параметр тайм-аут для своих конструкторов.
Кроме того, метод open() теперь имеет необязательный параметр тайм-аут.
Переопределённые методы IMAP4_SSL и IMAP4_stream были применены к этому изменению.
(Автор: Donghee Na в bpo-38615.)
Добавлен imaplib.IMAP4.unselect().
imaplib.IMAP4.unselect() освобождает ресурсы сервера, связанные с выбранным почтовым ящиком,
и возвращает сервер в состояние аутентификации.
Эта команда выполняет те же действия, что и imaplib.IMAP4.close(), за исключением того,
что никакие сообщения не удаляются безвозвратно из текущего выбранного почтового ящика.
(Автор: Donghee Na в bpo-40375.)
importlib¶
Для улучшения согласованности с операторами import importlib.util.resolve_name()
теперь вызывает ImportError вместо ValueError при попытке недопустимого относительного импорта.
(Автор: Ngalim Siregar в bpo-37444.)
Загрузчики импорта, которые предоставляют неизменяемые объекты модулей, теперь могут предоставлять неизменяемые пакеты в дополнение к отдельным модулям. (Автор: Dino Viehland в bpo-39336.)
Добавлена функция importlib.resources.files() с поддержкой
подкаталогов в данных пакета, что соответствует обратному порту в importlib_resources
версии 1.5.
(Автор: Jason R. Coombs в bpo-39791.)
Обновлён importlib.metadata из importlib_metadata версии 1.6.1.
inspect¶
inspect.BoundArguments.arguments изменён с OrderedDict на обычный
dict. (Автор: Inada Naoki в bpo-36350 и bpo-39775.)
ipaddress ¶
ipaddress теперь поддерживает адреса IPv6 с областью действия (IPv6-адрес с суффиксом %<scope_id>).
Адреса IPv6 с областью действия можно разобрать с помощью ipaddress.IPv6Address.
Если присутствует, идентификатор зоны области действия доступен через атрибут scope_id.
(Автор: Oleksandr Pavliuk в bpo-34788.)
Начиная с Python 3.9.5 модуль ipaddress больше не
принимает ведущие нули в строках IPv4-адресов.
(Автор: Christian Heimes в bpo-36384).
math¶
Расширена функция math.gcd() для обработки нескольких аргументов.
Ранее она поддерживала только два аргумента.
(Автор: Serhiy Storchaka в bpo-39648.)
Добавлена math.lcm(): возвращает наименьшее общее кратное указанных аргументов.
(Авторы: Mark Dickinson, Ananthakrishnan и Serhiy Storchaka в
bpo-39479 и bpo-39648.)
Добавлена math.nextafter(): возвращает следующее значение с плавающей запятой после x
по направлению к y.
(Автор: Victor Stinner в bpo-39288.)
Добавлена math.ulp(): возвращает значение младшего значащего бита
числа с плавающей запятой.
(Автор: Victor Stinner в bpo-39310.)
multiprocessing¶
Класс multiprocessing.SimpleQueue теперь имеет новый метод close() для явного закрытия очереди.
(Автор: Victor Stinner в bpo-30966.)
nntplib¶
NNTP и NNTP_SSL теперь вызывают исключение ValueError,
если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)
os¶
Добавлены CLD_KILLED и CLD_STOPPED для si_code.
(Автор: Donghee Na в bpo-38493.)
Добавлены специфичные для Linux os.pidfd_open() (bpo-38692) и
os.P_PIDFD (bpo-38713) для управления процессами с помощью файловых дескрипторов.
Функция os.unsetenv() теперь также доступна в Windows.
(Автор: Victor Stinner в bpo-39413.)
Функции os.putenv() и os.unsetenv() теперь всегда доступны.
(Автор: Victor Stinner в bpo-39395.)
Добавлена функция os.waitstatus_to_exitcode():
преобразует статус ожидания в код завершения.
(Автор: Victor Stinner в bpo-40094.)
pathlib¶
Добавлен pathlib.Path.readlink(), который работает аналогично os.readlink().
(Автор: Girts Folkmanis в bpo-30618)
pdb¶
В Windows Pdb теперь поддерживает ~/.pdbrc.
(Авторы: Tim Hopper и Dan Lidral-Porter в bpo-20523.)
poplib¶
POP3 и POP3_SSL теперь вызывают исключение ValueError,
если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)
pprint¶
pprint теперь может красиво печатать types.SimpleNamespace.
(Автор: Carl Bordum Hansen в bpo-37376.)
pydoc¶
Строка документации теперь отображается не только для классов, функций, методов и т.д., но и для любого объекта, у которого есть собственный атрибут __doc__.
(Автор: Serhiy Storchaka в bpo-40257.)
random¶
Добавлен новый метод random.Random.randbytes(): генерирует случайные байты.
(Автор: Victor Stinner в bpo-40286.)
signal¶
Добавлен специфичный для Linux signal.pidfd_send_signal() для отправки сигналов процессу с помощью файлового дескриптора вместо pid. (bpo-38712)
smtplib¶
SMTP и SMTP_SSL теперь вызывают исключение ValueError,
если заданный тайм-аут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Автор: Donghee Na в bpo-39259.)
Конструктор LMTP теперь имеет необязательный параметр timeout.
(Автор: Donghee Na в bpo-39329.)
socket¶
Модуль socket теперь экспортирует константу CAN_RAW_JOIN_FILTERS
в Linux 4.1 и выше.
(Авторы: Stefan Tatschner и Zackery Spytz в bpo-25780.)
Модуль socket теперь поддерживает протокол CAN_J1939
на платформах, которые его поддерживают. (Автор: Karl Ding в bpo-40291.)
Модуль socket теперь содержит функции socket.send_fds() и socket.recv_fds(). (Авторы: Joannah Nanjekye, Shinya Okano и Victor Stinner, bpo-28724.)
time¶
На AIX thread_time() теперь реализован с помощью thread_cputime(), имеющего наносекундное разрешение, вместо clock_gettime(CLOCK_THREAD_CPUTIME_ID) с разрешением 10 миллисекунд. (Автор: Batuhan Taskaya, bpo-40192)
sys¶
Добавлен новый атрибут sys.platlibdir: имя каталога библиотек, зависящего от платформы. Он используется для построения пути к стандартной библиотеке и путям к установленным модулям расширения. На большинстве платформ он равен "lib". На Fedora и SuSE на 64-битных платформах он равен "lib64". (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner, bpo-1294959.)
Ранее sys.stderr использовал блочную буферизацию в неинтерактивном режиме. Теперь stderr по умолчанию всегда использует построчную буферизацию. (Автор: Jendrik Seipp, bpo-13601.)
tracemalloc¶
Добавлен tracemalloc.reset_peak() для установки пикового размера отслеживаемых блоков памяти равным текущему размеру, чтобы измерять пик для определённых участков кода. (Автор: Huon Wilson, bpo-40630.)
typing¶
PEP 593 представил тип typing.Annotated для декорирования существующих типов контекстно-зависимыми метаданными и новый параметр include_extras для typing.get_type_hints() доступа к метаданным во время выполнения. (Авторы: Till Varoquaux и Konstantin Kashin.)
unicodedata¶
База данных Unicode обновлена до версии 13.0.0. (bpo-39926).
venv¶
Сценарии активации, предоставляемые venv, теперь все единообразно задают настройку приглашения, всегда используя значение, указанное __VENV_PROMPT__. Ранее некоторые сценарии безусловно использовали __VENV_PROMPT__, другие только если оно было установлено (что было по умолчанию), а один использовал __VENV_NAME__ вместо. (Автор: Brett Cannon, bpo-37663.)
xml¶
Пробельные символы внутри атрибутов теперь сохраняются при сериализации xml.etree.ElementTree в XML-файл. Символы конца строки больше не нормализуются в 'n'. Это результат обсуждения интерпретации раздела 2.11 спецификации XML. (Автор: Mefistotelis, bpo-39011.)
Оптимизации¶Optimizations
Оптимизирован идиом для присваивания временной переменной в генераторах. Теперь
for y in [expr]в генераторах работает так же быстро, как простое присваиваниеy = expr. Например:sums = [s for s in [0] for x in data for s in [s + x]]
В отличие от оператора
:=, этот идиом не выносит переменную во внешнюю область видимости.(Автор: Serhiy Storchaka, bpo-32856.)
Оптимизирована обработка сигналов в многопоточных приложениях. Если сигнал получает поток, отличный от главного, цикл выполнения байт-кода больше не прерывается на каждой инструкции для проверки ожидающих сигналов, которые не могут быть обработаны. Только главный поток главного интерпретатора может обрабатывать сигналы.
Ранее цикл выполнения байт-кода прерывался на каждой инструкции до тех пор, пока главный поток не обработает сигналы. (Автор: Victor Stinner, bpo-40010.)
Оптимизирован модуль
subprocessна FreeBSD с использованиемclosefrom(). (Авторы: Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak и Victor Stinner, bpo-38061.)PyLong_FromDouble()теперь до 1.87x быстрее для значений, помещающихся в long. (Автор: Sergey Fedoseev, bpo-37986.)Ряд встроенных функций Python (
range,tuple,set,frozenset,list,dict) теперь ускорены за счёт использования протокола vectorcall PEP 590. (Авторы: Donghee Na, Mark Shannon, Jeroen Demeyer и Petr Viktorin, bpo-37207.)Оптимизирован
set.difference_update()для случая, когда другое множество значительно больше базового. (Предложено Evgeny Kapun, код от Michele Orrù, bpo-8425.)Аллокатор малых объектов Python (
obmalloc.c) теперь разрешает (не более) одной пустой арене оставаться доступной для немедленного повторного использования, не возвращая её ОС. Это предотвращает «трешинг» в простых циклах, где арена могла бы создаваться и уничтожаться заново на каждой итерации. (Автор: Tim Peters, bpo-37257.)Целочисленное деление с плавающей запятой теперь работает быстрее. Также обновлено сообщение
ZeroDivisionErrorдля этой операции. (Автор: Donghee Na, bpo-39434.)Декодирование коротких ASCII-строк с помощью кодировок UTF-8 и ascii теперь примерно на 15% быстрее. (Автор: Inada Naoki, 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 под управлением 64-битных сборок macOS, доступных на python.org.
Устарело¶Deprecated
Команда
bdist_msiв distutils теперь устарела, используйте вместо неёbdist_wheel(пакеты wheel). (Автор: Hugo van Kemenade, bpo-39586.)В настоящее время
math.factorial()принимает экземплярыfloatс неотрицательными целочисленными значениями (например,5.0). Для нецелых и отрицательных чисел с плавающей запятой возбуждаетсяValueError. Сейчас это поведение устарело. В будущих версиях Python для всех чисел с плавающей запятой будет возбуждатьсяTypeError. (Автор: Serhiy Storchaka в bpo-37315.)Модули
parserиsymbolустарели и будут удалены в будущих версиях Python. В большинстве случаев пользователи могут задействовать этап генерации и компиляции абстрактного синтаксического дерева (AST) с помощью модуляast.Функции публичного C API
PyParser_SimpleParseStringFlags(),PyParser_SimpleParseStringFlagsFilename(),PyParser_SimpleParseFileFlags()иPyNode_Compile()устарели и будут удалены в Python 3.10 вместе со старым парсером.Использование
NotImplementedв логическом контексте объявлено устаревшим, поскольку почти всегда является результатом неправильной реализации расширенных операторов сравнения. В одной из будущих версий Python оно будет преобразовано вTypeError. (Автор: Josh Rosenberg в bpo-35712.)Модуль
randomв настоящее время принимает любой хешируемый тип в качестве возможного значения зерна. К сожалению, для некоторых из этих типов хеш-значение не гарантированно детерминировано. После Python 3.9 модуль будет ограничивать свои зерна типамиNone,int,float,str,bytesиbytearray.Открытие файла
GzipFileдля записи без указания аргумента mode объявлено устаревшим. В будущих версиях Python он всегда будет открываться для чтения по умолчанию. Укажите аргумент mode, чтобы открыть его для записи и отключить предупреждение. (Автор: Serhiy Storchaka в bpo-28286.)Метод
split()класса_tkinter.TkappTypeобъявлен устаревшим в пользу методаsplitlist(), который обладает более последовательным и предсказуемым поведением. (Автор: Serhiy Storchaka в bpo-38371.)Явная передача объектов-корутин в
asyncio.wait()объявлена устаревшей и будет удалена в версии 3.11. (Авторы: Yury Selivanov и Kyle Stanley в bpo-34790.)Стандарты binhex4 и hexbin4 теперь устарели. Модуль
binhexи следующие функцииbinasciiтеперь устарели:b2a_hqx(),a2b_hqx()rlecode_hqx(),rledecode_hqx()
(Автор: Victor Stinner в bpo-39353.)
Классы
ast:slice,IndexиExtSliceсчитаются устаревшими и будут удалены в будущих версиях Python. ВместоIndex(value)следует использовать самvalue. ВместоExtSlice(slices)следует использоватьTuple(slices, Load()). (Автор: Serhiy Storchaka в bpo-34822.)Классы
astSuite,Param,AugLoadиAugStoreсчитаются устаревшими и будут удалены в будущих версиях Python. Они не создавались парсером и не принимались генератором кода в Python 3. (Авторы: Batuhan Taskaya в bpo-39639 и bpo-39969 и Serhiy Storchaka в bpo-39988.)Функции
PyEval_InitThreads()иPyEval_ThreadsInitialized()теперь устарели и будут удалены в Python 3.11. ВызовPyEval_InitThreads()теперь ничего не делает. GIL инициализируется с помощьюPy_Initialize()начиная с Python 3.7. (Автор: Victor Stinner в bpo-39877.)Передача
Noneв качестве первого аргумента функцииshlex.split()объявлена устаревшей. (Автор: Zackery Spytz в bpo-33262.)smtpd.MailmanProxy()теперь устарел, так как непригоден к использованию без внешнего модуляmailman. (Автор: Samuel Colvin в bpo-35800.)Модуль
lib2to3теперь генерируетPendingDeprecationWarning. Python 3.9 перешёл на PEG-парсер (см. PEP 617), и Python 3.10 может включать новый синтаксис языка, который не поддаётся разбору LL(1)-парсером lib2to3. Модульlib2to3может быть удалён из стандартной библиотеки в одной из будущих версий Python. Рассмотрите сторонние альтернативы, такие как LibCST или parso. (Автор: Carl Meyer в bpo-40360.)Параметр random функции
random.shuffle()объявлен устаревшим. (Автор: Raymond Hettinger в bpo-40465)
Удалено¶Removed
Ошибочная версия по адресу
unittest.mock.__version__удалена.nntplib.NNTP: методыxpath()иxgtitle()удалены. Эти методы устарели начиная с Python 3.3. Как правило, эти расширения не поддерживаются или не включены администраторами NNTP-серверов. Дляxgtitle()используйтеnntplib.NNTP.descriptions()илиnntplib.NNTP.description(). (Автор: Donghee Na в bpo-39366.)array.array: методыtostring()иfromstring()удалены. Они были псевдонимами дляtobytes()иfrombytes(), устаревших начиная с Python 3.2. (Автор: Victor Stinner в bpo-38916.)Незадокументированная функция
sys.callstats()удалена. Начиная с Python 3.7 она была устаревшей и всегда возвращалаNone. Она требовала специальной опции сборкиCALL_PROFILE, которая уже была удалена в Python 3.7. (Автор: Victor Stinner в bpo-37414.)Функции
sys.getcheckinterval()иsys.setcheckinterval()удалены. Они были устаревшими начиная с Python 3.2. Используйте вместо нихsys.getswitchinterval()иsys.setswitchinterval(). (Автор: Victor Stinner в bpo-37392.)C-функция
PyImport_Cleanup()удалена. Она была задокументирована как: «Очистить таблицу модулей. Только для внутреннего использования.» (Автор: Victor Stinner в bpo-36710.)Модули
_dummy_threadиdummy_threadingудалены. Эти модули были устаревшими начиная с Python 3.7, который требует поддержки потоков. (Автор: Victor Stinner в bpo-37312.)Псевдонимы
aifc.openfp()дляaifc.open(),sunau.openfp()дляsunau.open()иwave.openfp()дляwave.open()удалены. Они были устаревшими начиная с Python 3.7. (Автор: Victor Stinner в bpo-37320.)Метод
isAlive()классаthreading.Threadудалён. Он был устаревшим начиная с Python 3.8. Используйте вместо негоis_alive(). (Автор: Donghee Na в bpo-37804.)Методы
getchildren()иgetiterator()классовElementTreeиElementв модулеElementTreeудалены. Они были устаревшими начиная с Python 3.2. Используйтеiter(x)илиlist(x)вместоx.getchildren()иx.iter()илиlist(x.iter())вместоx.getiterator(). (Автор: Serhiy Storchaka в bpo-36543.)Старый API
plistlibудалён, он был устаревшим начиная с Python 3.4. Используйте функцииload(),loads(),dump()иdumps(). Кроме того, удалён параметр use_builtin_types; вместо него всегда используются стандартные объектыbytes. (Автор: Jon Janzen в bpo-36409.)C-функция
PyGen_NeedsFinalizingудалена. Она не была задокументирована, не тестировалась и нигде не использовалась в CPython после реализации PEP 442. Патч от Joannah Nanjekye. (Автор: Joannah Nanjekye в bpo-15088)base64.encodestring()иbase64.decodestring(), псевдонимы, устаревшие начиная с Python 3.1, удалены: используйтеbase64.encodebytes()иbase64.decodebytes(). (Автор: Victor Stinner в bpo-39351.)Функция
fractions.gcd()удалена, она была устаревшей начиная с Python 3.5 (bpo-22486): используйтеmath.gcd(). (Автор: Victor Stinner в bpo-39350.)Параметр buffering функции
bz2.BZ2Fileудалён. Начиная с Python 3.0 он игнорировался, а его использование вызывалоDeprecationWarning. Передавайте открытый файловый объект, чтобы управлять тем, как файл открывается. (Автор: Victor Stinner в bpo-39357.)Параметр encoding функции
json.loads()был удалён. Начиная с Python 3.1 он считался устаревшим и игнорировался; его использование вызывалоDeprecationWarning, начиная с Python 3.8. (Автор: Inada Naoki в bpo-39377)Операторы
with (await asyncio.lock):иwith (yield from asyncio.lock):больше не поддерживаются, используйте вместо нихasync with lock. То же самое верно дляasyncio.Conditionиasyncio.Semaphore. (Автор: Andrew Svetlov в bpo-34793.)Функция
sys.getcounts(), параметр командной строки-X showalloccountи полеshow_alloc_countC-структурыPyConfigбыли удалены. Они требовали специальной сборки Python с определённым макросомCOUNT_ALLOCS. (Автор: Victor Stinner в bpo-39489.)Атрибут
_field_typesклассаtyping.NamedTupleбыл удалён. Он был устаревшим с Python 3.8. Используйте вместо него атрибут__annotations__. (Автор: Serhiy Storchaka в bpo-40182.)Метод
symtable.SymbolTable.has_exec()был удалён. Он был устаревшим с 2006 года и при вызове просто возвращалFalse. (Автор: Batuhan Taskaya в bpo-40208)asyncio.Task.current_task()иasyncio.Task.all_tasks()были удалены. Они были устаревшими с Python 3.7, и вы можете использовать вместо нихasyncio.current_task()иasyncio.all_tasks(). (Автор: Rémi Lapeyre в bpo-40967)Метод
unescape()в классеhtml.parser.HTMLParserбыл удалён (он был устаревшим с Python 3.4). Для преобразования символьных ссылок в соответствующие символы Юникода следует использоватьhtml.unescape().
Перенос на Python 3.9¶Porting to Python 3.9
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в Python API¶Changes in the Python API
__import__()иimportlib.util.resolve_name()теперь вызываютImportErrorвместоValueError. Код, который перехватывает конкретный тип исключения и должен поддерживать как Python 3.9, так и более ранние версии, должен перехватывать оба с помощьюexcept (ImportError, ValueError):.Скрипты активации
venvбольше не обрабатывают особым образом случай, когда__VENV_PROMPT__установлено в"".Метод
select.epoll.unregister()больше не игнорирует ошибкуEBADF. (Автор: Victor Stinner в bpo-39239.)Параметр compresslevel функции
bz2.BZ2Fileстал только ключевым (keyword-only), поскольку параметр buffering был удалён. (Автор: Victor Stinner в bpo-39357.)Упрощённое AST для операций индексации. Простые индексы будут представлены своим значением, расширенные срезы – кортежами.
Index(value)будет возвращать самvalue,ExtSlice(slices)будет возвращатьTuple(slices, Load()). (Автор: Serhiy Storchaka в bpo-34822.)Модуль
importlibтеперь игнорирует переменную окруженияPYTHONCASEOKпри использовании параметров командной строки-Eили-I.Параметр encoding был добавлен в классы
ftplib.FTPиftplib.FTP_TLSкак только ключевой (keyword-only), а кодировка по умолчанию изменена с Latin-1 на UTF-8 в соответствии с RFC 2640.asyncio.loop.shutdown_default_executor()был добавлен вAbstractEventLoop, что означает, что альтернативные циклы событий, наследующие от него, должны иметь этот определённый метод. (Автор: Kyle Stanley в bpo-34037.)Константные значения флагов future в модуле
__future__обновлены, чтобы избежать пересечения с флагами компилятора. РанееPyCF_ALLOW_TOP_LEVEL_AWAITконфликтовал сCO_FUTURE_DIVISION. (Автор: Batuhan Taskaya в bpo-39562)array('u')теперь использует в качестве C-типаwchar_tвместоPy_UNICODE. Это изменение не влияет на его поведение, посколькуPy_UNICODEявляется псевдонимомwchar_tначиная с Python 3.3. (Автор: Inada Naoki в bpo-34538.)API
logging.getLogger()теперь возвращает корневой логгер при передаче имени'root', тогда как ранее возвращался некорневой логгер с именем'root'. Это может повлиять на случаи, когда код явно требует некорневой логгер с именем'root'или создаёт логгер с помощьюlogging.getLogger(__name__)в некотором модуле верхнего уровня с именем'root.py'. (Автор: Vinay Sajip в bpo-37742.)Обработка деления в
PurePathтеперь возвращаетNotImplementedвместо возбужденияTypeError, если передано что-то, не являющееся экземпляромstrилиPurePath. Это позволяет создавать совместимые классы, не наследующие от упомянутых типов. (Автор: Roger Aiudi в bpo-34775).Начиная с Python 3.9.5 модуль
ipaddressбольше не принимает ведущие нули в строках IPv4-адресов. Ведущие нули неоднозначны и некоторыми библиотеками интерпретируются как восьмеричная запись. Например, устаревшая функцияsocket.inet_aton()трактует ведущие нули как восьмеричную запись. Реализация glibc современногоinet_pton()не принимает никаких ведущих нулей. (Автор: Christian Heimes в bpo-36384).codecs.lookup()теперь нормализует имя кодировки так же, какencodings.normalize_encoding(), за исключением того, чтоcodecs.lookup()также приводит имя к нижнему регистру. Например, имя кодировки"latex+latin1"теперь нормализуется в"latex_latin1". (Автор: Jordon Xu в bpo-37751.)
Изменения в C API¶Changes in the C API
Экземпляры типов, выделяемых в куче (таких как созданные с помощью
PyType_FromSpec()и подобных API) содержат ссылку на свой объект-тип начиная с Python 3.8. Как указано в разделе «Changes in the C API» для Python 3.8, в подавляющем большинстве случаев побочных эффектов не должно быть, но для типов, имеющих собственную функциюtp_traverse, необходимо убедиться, что все пользовательские функцииtp_traverseтипов, выделяемых в куче, посещают тип объекта.Пример:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Остальная часть функции traverse #if PY_VERSION_HEX >= 0x03090000 // Это не требовалось до Python 3.9 (Python issue 35810 и 40217) Py_VISIT(Py_TYPE(self)); #endif }
Если ваша функция traverse делегирует вызов
tp_traverseсвоего базового класса (или другого типа), убедитесь, чтоPy_TYPE(self)посещается только один раз. Обратите внимание, что только тип, выделяемый в куче должны посещать тип вtp_traverse.Например, если ваша функция
tp_traverseсодержит:base->tp_traverse(self, visit, arg)
то добавьте:
#if PY_VERSION_HEX >= 0x03090000 // Это не требовалось до Python 3.9 (bpo-35810 и bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // tp_traverse типа‑кучи уже посетил 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¶CPython bytecode changes
Код операции
LOAD_ASSERTION_ERRORбыл добавлен для обработки оператораassert. Ранее оператор assert работал некорректно, если исключениеAssertionErrorбыло скрыто. (Автор: Zackery Spytz в bpo-34880.)Код операции
COMPARE_OPбыл разделён на четыре отдельные инструкции:COMPARE_OPдля сравнений с богатой семантикой (rich comparisons)IS_OPдля проверок «is» и «is not»CONTAINS_OPдля проверок ‘in’ и ‘not in’JUMP_IF_NOT_EXC_MATCHдля проверки исключений в конструкциях ‘try-except’
(Автор: Mark Shannon в bpo-39156.)
Изменения сборки¶Build Changes
Добавлена опция
--with-platlibdirв скриптconfigure: имя платформо-зависимого каталога библиотек, хранящееся в новом атрибутеsys.platlibdir. См. атрибутsys.platlibdirдля получения дополнительной информации. (Авторы: Jan Matějek, Matěj Cepl, Charalampos Stratakis и Victor Stinner в bpo-1294959.)Специальный макрос сборки
COUNT_ALLOCSудалён. (Автор: Victor Stinner в bpo-39489.)На платформах, отличных от Windows, функции
setenv()иunsetenv()теперь необходимы для сборки Python. (Автор: Victor Stinner в bpo-39395.)На платформах, отличных от Windows, создание установщиков
bdist_wininstтеперь официально не поддерживается. (Подробнее см. bpo-10945.)При сборке Python на macOS из исходного кода,
_tkinterтеперь компонуется с несистемными фреймворками Tcl и Tk, если они установлены в/Library/Frameworks, как это было в более старых версиях macOS. Если явно указан macOS SDK, с помощью--enable-universalsdkили-isysroot, поиск ведется только в самом SDK. Поведение по умолчанию по-прежнему можно переопределить с помощью--with-tcltk-includesи--with-tcltk-libs. (Автор: Ned Deily в bpo-34956.)Python теперь можно собрать для Windows 10 ARM64. (Автор: Steve Dower в bpo-33125.)
Некоторые отдельные тесты теперь пропускаются при использовании
--pgo. Указанные тесты значительно увеличивали время выполнения задачи PGO и, вероятно, не способствовали улучшению оптимизации конечного исполняемого файла. Это ускоряет выполнение задачи примерно в 15 раз. Запуск полного набора модульных тестов выполняется медленно. Это изменение может привести к немного менее оптимизированной сборке, поскольку будет выполняться меньше ветвей кода. Если вы готовы ждать сборки дольше, прежнее поведение можно восстановить с помощью./configure [..] PROFILE_TASK="-m test --pgo-extended". Мы не даем никаких гарантий относительно того, какой набор задач PGO дает более быструю сборку. Заинтересованным пользователям следует запускать собственные соответствующие тесты производительности, так как результаты могут зависеть от среды, рабочей нагрузки и цепочки инструментов компилятора. (Подробнее см. bpo-36044 и bpo-37707.)
Изменения C API¶C API Changes
Новые возможности¶New Features
PEP 573: Добавлены
PyType_FromModuleAndSpec()для связывания модуля с классом;PyType_GetModule()иPyType_GetModuleState()для получения модуля и его состояния; иPyCMethodиMETH_METHODдля предоставления методу доступа к классу, в котором он был определен. (Авторы: Marcel Plch и Petr Viktorin в bpo-38787.)Добавлена функция
PyFrame_GetCode(): получение кода фрейма. Добавлена функцияPyFrame_GetBack(): получение следующего внешнего фрейма. (Автор: Victor Stinner в bpo-40421.)Добавлен
PyFrame_GetLineNumber()в ограниченный C API. (Автор: Victor Stinner в bpo-40421.)Добавлены функции
PyThreadState_GetInterpreter()иPyInterpreterState_Get()для получения интерпретатора. Добавлена функцияPyThreadState_GetFrame()для получения текущего фрейма состояния потока Python. Добавлена функцияPyThreadState_GetID(): получение уникального идентификатора состояния потока Python. (Автор: Victor Stinner в bpo-39947.)Добавлена новая публичная функция
PyObject_CallNoArgs()в C API, которая вызывает вызываемый объект Python без аргументов. Это наиболее эффективный способ вызова вызываемого объекта Python без аргументов. (Автор: Victor Stinner в 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()для помощи в добавлении типа в модуль. (Автор: Donghee Na в bpo-40024.)Добавлены функции
PyObject_GC_IsTracked()иPyObject_GC_IsFinalized()в публичный API, позволяющие запрашивать, отслеживаются ли в данный момент объекты Python или уже финализированы сборщиком мусора, соответственно. (Автор: Pablo Galindo Salgado в bpo-40241.)Добавлен
_PyObject_FunctionStr()для получения удобочитаемого строкового представления объекта, подобного функции. (Патч от Jeroen Demeyer в bpo-37645.)Добавлен
PyObject_CallOneArg()для вызова объекта с одним позиционным аргументом. (Патч от Jeroen Demeyer в bpo-37483.)
Перенос на Python 3.9¶Porting to Python 3.9
PyInterpreterState.eval_frame(PEP 523) теперь требует новый обязательный параметр tstate (PyThreadState*). (Автор: Victor Stinner в bpo-38500.)Модули расширения: функции
m_traverse,m_clearиm_freeизPyModuleDefбольше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до его выполнения (функцияPy_mod_exec). Точнее, эти функции не вызываются, еслиm_sizeбольше 0, а состояние модуля (возвращаемоеPyModule_GetState()) равноNULL.Модули расширения без состояния модуля (
m_size <= 0) не затрагиваются.Если
Py_AddPendingCall()вызывается в подынтерпретаторе, функция теперь планируется к вызову из подынтерпретатора, а не вызывается из основного интерпретатора. Каждый подынтерпретатор теперь имеет свой собственный список запланированных вызовов. (Автор: Victor Stinner в bpo-39984.)Реестр Windows больше не используется для инициализации
sys.pathпри использовании опции-E(еслиPyConfig.use_environmentустановлено в0). Это важно при встраивании Python в Windows. (Автор: Zackery Spytz в bpo-8901.)Глобальная переменная
PyStructSequence_UnnamedFieldтеперь является константой и ссылается на строковую константу. (Автор: Serhiy Storchaka в bpo-38650.)Структура
PyGC_Headтеперь непрозрачна. Она определяется только во внутреннем C API (pycore_gc.h). (Автор: Victor Stinner в 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. (Автор: Inada Naoki в bpo-36346.)Функция
Py_FatalError()заменена макросом, который автоматически записывает имя текущей функции, если не определён макросPy_LIMITED_API. (Автор: Victor Stinner в bpo-39882.)Протокол vectorcall теперь требует, чтобы вызывающая сторона передавала только строки в качестве имён ключевых аргументов. (См. 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 для получения дополнительных сведений.)
Удалено¶Removed
Макросы
PyFPE_START_PROTECT()иPyFPE_END_PROTECT()изpyfpe.hисключены из ограниченного C API. (Автор: Victor Stinner в bpo-38835.)Слот
tp_printструктуры PyTypeObject удалён. Он использовался для печати объектов в файлы в Python 2.7 и ранее. Начиная с Python 3.0, он игнорируется и не используется. (Автор: Jeroen Demeyer в bpo-36974.)Изменения в ограниченном C API (если определён макрос
Py_LIMITED_API):Из ограниченного C API исключены следующие функции:
PyThreadState_DeleteCurrent()(Автор: Joannah Nanjekye в bpo-37878.)_Py_CheckRecursionLimit_Py_NewReference()_Py_ForgetReference()_PyTraceMalloc_NewReference()_Py_GetRefTotal()Механизм trashcan, который никогда не работал в ограниченном C API.
PyTrash_UNWIND_LEVELPy_TRASHCAN_BEGIN_CONDITIONPy_TRASHCAN_BEGINPy_TRASHCAN_ENDPy_TRASHCAN_SAFE_BEGINPy_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. (Автор: Victor Stinner в bpo-39946.)Из C API удалены следующие функции. Явно вызывайте
PyGC_Collect()для очистки всех свободных списков. (Авторы: Inada Naoki и Victor Stinner в 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(): свободный список Unicode удалён в Python 3.3.
Удалена функция
_PyUnicode_ClearStaticStrings(). (Автор: Victor Stinner в bpo-39465.)Удалён
Py_UNICODE_MATCH. Он был объявлен устаревшим с помощью PEP 393 и перестал работать с Python 3.3. Вместо него можно использовать функциюPyUnicode_Tailmatch(). (Автор: Inada Naoki в 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. (Автор: Pablo Galindo Salgado в bpo-39372.)
Заметные изменения в Python 3.9.1¶Notable changes in Python 3.9.1
typing¶
Поведение typing.Literal было изменено в соответствии с PEP 586
и для соответствия поведению статических анализаторов типов, описанному в PEP.
Literalтеперь удаляет дубликаты параметров.Проверки равенства между объектами
Literalтеперь не зависят от порядка.Сравнения
Literalтеперь учитывают типы. Например,Literal[0] == Literal[False]ранее давалоTrue. Теперь этоFalse. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.Объекты
Literalтеперь будут вызывать исключениеTypeErrorпри сравнении на равенство, если любой из их параметров не является хэшируемым. Обратите внимание, что объявление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) и Mac на Apple Silicon¶macOS 11.0 (Big Sur) and Apple Silicon Mac support
Начиная с версии 3.9.1, Python полностью поддерживает сборку и работу на macOS 11.0 (Big Sur) и на Mac с Apple Silicon (на базе архитектуры ARM64). Теперь доступна новая универсальная конфигурация сборки, universal2, которая позволяет изначально поддерживать как ARM64, так и Intel 64 в одном наборе исполняемых файлов. Также теперь можно создавать двоичные файлы на текущих версиях macOS для развёртывания на более старых версиях macOS (проверено до 10.9), при этом некоторые функции и возможности новых ОС становятся условно доступными в зависимости от версии ОС, используемой во время выполнения («weaklinking»).
(Авторы: Ronald Oussoren и Lawrence D’Anna в bpo-41100.)
Заметные изменения в Python 3.9.2¶Notable changes in Python 3.9.2
collections.abc¶
collections.abc.Callable обобщённый тип теперь упрощает параметры типов, аналогично тому, как это делает 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.
(Предложено Ken Jin в bpo-42195.)
urllib.parse¶
Более ранние версии Python допускали использование как ;, так и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия новым рекомендациям W3C это поведение было изменено: теперь разрешён только один ключ-разделитель, & по умолчанию. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они внутренне используют затронутые функции. Дополнительные сведения см. в их документации.
(Авторы: Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)
Заметные изменения в Python 3.9.3¶Notable changes in Python 3.9.3
Исправление безопасности изменяет поведение ftplib.FTP, чтобы не доверять IPv4-адресу, отправленному удалённым сервером при настройке пассивного канала данных. Вместо этого используется IP-адрес FTP-сервера. Для необычного кода, которому требуется старое поведение, установите атрибут trust_server_pasv_ipv4_address экземпляра FTP в True. (См. gh-87451)
Заметные изменения в Python 3.9.5¶Notable changes in Python 3.9.5
urllib.parse¶
Наличие символов новой строки или табуляции в частях URL допускает некоторые формы
атак. Следуя спецификации WHATWG, обновляющей RFC 3986,
символы ASCII новой строки \n, \r и табуляции \t удаляются из
URL анализатором в urllib.parse, предотвращая такие атаки. Удаляемые
символы контролируются новой переменной уровня модуля
urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (См. gh-88048)
Заметная функция безопасности в 3.9.14¶Notable security feature in 3.9.14
Преобразование между int и str по основаниям, отличным от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таким как основание 10 (десятичное), теперь вызывает ValueError, если количество цифр в строковом представлении превышает лимит, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это смягчение для CVE 2020-10735. Этот лимит можно настроить или отключить с помощью переменной окружения, флага командной строки или API sys. См. документацию ограничения длины строкового представления целых чисел. Лимит по умолчанию – 4300 цифр в строковом представлении.
Заметные изменения в 3.9.17¶Notable changes in 3.9.17
tarfile¶
Методы извлечения в
tarfileиshutil.unpack_archive()получили новый аргумент filter, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. Extraction filters. В Python 3.12 использование без аргумента filter вызоветDeprecationWarning. В Python 3.14 значение по умолчанию будет изменено на'data'. (Автор: Petr Viktorin в PEP 706.)