Что нового в Python 3.9¶
- Релиз
3.10.6
- Дата
октября 19, 2022
- Редактор
Лукаш Ланга
В этой статье рассказывается о новых возможностях в Python 3.9 по сравнению с 3.8. Python 3.9 был выпущен 5 октября 2020 года.
Более подробную информацию см. в changelog.
См.также
PEP 596 - График выхода Python 3.9
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 584, операторы объединения добавлены в
dict
;PEP 585, подсказка типа generics в стандартных коллекциях;
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 в вашем коде¶
Когда 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¶
Модуль 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.
См.также
- PEP 615 – Поддержка базы данных часовых поясов IANA в стандартной библиотеке
PEP написан и реализован Полом Ганслом
graphlib¶
Добавлен новый модуль graphlib
, который содержит класс graphlib.TopologicalSorter
, чтобы предложить функциональность для выполнения топологической сортировки графов. (Вклад Пабло Галиндо, Тима Питерса и Ларри Хастингса в bpo-17005).
Улучшенные модули¶
ast¶
Добавлена опция indent в dump()
, которая позволяет ему производить вывод с многострочным отступом. (Внесено Сергеем Сторчакой в bpo-37995).
В модуль ast.unparse()
добавлена функция ast
, которая может быть использована для разбора объекта ast.AST
и получения строки с кодом, который при разборе даст эквивалентный объект ast.AST
. (Внесено Пабло Галиндо и Батуханом Таская в bpo-38870).
Добавлены docstrings к узлам AST, содержащие подпись ASDL, использованную для создания этого узла. (Внесено Батуханом Таская в bpo-39638).
asyncio¶
В связи с серьезными проблемами безопасности параметр 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()
. Он в основном используется для запуска функций, связанных с IO, в отдельном потоке, чтобы избежать блокирования цикла событий, и по сути работает как высокоуровневая версия run_in_executor()
, которая может напрямую принимать аргументы ключевых слов. (Вклад Кайла Стэнли и Юрия Селиванова в bpo-32309).
При отмене задания из-за таймаута asyncio.wait_for()
теперь будет ждать завершения отмены и в том случае, если timeout <= 0, как это происходит при положительных таймаутах. (Внесено Элвисом Пранскевичусом из bpo-32751).
asyncio
теперь вызывает TyperError
при вызове несовместимых методов с сокетом ssl.SSLSocket
. (Внесено Идо Майклом в bpo-37404).
compileall¶
Добавлена новая возможность использования жестких ссылок для дублированных файлов .pyc
: параметр hardlink_dupes и опция командной строки –hardlink-dupes. (Вклад внес Люмир „Frenzy“ Балхар в 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()
, который отменяет все ожидающие фьючерсы, которые не начали выполняться, вместо того, чтобы ждать их завершения перед выключением исполнителя. (Внесено Кайлом Стэнли в 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).
distutils¶
Команда 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¶
Модуль hashlib
теперь может использовать хэши SHA3 и SHAKE 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).
IDLE и idlelib¶
Добавлена возможность отключения мигания курсора. (Внесено Закери Спитцем в bpo-4603).
Клавиша Escape теперь закрывает окна завершения IDLE. (Внесено Джонни Наджерой в 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¶
Чтобы улучшить согласованность с операторами импорта, importlib.util.resolve_name()
теперь выдает ImportError
вместо ValueError
при попытках некорректного относительного импорта. (Внесено Нгалимом Сирегаром в bpo-37444).
Импортные загрузчики, публикующие неизменяемые объекты модулей, теперь могут публиковать неизменяемые пакеты в дополнение к отдельным модулям. (Внесено Дино Вьеландом в bpo-39336).
Добавлена функция importlib.resources.files()
с поддержкой подкаталогов в данных пакета, соответствующая бэкпорту в importlib_resources
версии 1.5. (Внесено Джейсоном Р. Кумбсом в bpo-39791).
Обновлено importlib.metadata
с importlib_metadata
версии 1.6.1.
проверять¶
inspect.BoundArguments.arguments
заменен OrderedDict
на обычный dict. (Внесено Инадой Наоки в bpo-36350 и bpo-39775).
ipaddress¶
ipaddress
теперь поддерживает IPv6 Scoped Addresses (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()
: возвращает значение наименьшего значащего бита float. (Внесено Виктором Стиннером в bpo-39310).
многопроцессорная обработка¶
В классе multiprocessing.SimpleQueue
появился новый метод close()
для явного закрытия очереди. (Внесено Виктором Стиннером в bpo-30966).
nntplib¶
NNTP
и NNTP_SSL
теперь вызывают ошибку ValueError
, если заданный таймаут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Внесено Донг-Хи На в bpo-39259).
os¶
Добавлены 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¶
Добавлено pathlib.Path.readlink()
, которое действует аналогично os.readlink()
. (Внесено Гиртсом Фолкманисом в bpo-30618)
pdb¶
В Windows теперь Pdb
поддерживает ~/.pdbrc
. (Вклад внесли Тим Хоппер и Дэн Лидрал-Портер в bpo-20523).
poplib¶
POP3
и POP3_SSL
теперь вызывают ошибку ValueError
, если заданный таймаут для их конструктора равен нулю, чтобы предотвратить создание неблокирующего сокета. (Внесено Донг-Хи На в bpo-39259).
pprint¶
pprint
теперь может красиво печатать types.SimpleNamespace
. (Внесено Карлом Бордумом Хансеном в bpo-37376).
pydoc¶
Строка документации теперь отображается не только для класса, функции, метода и т.д., но и для любого объекта, имеющего собственный атрибут __doc__
. (Внесено Сергеем Сторчакой в bpo-40257).
случайный¶
Добавлен новый метод random.Random.randbytes
: генерация случайных байтов. (Внесено Виктором Стиннером в bpo-40286).
сигнал¶
Раскрыта специфическая для Linux функция signal.pidfd_send_signal()
для отправки сигналов процессу, использующему дескриптор файла вместо 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¶
Добавлено tracemalloc.reset_peak()
для установки пикового размера отслеживаемых блоков памяти на текущий размер, чтобы измерить пик определенных частей кода. (Внесено Хуоном Уилсоном в bpo-40630).
набор текста¶
PEP 593 введен тип typing.Annotated
для украшения существующих типов метаданными, специфичными для контекста, и новый параметр include_extras
для typing.get_type_hints()
для доступа к метаданным во время выполнения. (При участии Тиля Вароко и Константина Кашина).
unicodedata¶
База данных Unicode была обновлена до версии 13.0.0. (bpo-39926).
venv¶
Скрипты активации, предоставляемые командой venv
, теперь все последовательно указывают свои настройки подсказки, всегда используя значение, указанное командой __VENV_PROMPT__
. Ранее некоторые сценарии безоговорочно использовали __VENV_PROMPT__
, другие - только если оно было установлено (что было по умолчанию), а один использовал __VENV_NAME__
вместо этого. (Внесено Бреттом Кэнноном в bpo-37663).
xml¶
Символы пробела внутри атрибутов теперь сохраняются при сериализации xml.etree.ElementTree
в XML-файл. EOLN больше не нормализуются до «n». Это результат обсуждения того, как интерпретировать раздел 2.11 спецификации XML. (Внесено Mefistotelis в bpo-39011).
Оптимизации¶
Оптимизирована идиома присвоения временной переменной в осмыслениях. Теперь
for y in [expr]
в вычислениях выполняется так же быстро, как простое присваиваниеy = expr
. Например:sums = [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
(wheel packages). (Внесено Хьюго ван Кеменаде в bpo-39586).В настоящее время
math.factorial()
принимает экземплярыfloat
с неотрицательными целыми значениями (как5.0
). Он вызывает ошибкуValueError
для нецелых и отрицательных плавающих значений. В настоящее время эта функция устарела. В будущих версиях Python он будет выдаватьTypeError
для всех плавающих значений. (Внесено Сергеем Сторчакой в bpo-37315).Модули
parser
иsymbol
устарели и будут удалены в будущих версиях Python. Для большинства случаев пользователи могут использовать этап генерации и компиляции абстрактного синтаксического дерева (AST), используя модульast
.Функции Public C API
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
иPyNode_Compile()
устарели и будут удалены в Python 3.10 вместе со старым парсером.Использование
NotImplemented
в булевом контексте было изжито, так как оно почти исключительно является результатом неправильных реализаций богатых компараторов. Оно будет сделаноTypeError
в одной из будущих версий Python. (Вклад Джоша Розенберга в bpo-35712).Модуль
random
в настоящее время принимает любой хэшируемый тип в качестве возможного значения семени. К сожалению, некоторые из этих типов не гарантированно имеют детерминированное хэш-значение. После Python 3.9 модуль будет ограничивать свои семена типамиNone
,int
,float
,str
,bytes
иbytearray
.Открытие файла
GzipFile
на запись без указания аргумента mode устарело. В будущих версиях Python он всегда будет открываться для чтения по умолчанию. Укажите аргумент mode, чтобы открыть его для записи и заглушить предупреждение. (Внесено Сергеем Сторчакой в bpo-28286).Утратил силу метод
split()
в_tkinter.TkappType
в пользу методаsplitlist()
, который имеет более последовательное и предсказуемое поведение. (Внесено Сергеем Сторчакой в bpo-38371).Явная передача объектов coroutine в
asyncio.wait()
была устаревшей и будет удалена в версии 3.11. (Вклад Юрия Селиванова и Кайла Стэнли в bpo-34790).Стандарты binhex4 и hexbin4 теперь устарели. Модуль
binhex
и следующие функцииbinascii
теперь устарели:(Внесено Виктором Стиннером в bpo-39353).
Классы
ast
slice
,Index
иExtSlice
считаются устаревшими и будут удалены в будущих версиях Python. Самvalue
следует использовать вместоIndex(value)
.Tuple(slices, Load())
следует использовать вместоExtSlice(slices)
. (Внесено Сергеем Сторчакой в 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 может включать новый синтаксис языка, который не может быть разобран синтаксическим анализатором lib2to3 LL(1). Модуль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).Функция языка Си
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).Старый API
plistlib
был удален, он был устаревшим с Python 3.4. Используйте функцииload()
,loads()
,dump()
иdumps()
. Кроме того, был удален параметр use_builtin_types, вместо него всегда используются стандартные объектыbytes
. (Внесено Джоном Янзеном в bpo-36409).Функция языка Си
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).Параметр buffering в
bz2.BZ2File
был удален. Начиная с Python 3.0, он игнорировался, и его использование приводило к появлениюDeprecationWarning
. Передайте объект открытого файла, чтобы управлять тем, как открывается файл. (Внесено Виктором Стиннером в bpo-39357).Параметр encoding в
json.loads()
был удален. Начиная с Python 3.1, он был устаревшим и игнорировался; начиная с Python 3.8 его использование приводило к появлениюDeprecationWarning
. (Внесено Инадой Наоки в 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
структуры СиPyConfig
были удалены. Они требовали специальной сборки 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()
следует использовать для преобразования символьных ссылок в соответствующие символы юникода.
Перенос на Python 3.9¶
В этом разделе перечислены ранее описанные изменения и другие исправления, которые могут потребовать внесения изменений в ваш код.
Изменения в API Python¶
__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
в качестве C-типа вместоPy_UNICODE
. Это изменение не влияет на его поведение, посколькуPy_UNICODE
является псевдонимомwchar_t
с версии Python 3.3. (Внесено Инадой Наоки в bpo-34538).API
logging.getLogger()
теперь возвращает корневой логгер при передаче имени'root'
, тогда как раньше он возвращал некорневой логгер с именем'root'
. Это может повлиять на случаи, когда пользовательский код явно хочет использовать некорневой регистратор с именем'root'
или инстанцирует регистратор с помощьюlogging.getLogger(__name__)
в каком-либо модуле верхнего уровня с именем'root.py'
. (Внесено Vinay Sajip в 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).
Изменения в API языка C¶
Экземпляры heap-allocated types (например, созданные с помощью
PyType_FromSpec()
и подобных API) хранят ссылку на объект своего типа, начиная с 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).
Изменения в API C¶
Новые возможности¶
PEP 573: Добавлены
PyType_FromModuleAndSpec()
для связывания модуля с классом;PyType_GetModule()
иPyType_GetModuleState()
для получения модуля и его состояния; иPyCMethod
иMETH_METHOD
для предоставления методу доступа к классу, в котором он был определен. (Вклад Марселя Плча и Петра Викторина в bpo-38787).Добавлена функция
PyFrame_GetCode()
: получение кода кадра. Добавлена функцияPyFrame_GetBack()
: получить кадр, следующий за внешним кадром. (Внесено Виктором Стиннером в bpo-40421).Добавлено
PyFrame_GetLineNumber()
к ограниченному API языка C. (Внесено Виктором Стиннером в bpo-40421).Добавлены функции
PyThreadState_GetInterpreter()
иPyInterpreterState_Get()
для получения интерпретатора. Добавлена функцияPyThreadState_GetFrame()
для получения текущего кадра состояния потока Python. Добавлена функцияPyThreadState_GetID()
для получения уникального идентификатора состояния потока Python. (Внесено Виктором Стиннером в bpo-39947).В C API добавлена новая публичная функция
PyObject_CallNoArgs()
, которая вызывает вызываемый объект Python без аргументов. Это самый эффективный способ вызова вызываемого объекта Python без аргументов. (Внесено Виктором Стиннером в bpo-37194).Изменения в ограниченном API C (если определен макрос
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()
для вызова объекта с одним позиционным аргументом (исправление Jeroen Demeyer в bpo-37483).
Перенос на Python 3.9¶
PyInterpreterState.eval_frame
(PEP 523) теперь требует нового обязательного параметра tstate (PyThreadState*
). (Внесено Виктором Стиннером в bpo-38500).Модули расширения:
m_traverse
,m_clear
иm_free
функцииPyModuleDef
больше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и перед его выполнением (функция:c:data: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
теперь непрозрачна. Она определена только во внутреннем API языка C (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).Протокол 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).
Удалено¶
Исключил макросы
PyFPE_START_PROTECT()
иPyFPE_END_PROTECT()
изpyfpe.h
из ограниченного API языка C. (Внесено Виктором Стиннером в bpo-38835).Слот
tp_print
из PyTypeObject был удален. Он использовался для печати объектов в файлы в Python 2.7 и ранее. Начиная с Python 3.0, он игнорируется и не используется. (Внесено Джероеном Демейером в bpo-36974).Изменения в ограниченном API C (если определен макрос
Py_LIMITED_API
):Исключение следующих функций из ограниченного API C:
PyThreadState_DeleteCurrent()
(Внесено Джоанной Нанджекье в bpo-37878)._Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
Механизм мусорной корзины, который никогда не работал в ограниченном C API.
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()
: список set free был удален в Python 3.4.PyTuple_ClearFreeList()
PyUnicode_ClearFreeList()
: свободный список Unicode был удален в Python 3.3.
Удалена функция
_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), при этом некоторые новые функции и опции ОС становятся условно доступными в зависимости от версии операционной системы, используемой во время выполнения («weaklinking»).
(Предоставлено Рональдом Оусореном и Лоуренсом Д’Анной в 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__
, должен учитывать это изменение. Для недопустимых форм параметризации , которые в Python 3.9.1 могли проходить молча, может выдаваться DeprecationWarning
. Это collections.abc.Callable
станет DeprecationWarning
в Python 3.10. (Внесено Кеном Джином в TypeError
).
urllib.parse¶
Более ранние версии Python позволяли использовать ;
и &
в качестве разделителей параметров запроса в urllib.parse.parse_qs()
и urllib.parse.parse_qsl()
. По соображениям безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, с &
по умолчанию. Это изменение также затрагивает cgi.parse()
и cgi.parse_multipart()
, поскольку они используют соответствующие функции внутри. Для получения более подробной информации, пожалуйста, обратитесь к соответствующей документации. (Вклад внесли Адам Голдшмидт, Сентхил Кумаран и Кен Джин в bpo-42967).