Что нового в Python 3.9¶
- Редактор:
Лукаш Ланга
В этой статье рассказывается о новых возможностях Python 3.9 по сравнению с 3.8. Python 3.9 был выпущен 5 октября 2020 года. Более подробную информацию можно найти в changelog.
См.также
PEP 596 - График выхода Python 3.9
Резюме - Основные моменты выпуска¶
Новые возможности синтаксиса:
PEP 584, операторы объединения добавлены к
dict
;PEP 585, подсказки типов в стандартных коллекциях;
PEP 614, ослаблены грамматические ограничения на декораторы.
Новые встроенные функции:
PEP 616, строковые методы для удаления префиксов и суффиксов.
Новые возможности в стандартной библиотеке:
PEP 593, гибкие аннотации функций и переменных;
os.pidfd_open()
, что позволяет управлять процессами без гонок и сигналов.
Улучшения в работе переводчика:
PEP 573, быстрый доступ к состоянию модуля из методов типов расширения C;
PEP 617, CPython теперь использует новый парсер, основанный на PEG;
ряд встроенных модулей Python (range, tuple, set, frozenset, list, dict) теперь ускоряются с помощью PEP 590 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
были добавлены операторы Merge (|
) и update (|=
). Они дополняют существующие методы слияния словарей 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)
.
Генераторы с подсказкой типа в стандартных коллекциях¶
Полное описание см. в list
.
Пример:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
Более подробную информацию см. в PEP 585. (Внесено Гвидо ван Россумом, Итаном Смитом и Батуханом Ташкая в bpo-39481).
Новый парсер¶
В Python 3.9 используется новый синтаксический анализатор, основанный на PEG вместо LL(1). Производительность нового парсера примерно сопоставима с производительностью старого, но формализм PEG более гибок, чем LL(1), когда дело доходит до разработки новых функций языка. Мы начнем использовать эту гибкость в Python 3.10 и более поздних версиях.
Модуль ast
использует новый парсер и производит тот же AST, что и старый парсер.
В Python 3.10 старый парсер будет удален, как и вся функциональность, зависящая от него (в первую очередь модуль parser
, который уже давно устарел). В Python 3.9 только вы можете вернуться к парсеру LL(1) с помощью переключателя командной строки (-X oldparser
) или переменной окружения (PYTHONOLDPARSER=1
).
Более подробную информацию см. в PEP 617. (Внесено Гвидо ван Россумом, Пабло Галиндо и Лисандросом Николау в bpo-40334).
Другие языковые изменения¶
__import__()
теперь поднимаетImportError
вместоValueError
, что происходило раньше, когда относительный импорт выходил за пределы пакета верхнего уровня. (Внесено Нгалимом Сирегаром в bpo-37444).Теперь Python получает абсолютный путь к имени файла скрипта, указанному в командной строке (например,
python3 script.py
): атрибут__file__
модуля__main__
стал абсолютным, а не относительным путем. Теперь эти пути остаются действительными после изменения текущего каталога с помощьюos.chdir()
. В качестве побочного эффекта в этом случае в обратном пути также отображается абсолютный путь для фреймов модуля__main__
. (Внесено Виктором Стиннером в bpo-20443).В Python Development Mode и debug build аргументы encoding и errors теперь проверяются при операциях кодирования и декодирования строк. Примеры:
open()
,str.encode()
иbytes.decode()
.По умолчанию, для лучшей производительности, аргумент errors проверяется только при первой ошибке кодирования/декодирования, а аргумент encoding иногда игнорируется для пустых строк. (Внесено Виктором Стиннером в bpo-37388).
"".replace("", s, n)
теперь возвращаетs
вместо пустой строки для всех ненулевыхn
. Теперь это соответствует"".replace("", s)
. Аналогичные изменения есть для объектовbytes
иbytearray
. (Внесено Сергеем Сторчакой в bpo-28029).Теперь в качестве decorator можно использовать любое допустимое выражение. Ранее грамматика была гораздо более строгой. Подробности см. в PEP 614. (Внесено Брандтом Бухером в bpo-39702).
Улучшена справка для модуля
typing
. Теперь для всех специальных форм и специальных общих псевдонимов (например,Union
иList
) показываются докстринги. При использованииhelp()
с общим псевдонимомList[int]
будет показана справка по соответствующему конкретному типу (list
в данном случае). (Внесено Сергеем Сторчакой в bpo-40257).Параллельное выполнение
aclose()
/asend()
/athrow()
теперь запрещено, аag_running
теперь отражает реальное состояние работы асинхронного генератора. (Внесено Юрием Селивановым в bpo-30773).Неожиданные ошибки при вызове метода
__iter__
больше не маскируютсяTypeError
в оператореin
и функцияхcontains()
,indexOf()
иcountOf()
модуляoperator
. (Внесено Сергеем Сторчакой в bpo-40824).Неразвернутые лямбда-выражения больше не могут быть частью выражения в предложении
if
в осмыслениях и генераторных выражениях. Подробности см. в bpo-41848 и bpo-43755.
Новые модули¶
информация о зоне¶
Модуль zoneinfo
добавляет в стандартную библиотеку поддержку базы данных часовых поясов IANA. Он добавляет zoneinfo.ZoneInfo
, конкретную реализацию datetime.tzinfo
, основанную на данных о часовых поясах системы.
Пример:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
В качестве резервного источника данных для платформ, которые не поставляют базу данных IANA, модуль tzdata был выпущен как пакет первой стороны - распространяется через PyPI и поддерживается основной командой CPython.
См.также
- PEP 615 – Поддержка базы данных часовых поясов IANA в стандартной библиотеке
PEP написан и реализован Полом Ганслом
graphlib¶
Был добавлен новый модуль graphlib
, содержащий класс graphlib.TopologicalSorter
, чтобы предложить функциональность для выполнения топологической сортировки графов. (Вклад Пабло Галиндо, Тима Питерса и Ларри Гастингса в bpo-17005).
Улучшенные модули¶
ast¶
В dump()
добавлена опция indent, позволяющая выводить многострочные отступы. (Внесено Сергеем Сторчакой в bpo-37995).
В модуль ast
добавлена функция ast.unparse()
, с помощью которой можно разобрать объект ast.AST
и вывести строку с кодом, который при разборе выдаст эквивалентный объект ast.AST
. (Внесено Пабло Галиндо и Батуханом Таская в bpo-38870).
К узлам 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
теперь поднимает TypeError
при вызове несовместимых методов с сокетом ssl.SSLSocket
. (Внесено Идо Майклом в 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¶
В concurrent.futures.Executor.shutdown()
добавлен новый параметр cancel_futures, который отменяет все ожидающие фьючерсы, которые еще не начали выполняться, вместо того чтобы ждать их завершения перед завершением работы исполнителя. (Внесено Кайлом Стэнли в bpo-39349).
Удалены потоки демонов из ThreadPoolExecutor
и ProcessPoolExecutor
. Это улучшает совместимость с субинтерпретаторами и предсказуемость процессов их завершения. (Внесено Кайлом Стэнли в bpo-39812).
Рабочие в ProcessPoolExecutor
теперь порождаются по требованию, только когда нет свободных незанятых рабочих для повторного использования. Это оптимизирует накладные расходы при запуске и уменьшает потери процессорного времени на простаивающих рабочих. (Внесено Кайлом Стэнли в bpo-39207).
проклятия¶
Добавлены функции curses.get_escdelay()
, curses.set_escdelay()
, curses.get_tabsize()
и curses.set_tabsize()
. (Внесено Энтони Соттилом в bpo-38312).
datetime¶
Методы 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
. (Внесено Donghee Na в 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.) Переместите настройку отступа с вкладки Font на новую вкладку 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
на обычный диктант. (Внесено Инадой Наоки в 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
. (Внесено Donghee Na в 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).
Модуль сокетов теперь поддерживает протокол 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 for s in [0] for x in data for s in [s + x]]
В отличие от оператора
:=
эта идиома не приводит к утечке переменной во внешнюю область видимости.(Предоставлено Serhiy Storchaka в 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 vectorcall. (Вклад Донгхи На, Марка Шеннона, Йеруна Демейера и Петра Викторина в 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
в булевом контексте было отменено, так как это почти исключительно результат неправильной реализации богатого компаратора. В одной из будущих версий Python оно станетTypeError
. (Внесено Джошем Розенбергом в bpo-35712).В настоящее время модуль
random
принимает любой хэшируемый тип в качестве возможного начального значения. К сожалению, некоторые из этих типов не гарантированно имеют детерминированное хэш-значение. После выхода Python 3.9 модуль будет ограничивать свои семена типамиNone
,int
,float
,str
,bytes
иbytearray
.Открытие файла
GzipFile
на запись без указания аргумента mode устарело. В будущих версиях Python он всегда будет открываться для чтения по умолчанию. Укажите аргумент mode, чтобы открыть его для записи и промолчать о предупреждении. (Внесено Сергеем Сторчакой в bpo-28286).Утратил силу метод
split()
из_tkinter.TkappType
в пользу методаsplitlist()
, который имеет более последовательное и предсказуемое поведение. (Внесено Сергеем Сторчакой в bpo-38371).Явная передача объектов coroutine в
asyncio.wait()
была устаревшей и будет удалена в версии 3.11. (Вклад Юрия Селиванова и Кайла Стэнли в bpo-34790).Стандарты binhex4 и hexbin4 теперь устарели. Модуль
binhex
и следующие функцииbinascii
теперь устарели:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Внесено Виктором Стиннером в bpo-39353).
Классы
ast
slice
,Index
иExtSlice
считаются устаревшими и будут удалены в будущих версиях Python. ВместоIndex(value)
следует использовать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()
теперь ничего не дает. С Python 3.7 GIL инициализируетсяPy_Initialize()
. (Внесено Виктором Стиннером в bpo-39877).Передача
None
в качестве первого аргумента в функциюshlex.split()
была устаревшей. (Внесено Закери Спитцем в bpo-33262).smtpd.MailmanProxy()
теперь устарел, так как не может использоваться без внешнего модуляmailman
. (Внесено Сэмюэлем Колвином в bpo-35800).Модуль
lib2to3
теперь выдаетPendingDeprecationWarning
. Python 3.9 перешел на парсер PEG (см. PEP 617), а Python 3.10 может содержать новый синтаксис языка, который не может быть разобран парсером LL(1) в lib2to3. Модульlib2to3
может быть удален из стандартной библиотеки в одной из будущих версий Python. Рассмотрите альтернативы от сторонних разработчиков, такие как LibCST или parso. (Внесено Карлом Мейером в bpo-40360).Параметр random в
random.shuffle()
был устаревшим. (Внесено Раймондом Хеттингером в bpo-40465)
Удалено¶
Ошибочная версия на
unittest.mock.__version__
была удалена.nntplib.NNTP
: Методыxpath()
иxgtitle()
были удалены. Эти методы устарели начиная с версии Python 3.3. Как правило, эти расширения не поддерживаются или не включены администраторами NNTP-серверов. Вместоxgtitle()
используйтеnntplib.NNTP.descriptions()
илиnntplib.NNTP.description()
. (Внесено Donghee Na в 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).Старый
plistlib
API был удален, он был устаревшим, начиная с 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).Параметр буферизации
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()
API теперь возвращает корневой логгер при передаче имени'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()
трактует ведущие нули как восьмеричную систему счисления. Реализация современнойinet_pton()
в glibc не принимает ведущие нули. (Внесено Кристианом Хаймсом в 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).
Изменения в конструкции¶
В скрипт
configure
добавлен параметр--with-platlibdir
: имя каталога библиотек для конкретной платформы, хранящееся в новом атрибуте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()
в ограниченный C API. (Внесено Виктором Стиннером в 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).В общедоступный API добавлены функции
PyObject_GC_IsTracked()
иPyObject_GC_IsFinalized()
, позволяющие запрашивать, отслеживаются ли объекты 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
больше не вызываются, если состояние модуля было запрошено, но еще не выделено. Это происходит сразу после создания модуля и до его выполнения (функция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()
отмечены как устаревшие. Они были устаревшими в 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
. Они были доступны только во внутреннем API языка C. Удален также тип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()
: свободный список Юникода был удален в 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¶
(Предоставлено Юрием Карабасом в ARM64
).
(Предоставлено Рональдом Оусореном и Лоуренсом Д’Анной в bpo-41100).
Заметные изменения в Python 3.9.2¶
коллекции.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__
, должен учитывать это изменение. Для недопустимых форм параметризации collections.abc.Callable
, которые в Python 3.9.1 могли проходить молча, может быть выдана ошибка DeprecationWarning
. Этот DeprecationWarning
станет TypeError
в Python 3.10. (Внесено Кеном Джином в bpo-42195).
urllib.parse¶
В предыдущих версиях Python в качестве разделителей параметров запроса можно было использовать и ;
, и &
в urllib.parse.parse_qs()
и urllib.parse.parse_qsl()
. По соображениям безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, а по умолчанию используется &
. Это изменение также затрагивает cgi.parse()
и cgi.parse_multipart()
, поскольку они используют затронутые функции внутри. Более подробную информацию можно найти в соответствующей документации. (Внесено Адамом Голдшмидтом, Сентхилом Кумараном и Кеном Джином в bpo-42967).
Заметные изменения в Python 3.9.3¶
Исправление безопасности изменяет поведение ftplib.FTP
, чтобы не доверять IPv4-адресу, отправленному с удаленного сервера при установке пассивного канала передачи данных. Вместо этого мы используем IP-адрес ftp-сервера. Для необычного кода, требующего старого поведения, установите для атрибута trust_server_pasv_ipv4_address
экземпляра FTP значение True
(см. gh-87451).
Заметные изменения в Python 3.9.5¶
urllib.parse¶
Наличие символов новой строки или табуляции в части URL позволяет осуществлять некоторые виды атак. В соответствии со спецификацией WHATWG, которая обновляет RFC 3986, символы ASCII новой строки \n
, \r
и табуляции \t
удаляются из URL парсером в urllib.parse
, предотвращая такие атаки. Символы удаления контролируются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
(см. gh-88048).
Примечательная функция безопасности в 3.9.14¶
Преобразование между int
и str
в основаниях, отличных от 2 (двоичное), 4, 8 (восьмеричное), 16 (шестнадцатеричное) или 32, таких как основание 10 (десятичное), теперь вызывает ошибку ValueError
, если количество цифр в строковой форме превышает установленный предел, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за сложности алгоритма. Это смягчение последствий CVE-2020-10735. Это ограничение может быть настроено или отключено с помощью переменной окружения, флага командной строки или sys
. API. См. документацию по integer string conversion length limitation. По умолчанию ограничение составляет 4300 цифр в строковой форме.
Заметные изменения в версии 3.9.17¶
tarfile¶
Методы извлечения в
tarfile
иshutil.unpack_archive()
имеют новый аргумент filter, который позволяет ограничить возможности tar, которые могут быть неожиданными или опасными, например создание файлов вне целевого каталога. Подробности см. в Фильтры для извлечения. В Python 3.12 использование без аргумента filter приводит к появлениюDeprecationWarning
. В Python 3.14 по умолчанию будет отображаться'data'
. (Внесено Петром Викториным в PEP 706).