Содержание страницы
Что нового в Python 3.10¶What’s New In Python 3.10
- Версия
3.10.20
- Дата
11 марта 2026
- Редактор
Pablo Galindo Salgado
В этой статье описаны новые возможности Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Полную информацию см. в журнале изменений.
Итоги – основные изменения¶Summary – Release highlights
Новые синтаксические возможности:
PEP 634, Структурное сопоставление с образцом: спецификация
PEP 635, Структурное сопоставление с образцом: мотивация и обоснование
PEP 636, Структурное сопоставление с образцом: руководство
bpo-12782, теперь официально разрешены контекстные менеджеры в скобках.
Новые возможности в стандартной библиотеке:
PEP 618, добавление опциональной проверки длины в zip.
Улучшения интерпретатора:
PEP 626, точные номера строк для отладки и других инструментов.
Новые возможности типизации:
PEP 604, разрешение записи объединённых типов как X | Y
PEP 612, переменные спецификации параметров
PEP 613, явные псевдонимы типов
PEP 647, пользовательские гарды типов
Важные устаревания, удаления и ограничения:
Новые возможности¶New Features
Контекстные менеджеры в скобках¶Parenthesized context managers
Теперь поддерживается использование круглых скобок для переноса на несколько строк в контекстных менеджерах. Это позволяет форматировать длинный набор контекстных менеджеров на нескольких строках аналогично тому, как это было возможно ранее с операторами import. Например, все эти примеры теперь являются допустимыми:
with (CtxManager() as example):
...
with (
CtxManager1(),
CtxManager2()
):
...
with (CtxManager1() as example,
CtxManager2()):
...
with (CtxManager1(),
CtxManager2() as example):
...
with (
CtxManager1() as example1,
CtxManager2() as example2
):
...
также можно использовать завершающую запятую в конце заключённой группы:
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
...
Этот новый синтаксис использует не LL(1) возможности нового парсера. Подробнее см. PEP 617.
(Авторы: Guido van Rossum, Pablo Galindo и Lysandros Nikolaou в bpo-12782 и bpo-40334.)
Улучшенные сообщения об ошибках¶Better error messages
SyntaxErrors¶
При разборе кода, содержащего незакрытые скобки или квадратные скобки, интерпретатор теперь указывает местоположение незакрытой скобки вместо отображения SyntaxError: unexpected EOF while parsing или указания на некорректное местоположение. Например, рассмотрим следующий код (обратите внимание на незакрытую ‘{‘):
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()
Предыдущие версии интерпретатора сообщали о запутанных местах как о местоположении синтаксической ошибки:
File "example.py", line 3
some_other_code = foo()
^
SyntaxError: invalid syntax
но в Python 3.10 выводится более информативная ошибка:
File "example.py", line 1
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
^
SyntaxError: '{' was never closed
Аналогично, ошибки, связанные с незакрытыми строковыми литералами (одинарные и тройные кавычки), теперь указывают на начало строки вместо сообщения EOF/EOL.
Эти улучшения вдохновлены предыдущей работой в интерпретаторе PyPy.
(Авторы: Pablo Galindo в bpo-42864 и Batuhan Taskaya в bpo-40176.)
SyntaxError исключения, вызываемые интерпретатором, теперь будут подсвечивать
полный диапазон выражения, которое составляет саму синтаксическую ошибку,
а не только место, где обнаружена проблема. Таким образом, вместо отображения
(до Python 3.10):
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
теперь Python 3.10 будет отображать исключение как:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1
foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
Это улучшение было предложено Пабло Галиндо в bpo-43914.
Добавлено значительное количество новых специализированных сообщений для исключений SyntaxError.
Наиболее примечательные из них:
Пропущен
:перед блоками:>>> if rocket.position > event_horizon File "<stdin>", line 1 if rocket.position > event_horizon ^ SyntaxError: expected ':'
(Предложено Пабло Галиндо в bpo-42997.)
Кортежи без скобок в целях (targets) генераторов:
>>> {x,y for x,y in zip('abcd', '1234')} File "<stdin>", line 1 {x,y for x,y in zip('abcd', '1234')} ^ SyntaxError: did you forget parentheses around the comprehension target?
(Предложено Пабло Галиндо в bpo-43017.)
Отсутствуют запятые в литералах коллекций и между выражениями:
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Предложено Пабло Галиндо в bpo-43822.)
Несколько типов исключений без скобок:
>>> try: ... build_dyson_sphere() ... except NotEnoughScienceError, NotEnoughResourcesError: File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError: ^ SyntaxError: multiple exception types must be parenthesized
(Предложено Пабло Галиндо в bpo-43149.)
Отсутствуют
:и значения в литералах словарей:>>> values = { ... x: 1, ... y: 2, ... z: ... } File "<stdin>", line 4 z: ^ SyntaxError: expression expected after dictionary key and ':' >>> values = {x:1, y:2, z w:3} File "<stdin>", line 1 values = {x:1, y:2, z w:3} ^ SyntaxError: ':' expected after dictionary key
(Предложено Пабло Галиндо в bpo-43823.)
Блоки
tryбез блоковexceptилиfinally:>>> try: ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
(Предложено Пабло Галиндо в bpo-44305.)
Использование
=вместо==в сравнениях:>>> if rocket.position = event_horizon: File "<stdin>", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
(Предложено Пабло Галиндо в bpo-43797.)
Использование
*в f-строках:>>> f"Black holes {*all_black_holes} and revelations" File "<stdin>", line 1 (*all_black_holes) ^ SyntaxError: f-string: cannot use starred expression here
(Предложено Пабло Галиндо в bpo-41064.)
IndentationErrors¶
Многие исключения IndentationError теперь содержат больше контекста о том, какой блок
ожидал отступа, включая местоположение инструкции:
>>> def foo():
... if lel:
... x = 2
File "<stdin>", line 3
x = 2
^
IndentationError: expected an indented block after 'if' statement in line 2
AttributeErrors¶
При выводе AttributeError, PyErr_Display() будет предлагать
имена похожих атрибутов в объекте, в котором возникло исключение:
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
(Предложено Пабло Галиндо в bpo-38530.)
Предупреждение
Обратите внимание: это не будет работать, если
PyErr_Display()не вызывается для отображения ошибки что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.
NameErrors¶
При выводе NameError, вызванного интерпретатором, PyErr_Display()
будет предлагать имена похожих переменных в функции, в которой возникло исключение:
>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
(Предложено Пабло Галиндо в bpo-38530.)
Предупреждение
Обратите внимание: это не будет работать, если
PyErr_Display()не вызывается для отображения ошибки, что может произойти, если используется другая пользовательская функция отображения ошибок. Это обычная ситуация в некоторых интерактивных оболочках, например IPython.
PEP 626: Точные номера строк для отладки и других инструментов ¶PEP 626: Precise line numbers for debugging and other tools
PEP 626 привносит более точные и надёжные номера строк для инструментов отладки, профилирования и покрытия кода. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.
Атрибут f_lineno объектов фреймов всегда будет содержать ожидаемый номер строки.
Атрибут co_lnotab объектов кода устарел и будет удалён в 3.12.
Коду, которому нужно преобразовывать смещение в номер строки, следует вместо этого использовать новый метод co_lines().
PEP 634: Структурное сопоставление с образцом¶PEP 634: Structural Pattern Matching
Структурное сопоставление с образцом было добавлено в виде оператора match и операторов case с шаблонами и связанными с ними действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление с образцом позволяет программам извлекать информацию из сложных типов данных, выполнять ветвление на основе структуры данных и применять конкретные действия в зависимости от формы данных.
Синтаксис и операции¶Syntax and operations
Общий синтаксис сопоставления с образцом:
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
Оператор match принимает выражение и сравнивает его значение с последовательными шаблонами, заданными в виде одного или нескольких блоков case. В частности, сопоставление с образцом работает следующим образом:
используя данные с типом и формой (
subject)вычисляя
subjectв оператореmatchсравнивая проверяемое значение с каждым шаблоном в операторе
caseсверху вниз до подтверждения совпадения.выполняя действие, связанное с шаблоном подтверждённого совпадения
Если точное совпадение не подтверждено, последний оператор case, универсальный шаблон
_, если он предусмотрен, будет использован как совпадающий. Если точное совпадение не подтверждено и универсальный шаблон отсутствует, весь блок match ничего не делает (no-op).
Декларативный подход¶Declarative approach
Читатели могут быть знакомы с сопоставлением с образцом по простому примеру сопоставления выражения (объекта данных) с литералом (шаблоном) с помощью оператора switch в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.
Более мощные примеры сопоставления с образцом можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении с образцом подход является «декларативным» и явно задаёт условия (шаблоны), которым должны соответствовать данные.
Хотя «императивный» набор инструкций с вложенными операторами «if» можно использовать для достижения чего-то похожего на структурное сопоставление с образцом, он менее понятен, чем «декларативный» подход. Вместо этого «декларативный» подход задаёт условия для совпадения и более читаем благодаря явным шаблонам. Хотя структурное сопоставление с образцом можно использовать в его простейшей форме – сравнение переменной с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы проверяемого значения.
Простой шаблон: сопоставление с литералом¶Simple pattern: match to a literal
Рассмотрим этот пример как сопоставление с образцом в его простейшей форме: значение
(проверяемое выражение) сопоставляется с несколькими литералами (шаблонами). В примере
ниже status является проверяемым выражением оператора match. Шаблонами являются
каждый из операторов case, где литералы представляют коды статуса запроса.
Связанное с оператором case действие выполняется после совпадения:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
Если в указанную выше функцию передано status со значением 418, возвращается «I’m a teapot».
Если передано status со значением 500, оператор case с _ совпадёт
как универсальный шаблон, и будет возвращено «Something’s wrong with the internet».
Обратите внимание на последний блок: имя переменной _ действует как универсальный шаблон и гарантирует,
что проверяемое значение всегда совпадёт. Использование _ необязательно.
Можно объединить несколько литералов в одном шаблоне с помощью | («или»):
case 401 | 403 | 404:
return "Not allowed"
Поведение без универсального шаблона¶Behavior without the wildcard
Если изменить предыдущий пример, удалив последний блок case, пример станет таким:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
Без использования _ в операторе case совпадения может не быть. Если совпадения
нет, поведение – пустая операция (no-op). Например, если передано status со значением 500,
ничего не происходит.
Шаблоны с литералом и переменной¶Patterns with a literal and variable
Шаблоны могут выглядеть как распаковка в присваивании, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на её x-координату и y-координату:
# point – это кортеж (x, y)
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
case _:
raise ValueError("Not a point")
Первый шаблон содержит два литерала, (0, 0), и может рассматриваться как
расширение шаблона-литерала, показанного выше. Следующие два шаблона объединяют
литерал и переменную, и переменная связывает значение из проверяемого выражения
(point). Четвёртый шаблон захватывает два значения, что делает его
концептуально похожим на распаковывающее присваивание (x, y) = point.
Шаблоны и классы¶Patterns and classes
Если для структурирования данных используются классы, в качестве шаблона можно использовать имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет захватывать атрибуты класса в переменные:
class Point:
x: int
y: int
def location(point):
match point:
case Point(x=0, y=0):
print("Origin is the point's location.")
case Point(x=0, y=y):
print(f"Y={y} and the point is on the y-axis.")
case Point(x=x, y=0):
print(f"X={x} and the point is on the x-axis.")
case Point():
print("The point is located somewhere else on the plane.")
case _:
print("Not a point")
Шаблоны с позиционными параметрами¶Patterns with positional parameters
Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые предоставляют
упорядочивание для своих атрибутов (например, dataclasses). Вы также можете определить конкретную
позицию для атрибутов в шаблонах, задав специальный атрибут __match_args__
в своих классах. Если он установлен в (“x”, “y”), следующие шаблоны
все эквивалентны (и все связывают атрибут y с переменной var):
Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)
Вложенные шаблоны¶Nested patterns
Шаблоны могут быть произвольно вложенными. Например, если наши данные – короткий список точек, их можно сопоставить следующим образом:
match points:
case []:
print("No points in the list.")
case [Point(0, 0)]:
print("The origin is the only point in the list.")
case [Point(x, y)]:
print(f"A single point {x}, {y} is in the list.")
case [Point(0, y1), Point(0, y2)]:
print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
case _:
print("Something else is found in the list.")
Сложные шаблоны и универсальный шаблон¶Complex patterns and the wildcard
До этого момента в примерах использовался _ отдельно в последнем операторе case.
Универсальный шаблон можно использовать в более сложных шаблонах, например ('error', code, _).
Например:
match test_variable:
case ('warning', code, 40):
print("A warning has been received.")
case ('error', code, _):
print(f"An error {code} occurred.")
В приведённом выше случае test_variable будет соответствовать (‘error’, code, 100) и
(‘error’, code, 800).
Ограничитель¶Guard
К шаблону можно добавить предложение if, известное как «страж». Если
страж ложен, match переходит к следующему блоку case. Обратите внимание,
что захват значения происходит до вычисления стража:
match point:
case Point(x, y) if x == y:
print(f"The point is located on the diagonal Y=X at {x}.")
case Point(x, y):
print(f"Point is not on the diagonal.")
Другие ключевые особенности¶Other Key Features
Несколько других важных возможностей:
Как и при распаковке присваиваний, шаблоны кортежей и списков имеют одинаковый смысл и по сути сопоставляются с произвольными последовательностями. Технически субъект должен быть последовательностью. Поэтому важное исключение: шаблоны не сопоставляются с итераторами. Кроме того, чтобы избежать распространённой ошибки, шаблоны последовательностей не сопоставляются со строками.
Шаблоны последовательностей поддерживают подстановочные знаки:
[x, y, *rest]и(x, y, *rest)работают аналогично подстановочным знакам при распаковке присваиваний. Имя после*также может быть_, поэтому(x, y, *_)сопоставляется с последовательностью из не менее двух элементов без привязки остальных элементов.Шаблоны отображений:
{"bandwidth": b, "latency": l}захватывает значения"bandwidth"и"latency"из словаря. В отличие от шаблонов последовательностей, лишние ключи игнорируются. Также поддерживается подстановочный знак**rest. (Но**_был бы избыточным, поэтому не допускается.)Подшаблоны могут быть захвачены с помощью ключевого слова
as:case (Point(x1, y1), Point(x2, y2) as p2): ...
Это связывает x1, y1, x2, y2, как и ожидалось, без пункта
as, а p2 – со всем вторым элементом субъекта.Большинство литералов сравниваются по равенству. Однако синглтоны
True,FalseиNoneсравниваются по идентичности.Именованные константы можно использовать в шаблонах. Они должны быть точечными именами, чтобы константа не интерпретировалась как переменная захвата:
from enum import Enum class Color(Enum): RED = 0 GREEN = 1 BLUE = 2 match color: case Color.RED: print("I see red!") case Color.GREEN: print("Grass is green") case Color.BLUE: print("I'm feeling the blues :(")
Полную спецификацию см. в PEP 634. Мотивация и обоснование находятся в PEP 635, а более подробное руководство – в PEP 636.
Опциональные EncodingWarning и encoding="locale" параметры¶Optional EncodingWarning and encoding="locale" option
Кодировка по умолчанию для TextIOWrapper и open() зависит от платформы и локали. Поскольку UTF-8 используется на большинстве платформ Unix, опускание параметра encoding при открытии файлов в UTF-8 (например, JSON, YAML, TOML, Markdown) является очень распространённой ошибкой. Например:
# ОШИБКА: следует использовать режим "rb" или encoding="utf-8".
with open("data.json") as f:
data = json.load(f)
Для обнаружения такой ошибки добавлен опциональный EncodingWarning. Он выдаётся, когда sys.flags.warn_default_encoding истинно и используется кодировка по умолчанию, зависящая от локали.
Параметр -X warn_default_encoding и PYTHONWARNDEFAULTENCODING добавлены для включения предупреждения.
См. Кодировка текста для получения дополнительной информации.
Прочие изменения языка ¶Other Language Changes
Тип
intполучил новый методint.bit_count(), который возвращает количество единиц в двоичном представлении целого числа, также известное как число единиц (population count). (Автор: Niklas Fiekas в bpo-29882.)Представления, возвращаемые
dict.keys(),dict.values()иdict.items(), теперь все имеют атрибутmapping, предоставляющий объектtypes.MappingProxyType, оборачивающий исходный словарь. (Автор: Dennis Sweeney в bpo-40890.)PEP 618: функция
zip()теперь имеет необязательный флагstrict, используемый для требования, чтобы все итерируемые объекты имели одинаковую длину.Встроенные функции и функции расширений, принимающие целочисленные аргументы, больше не принимают
Decimal,Fractionи другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод__int__(), но не имеющие метода__index__()). (Автор: Serhiy Storchaka в bpo-37999.)Если
object.__ipow__()возвращаетNotImplemented, оператор будет корректно возвращаться кobject.__pow__()иobject.__rpow__(), как и ожидается. (Автор: Alex Shkop в bpo-38302.)Присваивающие выражения теперь можно использовать без скобок внутри литералов множеств и включений множеств, а также в индексах последовательностей (но не в срезах).
Функции получили новый атрибут
__builtins__, который используется для поиска встроенных символов при выполнении функции, вместо поиска в__globals__['__builtins__']. Атрибут инициализируется из__globals__["__builtins__"], если он существует, иначе из текущих встроенных объектов. (Автор: Mark Shannon в bpo-42990.)Две новые встроенные функции –
aiter()иanext()были добавлены для предоставления асинхронных аналоговiter()иnext()соответственно. (Авторы: Joshua Bronson, Daniel Pope и Justin Wang в bpo-31861.)Статические методы (
@staticmethod) и методы классов (@classmethod) теперь наследуют атрибуты методов (__module__,__name__,__qualname__,__doc__,__annotations__) и имеют новый атрибут__wrapped__. Более того, статические методы теперь можно вызывать как обычные функции. (Автор: Victor Stinner в bpo-43682.)Аннотации для сложных целей (всё, кроме целей
simple name, заданных PEP 526) больше не вызывают никаких эффектов во время выполнения приfrom __future__ import annotations. (Автор: Batuhan Taskaya в bpo-42737.)Объекты классов и модулей теперь лениво создают пустые словари аннотаций по требованию. Словари аннотаций хранятся в
__dict__объекта для обратной совместимости. Это улучшает лучшие практики работы с__annotations__; для получения дополнительной информации см. Annotations Best Practices. (Автор: Larry Hastings в bpo-43901.)Аннотации, состоящие из
yield,yield from,awaitили именованных выражений, теперь запрещены приfrom __future__ import annotationsиз-за их побочных эффектов. (Автор: Batuhan Taskaya в bpo-42725.)Использование несвязанных переменных,
super()и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет эффекта приfrom __future__ import annotations. (Автор: Batuhan Taskaya в bpo-42725.)Хеши значений NaN как типа
float, так и типаdecimal.Decimalтеперь зависят от идентичности объекта. Раньше они всегда хешировались в0, несмотря на то что значения NaN не равны друг другу. Это приводило к потенциально квадратичному поведению во время выполнения из-за чрезмерных коллизий хешей при создании словарей и множеств, содержащих несколько NaN. (Автор: Raymond Hettinger в bpo-43475.)При удалении константы
__debug__будет возбуждатьсяSyntaxError(вместоNameError). (Автор: Dong-hee Na, bpo-45000.)Исключения
SyntaxErrorтеперь имеют атрибутыend_linenoиend_offset. Они будут равныNone, если не определены. (Автор: Pablo Galindo в bpo-43914.)
Новые модули¶New Modules
Пока нет.
Улучшенные модули¶Improved Modules
asyncio¶
Добавлен отсутствующий метод connect_accepted_socket().
(Автор: Alex Grönholm в bpo-41332.)
argparse¶
Вводящая в заблуждение фраза «optional arguments» была заменена на «options» в справке argparse. Некоторым тестам может потребоваться адаптация, если они полагаются на точное совпадение вывода. (Автор: Raymond Hettinger в bpo-9694.)
array¶
Метод index() у array.array теперь имеет
необязательные параметры start и stop.
(Авторы: Anders Lorentsen и Zackery Spytz в bpo-31956.)
asynchat, asyncore, smtpd¶
Эти модули были отмечены как устаревшие в своей документации, начиная с Python 3.6. Теперь во все три модуля добавлено DeprecationWarning во время импорта.
base64¶
Добавлены base64.b32hexencode() и base64.b32hexdecode() для поддержки
кодирования Base32 с расширенным шестнадцатеричным алфавитом.
bdb¶
Добавлена clearBreakpoints() для сброса всех установленных точек останова.
(Предложено Ирит Катриэлем в bpo-24160.)
bisect¶
Добавлена возможность указания функции key в API модуля bisect.
(Предложено Рэймондом Хеттингером в bpo-4356.)
codecs¶
Добавлена функция codecs.unregister() для отмены регистрации функции поиска кодеков.
(Предложено Хай Ши в bpo-41842.)
collections.abc¶
__args__ у параметризованных обобщённых типов для
collections.abc.Callable теперь согласованы с typing.Callable.
collections.abc.Callable обобщённый тип теперь упрощает параметры типа, аналогично
tому, что делает typing.Callable. Это означает, что
collections.abc.Callable[[int, str], str] будет иметь __args__ от
(int, str, str); ранее это было ([int, str], str). Чтобы обеспечить это
изменение, types.GenericAlias теперь может быть подклассом, и при индексировании типа collections.abc.Callable будет возвращаться подкласс. Обратите внимание,
что может возникать TypeError для некорректных форм параметризации
collections.abc.Callable, которые в Python 3.9 могли проходить молча.
(Предложено Кеном Джином в bpo-42195.)
contextlib¶
Добавлен менеджер контекста contextlib.aclosing() для безопасного закрытия асинхронных генераторов
и объектов, представляющих асинхронно освобождаемые ресурсы.
(Предложено Джунги Кимом и Джоном Бельмонте в bpo-41229.)
Добавлена поддержка асинхронного менеджера контекста для contextlib.nullcontext().
(Предложено Томом Грингаузом в bpo-41543.)
Добавлен AsyncContextDecorator для поддержки использования асинхронных контекстных менеджеров
в качестве декораторов.
curses¶
Расширенные функции цвета, добавленные в ncurses 6.1, будут прозрачно использоваться
curses.color_content(), curses.init_color(),
curses.init_pair() и curses.pair_content(). Новая функция
curses.has_extended_color_support() указывает, поддерживаются ли расширенные цвета
базовой библиотекой ncurses.
(Предложено Джеффри Кинчером и Хансом Петтером Янссоном в bpo-36982.)
Константы BUTTON5_* теперь доступны в модуле curses, если
они предоставляются базовой библиотекой curses.
(Предложено Закери Спайтцем в bpo-39273.)
dataclasses¶
__slots__¶
Добавлен параметр slots в декоратор dataclasses.dataclass().
(Предложено Юрием Карабасом в bpo-42269)
Поля только по ключу¶Keyword-only fields
dataclasses теперь поддерживает поля, которые являются только по ключу в сгенерированном методе __init__. Существует несколько способов указания таких полей.
Можно указать, что все поля являются только по ключу:
from dataclasses import dataclass
@dataclass(kw_only=True)
class Birthday:
name: str
birthday: datetime.date
Оба параметра name и birthday являются только по ключу в
сгенерированном методе __init__.
Можно указать «только по ключу» для каждого поля отдельно:
from dataclasses import dataclass
@dataclass
class Birthday:
name: str
birthday: datetime.date = field(kw_only=True)
Здесь только birthday является только по ключу. Если установить kw_only для
отдельных полей, следует учитывать, что существуют правила переупорядочивания
полей: поля только по ключу должны следовать после полей не только по ключу. Подробнее см. в полной документации dataclasses.
Также можно указать, что все поля, следующие за маркером KW_ONLY, являются только по ключу. Вероятно, это будет наиболее распространённый способ использования:
from dataclasses import dataclass, KW_ONLY
@dataclass
class Point:
x: float
y: float
_: KW_ONLY
z: float = 0.0
t: float = 0.0
Здесь z и t являются параметрами только по ключу, а x и
y – нет.
(Предложено Эриком В. Смитом в bpo-43532.)
distutils¶
Весь пакет distutils является устаревшим и будет удалён в Python
3.12. Его функциональность для указания сборки пакетов уже полностью
заменена сторонними пакетами setuptools и
packaging, а большинство других часто используемых API доступны в других местах
стандартной библиотеки (например, platform, shutil,
subprocess или sysconfig). Планов по переносу какой-либо другой функциональности из
distutils нет, и приложения, использующие другие функции, должны рассмотреть создание частных копий кода.
Обратитесь к PEP 632 для обсуждения.
Команда bdist_wininst, устаревшая в Python 3.8, была удалена.
Теперь для распространения двоичных пакетов в Windows рекомендуется использовать команду bdist_wheel.
(Предложено Виктором Стиннером в bpo-42802.)
doctest¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
encodings¶
encodings.normalize_encoding() теперь игнорирует не-ASCII символы.
(Добавлено Хай Ши в bpo-39337.)
fileinput¶
Добавлены параметры encoding и errors в fileinput.input() и
fileinput.FileInput.
(Добавлено Инадой Наоки в bpo-43712.)
fileinput.hook_compressed() теперь возвращает объект TextIOWrapper,
когда mode равен «r», а файл сжат, как и несжатые файлы.
(Добавлено Инадой Наоки в bpo-5758.)
faulthandler ¶
Модуль faulthandler теперь обнаруживает, произошла ли фатальная ошибка во время
сборки мусора.
(Добавлено Виктором Стиннером в bpo-44466.)
gc¶
Добавлены аудит-хуки для gc.get_objects(), gc.get_referrers() и
gc.get_referents(). (Добавлено Пабло Галиндо в bpo-43439.)
glob¶
Добавлены параметры root_dir и dir_fd в glob() и
iglob(), которые позволяют указать корневой каталог для поиска.
(Добавлено Сергеем Сторчакой в bpo-38144.)
hashlib¶
Модуль hashlib требует OpenSSL 1.1.1 или новее. (Добавлено Кристианом Хаймсом в PEP 644 и bpo-43669.)
Модуль hashlib имеет предварительную поддержку OpenSSL 3.0.0. (Добавлено Кристианом Хаймсом в bpo-38820 и других тикетах.)
Чистая реализация на Python pbkdf2_hmac() объявлена устаревшей. В
будущем PBKDF2-HMAC будет доступен только при сборке Python с поддержкой
OpenSSL.
(Добавлено Кристианом Хаймсом в bpo-43880.)
hmac¶
Модуль hmac теперь использует реализацию HMAC от OpenSSL внутри. (Добавлено Кристианом Хаймсом в bpo-40645.)
IDLE и idlelib¶IDLE and idlelib
IDLE теперь вызывает sys.excepthook() (при запуске без «-n»).
Ранее пользовательские хуки игнорировались. (Добавлено Кеном Хилтоном в
bpo-43008.)
Переработан диалог настроек. Вкладка General разделена на вкладки Windows и Shell/Ed. Источники справки, расширяющие меню Help, перемещены на вкладку Extensions. Освобождено место для новых опций и сокращён диалог. Последнее улучшает отображение диалога на маленьких экранах. (Добавлено Терри Джан Риди в bpo-40468.) Настройка отступа (indent space) перенесена с вкладки Font на новую вкладку Windows. (Добавлено Марком Роземаном и Терри Джан Риди в bpo-33962.)
Эти изменения были перенесены в поддерживаемый выпуск 3.9.
Добавлена боковая панель Shell. Основное приглашение («>>>») перемещено на боковую панель. Вторичные приглашения («…») добавлены на боковую панель. Щелчок левой кнопкой мыши и перетаскивание (опционально) выделяют одну или несколько строк текста, как в боковой панели с номерами строк редактора. Щелчок правой кнопкой после выделения строк текста отображает контекстное меню с пунктом «copy with prompts». Это объединяет приглашения с боковой панели со строками выделенного текста. Этот пункт также появляется в контекстном меню текста. (Добавлено Талем Эйнатом в bpo-37903.)
Используются пробелы вместо табуляции для отступа интерактивного кода. Это делает ввод интерактивного кода «выглядящим правильно». Возможность этого была основной мотивацией для добавления боковой панели Shell. (Добавлено Терри Джан Риди в bpo-37892.)
Подсвечиваются новые мягкие ключевые слова match,
case и _ в
операторах сопоставления с образцом. Однако эта подсветка не идеальна
и может быть некорректной в некоторых редких случаях, включая некоторые _ в
образцах case. (Добавлено Талем Эйнатом в bpo-44010.)
Новое в поддерживаемых выпусках 3.10.
Применять подсветку синтаксиса для файлов .pyi. (Авторы: Alex Waygood и Terry Jan Reedy, bpo-45447.)
Включение приглашений при сохранении содержимого Shell с вводом и выводом. (Автор: Terry Jan Reedy, gh-95191.)
importlib.metadata¶
Функциональная совместимость с importlib_metadata 4.6
(история).
importlib.metadata entry points
теперь предоставляют более удобную возможность
выбора точек входа по группе и имени с помощью нового
importlib.metadata.EntryPoints класса. См. примечание о совместимости
в документации для получения дополнительной информации об устаревании и использовании.
Добавлен importlib.metadata.packages_distributions() для преобразования
модулей и пакетов Python верхнего уровня в их
importlib.metadata.Distribution.
inspect¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
Добавлен inspect.get_annotations(), который безопасно вычисляет аннотации,
определённые для объекта. Он обходит особенности доступа к аннотациям
для различных типов объектов и делает очень мало предположений об объекте,
который исследует. inspect.get_annotations() также может корректно преобразовывать
строковые аннотации обратно в объекты. inspect.get_annotations() теперь считается
лучшей практикой для доступа к словарю аннотаций, определённому для любого объекта Python;
дополнительную информацию о лучших практиках работы с аннотациями см. в
Лучшие практики для аннотаций.
Кроме того, inspect.signature(),
inspect.Signature.from_callable() и inspect.Signature.from_function()
теперь вызывают inspect.get_annotations() для получения аннотаций. Это означает,
что inspect.signature() и inspect.Signature.from_callable()
также теперь могут преобразовывать строковые аннотации обратно в объекты.
(Автор: Larry Hastings в bpo-43817.)
itertools¶
Добавлен itertools.pairwise().
(Автор: Raymond Hettinger в bpo-38200.)
linecache¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
os¶
Добавлена поддержка os.cpu_count() для VxWorks RTOS.
(Автор: Peixing Xin в bpo-41440.)
Добавлена новая функция os.eventfd() и вспомогательные функции для обёртки системного вызова
eventfd2 в Linux.
(Автор: Christian Heimes в bpo-41001.)
Добавлен os.splice(), который позволяет перемещать данные между двумя файловыми
дескрипторами без копирования между адресным пространством ядра и пользовательским
адресным пространством, причём один из файловых дескрипторов должен ссылаться на
канал. (Автор: Pablo Galindo в bpo-41625.)
Добавлены O_EVTONLY, O_FSYNC, O_SYMLINK
и O_NOFOLLOW_ANY для macOS.
(Автор: Dong-hee Na, bpo-43106.)
Начиная с версии 3.10.15, os.mkdir() и os.makedirs() в Windows теперь поддерживают передачу значения mode равным 0o700 для применения контроля доступа к новому каталогу. Это неявно влияет на tempfile.mkdtemp() и является смягчением для CVE-2024-4030. Другие значения mode по-прежнему игнорируются. (Предложено Стивом Дауэром в gh-118486.)
os.path¶
os.path.realpath() теперь принимает именованный аргумент strict. Если установлено
значение True, OSError возбуждается, если путь не существует или обнаружен цикл
символической ссылки.
(Автор: Barney Gale в bpo-43757.)
pathlib¶
Добавлена поддержка срезов для PurePath.parents.
(Автор: Joshua Cannon в bpo-35498.)
Добавлена поддержка отрицательной индексации для PurePath.parents.
(Автор: Yaroslav Pankovych в bpo-21041.)
Добавлен метод Path.hardlink_to, который
заменяет link_to(). Новый метод имеет тот же порядок
аргументов, что и symlink_to().
(Автор: Barney Gale в bpo-39950.)
pathlib.Path.stat() и chmod() теперь принимают именованный аргумент
follow_symlinks для согласованности с соответствующими
функциями в модуле os.
(Автор: Barney Gale в bpo-39906.)
platform¶
Добавлен platform.freedesktop_os_release() для получения идентификации операционной
системы из стандартного файла freedesktop.org os-release.
(Автор: Christian Heimes в bpo-28468.)
pprint¶
pprint.pprint() теперь принимает новый именованный аргумент underscore_numbers.
(Автор: sblondon в bpo-42914.)
pprint теперь может красиво печатать экземпляры dataclasses.dataclass.
(Автор: Lewis Gaul в bpo-43080.)
py_compile¶
Добавлена опция --quiet в интерфейс командной строки py_compile.
(Автор: Gregory Schevchenko в bpo-38731.)
pyclbr¶
Добавлен атрибут end_lineno в объекты Function и Class
в дереве, возвращаемом pyclbr.readline() и
pyclbr.readline_ex(). Он соответствует существующему (начальному) lineno.
(Автор: Aviral Srivastava в bpo-38307.)
shelve¶
Модуль shelve теперь по умолчанию использует pickle.DEFAULT_PROTOCOL
вместо протокола pickle 3 при создании shelves.
(Автор: Zackery Spytz в bpo-34204.)
statistics¶
Добавлены функции covariance(), correlation()
Пирсона и простая linear_regression().
(Автор: Tymoteusz Wołodźko в bpo-38490.)
site¶
Если модуль не определяет __loader__, используется __spec__.loader.
(Автор: Brett Cannon в bpo-42133.)
socket¶
Исключение socket.timeout теперь является псевдонимом TimeoutError.
(Автор: Christian Heimes в bpo-42413.)
Добавлена возможность создавать MPTCP-сокеты с IPPROTO_MPTCP
(Автор: Rui Cunha в bpo-43571.)
Добавлена опция IP_RECVTOS для получения поля Type of Service (ToS) или DSCP/ECN
(Автор: Georg Sauthoff в bpo-44077.)
ssl¶
Модуль ssl требует OpenSSL 1.1.1 или новее. (Автор: Christian Heimes в PEP 644 и bpo-43669.)
Модуль ssl получил предварительную поддержку OpenSSL 3.0.0 и новую опцию
OP_IGNORE_UNEXPECTED_EOF.
(Автор: Christian Heimes в bpo-38820, bpo-43794,
bpo-43788, bpo-43791, bpo-43799, bpo-43920,
bpo-43789 и bpo-43811.)
Устаревшие функции и использование устаревших констант теперь приводят к
DeprecationWarning. У ssl.SSLContext.options по умолчанию установлены
OP_NO_SSLv2 и OP_NO_SSLv3, поэтому он не может
предупредить о повторной установке флага. В
разделе об устаревших возможностях приведён список устаревших
функций.
(Автор: Christian Heimes в bpo-43880.)
Модуль ssl теперь использует более безопасные настройки по умолчанию. Шифры без прямой секретности (forward secrecy) или с MAC SHA-1 отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с надёжностью менее 112 бит.
SSLContext по умолчанию использует минимальную версию протокола TLS 1.2.
Настройки основаны на исследовании Hynek Schlawack.
(Автор: Christian Heimes в bpo-43998.)
Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python активно их не блокирует. Однако параметры сборки OpenSSL, настройки дистрибутивов, патчи вендоров и наборы шифров могут препятствовать успешному рукопожатию.
Добавлен параметр timeout в функцию ssl.get_server_certificate().
(Автор: Zackery Spytz в bpo-31870.)
Модуль ssl использует heap-типы и многофазную инициализацию. (Автор: Christian Heimes в bpo-42333.)
Добавлен новый флаг проверки VERIFY_X509_PARTIAL_CHAIN.
(Автор: l0x в bpo-40849.)
sqlite3¶
Добавлены события аудита для connect/handle(),
enable_load_extension() и
load_extension().
(Автор: Erlend E. Aasland в bpo-43762.)
sys¶
Добавлен атрибут sys.orig_argv: список исходных аргументов командной строки,
переданных исполняемому файлу Python.
(Автор: Victor Stinner в bpo-23427.)
Добавлен sys.stdlib_module_names, содержащий список имён модулей стандартной библиотеки.
(Автор: Victor Stinner в bpo-42955.)
tempfile¶
Начиная с версии 3.10.15 в Windows, режим по умолчанию 0o700, используемый tempfile.mkdtemp(), теперь ограничивает доступ к новому каталогу из-за изменений в os.mkdir(). Это смягчение для CVE-2024-4030. (Предложено Стивом Дауэром в gh-118486.)
_thread¶
_thread.interrupt_main() теперь принимает необязательный номер сигнала для
имитации (по умолчанию по-прежнему signal.SIGINT).
(Автор: Antoine Pitrou в bpo-43356.)
threading¶
Добавлены threading.gettrace() и threading.getprofile() для
получения функций, установленных threading.settrace() и
threading.setprofile() соответственно.
(Автор: Mario Corchero в bpo-42251.)
Добавлен threading.__excepthook__ для получения исходного значения
threading.excepthook(), если оно установлено в сломанное или другое
значение.
(Автор: Mario Corchero в bpo-42308.)
traceback¶
Функции format_exception(),
format_exception_only() и
print_exception() теперь могут принимать объект исключения
в качестве позиционного аргумента (только позиционный).
(Авторы: Zackery Spytz и Matthias Bussonnier в bpo-26389.)
types¶
Повторно введены классы types.EllipsisType, types.NoneType
и types.NotImplementedType, предоставляющие новый набор
типов, легко интерпретируемых средствами проверки типов.
(Автор: Bas van Beek в bpo-41810.)
typing¶
Основные изменения см. в новых возможностях, связанных с аннотациями типов.
Поведение typing.Literal было изменено в соответствии с PEP 586
и для соответствия поведению статических анализаторов типов, описанному в PEP.
Literalтеперь удаляет дубликаты параметров.Проверки равенства между объектами
Literalтеперь не зависят от порядка.Сравнения
Literalтеперь учитывают типы. Например,Literal[0] == Literal[False]ранее давалоTrue. Теперь этоFalse. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.Объекты
Literalтеперь будут вызывать исключениеTypeErrorпри проверке равенства, если какой-либо из их параметров не является хешируемым. Обратите внимание, что объявлениеLiteralс нехешируемыми параметрами не вызовет ошибку:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(Предложено Юрием Карабасом в bpo-42345.)
Добавлена новая функция typing.is_typeddict() для проверки, является ли аннотация
типом typing.TypedDict.
(Предложено Патриком Ридером в bpo-41792.)
Подклассы typing.Protocol, которые объявляют только переменные данных,
теперь будут вызывать TypeError при проверке с помощью isinstance, если они не
декорированы runtime_checkable(). Ранее такие проверки
проходили молча. Пользователям следует декорировать свои
подклассы декоратором runtime_checkable(),\если они хотят использовать протоколы времени выполнения.
(Предложено Юрием Карабасом в bpo-38908.)
Импорт из подмодулей typing.io и typing.re теперь будет вызывать
DeprecationWarning. Эти подмодули устарели начиная с
Python 3.8 и будут удалены в будущей версии Python. Все, что
принадлежит этим подмодулям, следует импортировать напрямую из
typing.
(Предложено Sebastian Rittau в bpo-38291.)
unittest¶
Добавлен новый метод assertNoLogs() в дополнение к существующему
assertLogs(). (Предложено Kit Yan Choi
в bpo-39385.)
urllib.parse¶
В версиях Python ниже 3.10 допускалось использование как ;, так и & в качестве
разделителей параметров запроса в urllib.parse.parse_qs() и
urllib.parse.parse_qsl(). Из соображений безопасности и для соответствия
новым рекомендациям W3C теперь разрешен только один
разделитель, по умолчанию &. Это изменение также затрагивает
cgi.parse() и cgi.parse_multipart(), так как они внутренне используют затронутые функции.
Подробнее см. в их документации.
(Предложено Adam Goldschmidt, Senthil Kumaran и Ken Jin в bpo-42967.)
The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline \n, \r and tab \t characters are stripped from the
URL by the parser in urllib.parse preventing such attacks. The removal
characters are controlled by a new module level variable
urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (See bpo-43882)
xml¶
Добавлен класс LexicalHandler в модуль
xml.sax.handler.
(Предложено Jonathan Gossage и Zackery Spytz в bpo-35018.)
zipimport¶
Добавлены методы, связанные с PEP 451: find_spec(),
zipimport.zipimporter.create_module() и
zipimport.zipimporter.exec_module().
(Предложено Brett Cannon в bpo-42131.)
Добавлен метод invalidate_caches().
(Предложено Desmond Cheong в bpo-14678.)
Оптимизации¶Optimizations
Конструкторы
str(),bytes()иbytearray()теперь работают быстрее (примерно на 30–40% для маленьких объектов). (Предложено Serhiy Storchaka в bpo-41334.)Модуль
runpyтеперь импортирует меньше модулей. Время запуска командыpython3 -m module-nameв среднем в 1,4 раза быстрее. На Linuxpython3 -I -m module-nameимпортирует 69 модулей в Python 3.9, тогда как в Python 3.10 импортирует только 51 модуль (-18). (Предложено Victor Stinner в bpo-41006 и bpo-41718.)Инструкция
LOAD_ATTRтеперь использует новый механизм «per opcode cache». Она работает примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Предложено Pablo Galindo и Yury Selivanov в bpo-42093 и Guido van Rossum в bpo-42927, на основе идей, первоначально реализованных в PyPy и MicroPython.)При сборке Python с
--enable-optimizationsтеперь-fno-semantic-interpositionдобавляется как в команду компиляции, так и в команду компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью--enable-sharedсgcc, до 30%. См. эту статью для подробностей. (Предложено Victor Stinner и Pablo Galindo в bpo-38980.)Используется новый код управления выходным буфером для модулей
bz2/lzma/zlib, и добавлена функция.readall()к классу_compression.DecompressReader. Распаковка bz2 теперь быстрее в 1,09x ~ 1,17x, распаковка lzma – в 1,20x ~ 1,32x,GzipFile.read(-1)– в 1,11x ~ 1,18x. (Предложено Ma Lin, проверено Gregory P. Smith, в bpo-41486)При использовании строковых аннотаций словари аннотаций для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, и объект функции лениво преобразует его в словарь аннотаций по требованию. Эта оптимизация сокращает время CPU, необходимое для определения аннотированной функции, вдвое. (Предложено Yurii Karabas и Inada Naoki в bpo-42202.)
Функции поиска подстроки, такие как
str1 in str2иstr2.find(str1), теперь иногда используют алгоритм поиска строк «Two-Way» Крочемора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Предложено Dennis Sweeney в bpo-41972)Добавлены микрооптимизации в
_PyType_Lookup()для улучшения производительности поиска в кеше атрибутов типа в типичном случае попадания в кеш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Предложено Dino Viehland в bpo-43452.)Следующие встроенные функции теперь поддерживают более быстрый механизм вызова vectorcall PEP 590:
map(),filter(),reversed(),bool()иfloat(). (Предложено Донг-хи На и Йеруном Демейером в bpo-43575, bpo-43287, bpo-41922, bpo-41873 и bpo-41870.)Производительность
BZ2Fileулучшена за счет удаления внутреннихRLock. Это делаетBZ2Fileпотоконебезопасным при наличии нескольких одновременных читателей или писателей, как и его эквивалентные классы вgzipиlzmaвсегда были. (Предложено Inada Naoki в bpo-43785.)
Устарело¶Deprecated
В настоящее время Python допускает числовые литералы, непосредственно после которых следуют ключевые слова, например
0in x,1or x,0if 1else 2. Это приводит к появлению сбивающих с толку и неоднозначных выражений, таких как[0x1for x in y](которые можно рассматривать как[0x1 for x in y]или[0x1f or x in y]). Начиная с этого выпуска, если за числовым литералом непосредственно следует одно из ключевых словand,else,for,if,in,isиor, выдаётся предупреждение об устаревании. В будущих выпусках оно будет заменено на синтаксическое предупреждение, а затем на синтаксическую ошибку. (Предложено Сергеем Сторчакой в bpo-43833.)Начиная с этого выпуска будет предпринята согласованная работа по очистке старой семантики импорта, которая сохранялась для совместимости с Python 2.7. В частности,
find_loader()/find_module()(заменено наfind_spec()),load_module()(заменено наexec_module()),module_repr()(о чём система импорта заботится сама), атрибут__package__(заменён на__spec__.parent), атрибут__loader__(заменён на__spec__.loader) и атрибут__cached__(заменён на__spec__.cached) будут постепенно удалены (а также другие классы и методы вimportlib). При необходимости будут выдаватьсяImportWarningи/илиDeprecationWarning, чтобы помочь определить код, требующий обновления в ходе этого перехода.Всё пространство имён
distutilsобъявлено устаревшим и будет удалено в Python 3.12. Подробнее см. в разделе изменения модулей.Нецелочисленные аргументы для
random.randrange()объявлены устаревшими.ValueErrorустарел в пользуTypeError. (Предложено Сергеем Сторчакой и Раймондом Хеттингером в bpo-37319.)Различные методы
load_module()классаimportlibбыли задокументированы как устаревшие, начиная с Python 3.6, но теперь они также будут вызыватьDeprecationWarning. Используйте вместо нихexec_module(). (Предложено Бреттом Кэнноном в bpo-26131.)zimport.zipimporter.load_module()объявлен устаревшим в пользуexec_module(). (Предложено Бреттом Кэнноном в bpo-26131.)Использование
load_module()системой импорта теперь вызываетImportWarning, поскольку предпочтительнее использоватьexec_module(). (Предложено Бреттом Кэнноном в bpo-26131.)Использование
importlib.abc.MetaPathFinder.find_module()иimportlib.abc.PathEntryFinder.find_module()системой импорта теперь вызываетImportWarning, поскольку предпочтительнее использоватьimportlib.abc.MetaPathFinder.find_spec()иimportlib.abc.PathEntryFinder.find_spec()соответственно. Для помощи в переносе можно использоватьimportlib.util.spec_from_loader(). (Предложено Бреттом Кэнноном в bpo-42134.)Использование
importlib.abc.PathEntryFinder.find_loader()системой импорта теперь вызываетImportWarning, поскольку предпочтительнее использоватьimportlib.abc.PathEntryFinder.find_spec(). Для помощи в переносе можно использоватьimportlib.util.spec_from_loader(). (Предложено Бреттом Кэнноном в bpo-43672.)Различные реализации
importlib.abc.MetaPathFinder.find_module()(importlib.machinery.BuiltinImporter.find_module(),importlib.machinery.FrozenImporter.find_module(),importlib.machinery.WindowsRegistryFinder.find_module(),importlib.machinery.PathFinder.find_module(),importlib.abc.MetaPathFinder.find_module()),importlib.abc.PathEntryFinder.find_module()(importlib.machinery.FileFinder.find_module()) иimportlib.abc.PathEntryFinder.find_loader()(importlib.machinery.FileFinder.find_loader()) теперь вызываютDeprecationWarningи планируются к удалению в Python 3.12 (ранее они были задокументированы как устаревшие в Python 3.4). (Предложено Бреттом Кэнноном в bpo-42135.)importlib.abc.Finderобъявлен устаревшим (включая его единственный методfind_module()). Оба классаimportlib.abc.MetaPathFinderиimportlib.abc.PathEntryFinderбольше не наследуются от этого класса. Вместо этого следует наследовать от одного из этих двух классов по ситуации. (Предложено Бреттом Кэнноном в bpo-42135.)Уведомления об устаревании для
imp,importlib.find_loader(),importlib.util.set_package_wrapper(),importlib.util.set_loader_wrapper(),importlib.util.module_for_loader(),pkgutil.ImpImporterиpkgutil.ImpLoaderбыли обновлены: теперь в качестве планируемой версии удаления указан Python 3.12 (в предыдущих версиях Python они начали вызыватьDeprecationWarning). (Предложено Бреттом Кэнноном в bpo-43720.)Система импорта теперь использует атрибут
__spec__у модулей, прежде чем обратиться кmodule_repr()для метода__repr__()модуля. Удаление использованияmodule_repr()запланировано на Python 3.12. (Предложено Бреттом Кэнноном в bpo-42137.)importlib.abc.Loader.module_repr(),importlib.machinery.FrozenLoader.module_repr()иimportlib.machinery.BuiltinLoader.module_repr()объявлены устаревшими и планируются к удалению в Python 3.12. (Предложено Бреттом Кэнноном в bpo-42136.)sqlite3.OptimizedUnicodeне документирован и считается устаревшим начиная с Python 3.3, когда он стал псевдонимом дляstr. Теперь он объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Эрлендом Э. Осландом в bpo-42264.)Не документированная встроенная функция
sqlite3.enable_shared_cacheтеперь объявлена устаревшей и запланирована к удалению в Python 3.12. Документация SQLite3 настоятельно не рекомендует её использовать. Подробнее см. в документации SQLite3. Если необходимо использовать общий кеш, откройте базу данных в режиме URI с помощью параметра запросаcache=shared. (Предложено Эрлендом Э. Осландом в bpo-24464.)Следующие методы
threadingтеперь объявлены устаревшими:threading.currentThread=>threading.current_thread()threading.activeCount=>threading.active_count()threading.Condition.notifyAll=>threading.Condition.notify_all()threading.Event.isSet=>threading.Event.is_set()threading.Thread.setName=>threading.Thread.namethreading.thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.Thread.setDaemon=>threading.Thread.daemon
(Предложено Йелле Зейлстрой в gh-87889.)
pathlib.Path.link_to()объявлен устаревшим и запланирован к удалению в Python 3.12. Вместо него используйтеpathlib.Path.hardlink_to(). (Предложено Барни Гейлом в bpo-39950.)cgi.log()объявлен устаревшим и запланирован к удалению в Python 3.12. (Предложено Инадой Наоки в bpo-41139.)Следующие возможности
sslобъявлены устаревшими начиная с Python 3.6, Python 3.7 или OpenSSL 1.1.0 и будут удалены в 3.11:OP_NO_SSLv2,OP_NO_SSLv3,OP_NO_TLSv1,OP_NO_TLSv1_1,OP_NO_TLSv1_2иOP_NO_TLSv1_3заменяются наsslSSLContext.minimum_versionиsslSSLContext.maximum_version.PROTOCOL_SSLv2,PROTOCOL_SSLv3,PROTOCOL_SSLv23,PROTOCOL_TLSv1,PROTOCOL_TLSv1_1,PROTOCOL_TLSv1_2иPROTOCOL_TLSобъявлены устаревшими в пользуPROTOCOL_TLS_CLIENTиPROTOCOL_TLS_SERVERwrap_socket()заменяется наssl.SSLContext.wrap_socket()RAND_pseudo_bytes(),RAND_egd()Возможности NPN, такие как
ssl.SSLSocket.selected_npn_protocol()иssl.SSLContext.set_npn_protocols(), заменяются на ALPN.
Отладка threading (
PYTHONTHREADDEBUGпеременная окружения) устарела в Python 3.10 и будет удалена в Python 3.12. Эта функция требует отладочной сборки Python. (Автор: Victor Stinner в bpo-44584.)Импорт из подмодулей
typing.ioиtyping.reтеперь будет вызыватьDeprecationWarning. Эти подмодули будут удалены в будущей версии Python. Всё, что относится к этим подмодулям, следует импортировать напрямую изtyping. (Предложено Себастьяном Риттау в bpo-38291.)
Удалено¶Removed
Удалены специальные методы
__int__,__float__,__floordiv__,__mod__,__divmod__,__rfloordiv__,__rmod__и__rdivmod__классаcomplex. Они всегда вызывалиTypeError. (Предложено Сергеем Сторчакой в bpo-41974.)Метод
ParserBase.error()из приватного и недокументированного модуля_markupbaseбыл удалён.html.parser.HTMLParser– единственный подклассParserBase, и его реализацияerror()уже была удалена в Python 3.5. (Предложено Беркером Пексагом в bpo-31844.)Удалён атрибут
unicodedata.ucnhash_CAPI, который был внутренним объектом PyCapsule. Соответствующая приватная структура_PyUnicode_Name_CAPIбыла перемещена во внутренний C API. (Предложено Виктором Стиннером в bpo-42157.)Удалён модуль
parser, который был объявлен устаревшим в версии 3.9 из-за перехода на новый PEG-парсер, а также все исходные C-файлы и заголовочные файлы, которые использовались только старым парсером, включаяnode.h,parser.h,graminit.hиgrammar.h.Удалены функции публичного C API
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlagsиPyNode_Compile, которые были объявлены устаревшими в версии 3.9 из-за перехода на новый PEG-парсер.Удалён модуль
formatter, который был объявлен устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Изначально его планировалось удалить в Python 3.6, но такие удаления были отложены до окончания поддержки Python 2.7. Текущим пользователям следует скопировать используемые классы в свой код. (Предложено Донг-хи На и Терри Дж. Риди в bpo-42299.)Удалена функция
PyModule_GetWarningsModule(), которая стала бесполезной после того, как модуль _warnings был преобразован во встроенный модуль в версии 2.6. (Предложено Хай Ши в bpo-42599.)Удалены устаревшие псевдонимы для абстрактных базовых классов коллекций из модуля
collections. (Автор: Victor Stinner в bpo-37324.)Параметр
loopбыл удалён из большинства высокоуровневого APIasyncioпосле объявления устаревшим в Python 3.8. Причины этого изменения многообразны:Это упрощает высокоуровневый API.
Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.
Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.
Обратите внимание: низкоуровневый API по-прежнему принимает
loop. Примеры замены существующего кода см. в разделе Изменения в Python API.(Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в bpo-42392.)
Перенос на Python 3.10¶Porting to Python 3.10
В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.
Изменения в синтаксисе Python¶Changes in the Python syntax
Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в
0in x). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в bpo-43833.)
Изменения в Python API¶Changes in the Python API
Параметры etype функций
format_exception(),format_exception_only()иprint_exception()в модулеtracebackпереименованы в exc. (Авторы: Zackery Spytz и Matthias Bussonnier в bpo-26389.)atexit: При завершении Python, если колбэк, зарегистрированный с помощьюatexit.register(), завершается ошибкой, его исключение теперь записывается в журнал. Ранее регистрировались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Автор: Victor Stinner в bpo-42639.)Обобщённый тип
collections.abc.Callableтеперь уплощает параметры типа, аналогично тому, что делаетtyping.Callable. Это означает, чтоcollections.abc.Callable[[int, str], str]будет иметь__args__из(int, str, str); ранее это было([int, str], str). Код, обращающийся к аргументам черезtyping.get_args()или__args__, должен учитывать это изменение. Кроме того,TypeErrorможет быть возбуждено для некорректных форм параметризацииcollections.abc.Callable, которые в Python 3.9 могли проходить незамеченными. (Автор: Ken Jin в bpo-42195.)socket.htons()иsocket.ntohs()теперь возбуждаютOverflowErrorвместоDeprecationWarning, если заданный параметр не помещается в 16-битное целое без знака. (Автор: Erlend E. Aasland в bpo-42393.)Параметр
loopбыл удалён из большинства высокоуровневого APIasyncioпосле объявления устаревшим в Python 3.8.Корутина, которая сейчас выглядит так:
async def foo(loop): await asyncio.sleep(1, loop=loop)
Должна быть заменена на:
async def foo(): await asyncio.sleep(1)
Если
foo()была специально спроектирована не для работы в работающем цикле событий текущего потока (например, для работы в цикле событий другого потока), рассмотрите возможность использованияasyncio.run_coroutine_threadsafe()вместо этого.(Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в bpo-42392.)
Конструктор
types.FunctionTypeтеперь наследует текущие встроенные функции, если словарь globals не содержит ключа"__builtins__", вместо использования{"None": None}в качестве встроенных функций: такое же поведение, как у функцийeval()иexec(). Определение функции с помощьюdef function(...): ...в Python не затрагивается, глобальные переменные не могут быть переопределены этим синтаксисом: он также наследует текущие встроенные функции. (Автор: Victor Stinner в bpo-42990.)
Изменения в C API¶Changes in the C API
Функции C API
PyParser_SimpleParseStringFlags,PyParser_SimpleParseStringFlagsFilename,PyParser_SimpleParseFileFlags,PyNode_Compileи тип, используемый этими функциями,struct _node, были удалены из-за перехода на новый PEG-парсер.Исходный код теперь следует компилировать непосредственно в объект кода, например, с помощью
Py_CompileString(). Полученный объект кода затем можно выполнить, например, с помощьюPyEval_EvalCode().В частности:
Вызов
PyParser_SimpleParseStringFlagsс последующимPyNode_Compileможно заменить вызовомPy_CompileString().Прямой замены для
PyParser_SimpleParseFileFlagsне существует. Чтобы скомпилировать код из аргументаFILE *, вам нужно будет прочитать файл на C и передать полученный буфер вPy_CompileString().Чтобы скомпилировать файл по заданному имени файла
char *, необходимо явно открыть файл, прочитать его и скомпилировать результат. Один из способов – использовать модульioс функциямиPyImport_ImportModule(),PyObject_CallMethod(),PyBytes_AsString()иPy_CompileString(), как показано ниже. (Объявления и обработка ошибок опущены.)io_module = Import_ImportModule("io"); fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb"); source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); result = PyObject_CallMethod(fileobject, "close", ""); source_buf = PyBytes_AsString(source_bytes_object); code = Py_CompileString(source_buf, filename, Py_file_input);
Для объектов
FrameObjectчленf_lastiтеперь представляет смещение в wordcode, а не просто смещение в строке байткода. Это означает, что это число необходимо умножить на 2 для использования с API, которые ожидают смещение в байтах (например,PyCode_Addr2Line()). Также обратите внимание, что членf_lastiобъектовFrameObjectне считается стабильным: используйте вместо негоPyFrame_GetLineNumber().
Изменения байткода CPython¶CPython bytecode changes
Инструкция
MAKE_FUNCTIONтеперь принимает в качестве аннотаций функции либо словарь, либо кортеж строк. (Предложено Юрием Карабасом и Инадой Наоки в bpo-42202.)
Изменения сборки¶Build Changes
PEP 644: Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Предложено Кристианом Хаймсом в bpo-43669.)
Для сборки Python теперь требуются функции C99
snprintf()иvsnprintf(). (Предложено Виктором Штиннером в bpo-36020.)sqlite3требует SQLite 3.7.15 или выше. (Предложено Сергеем Федосеевым и Эрлендом Э. Аасландом в bpo-40744 и bpo-40810.)Модуль
atexitтеперь всегда должен быть встроенным модулем. (Предложено Виктором Штиннером в bpo-42639.)Добавлена опция
--disable-test-modulesв скриптconfigure: не собирать и не устанавливать тестовые модули. (Предложено Ксавье де Гаем, Томасом Петаззони и Пейсином Сином в bpo-27640.)Добавлен
--with-wheel-pkg-dir=PATH optionв скрипт./configure. Если указано, модульensurepipищет колесные пакетыsetuptoolsиpipв этом каталоге: если оба присутствуют, эти колесные пакеты используются вместо встроенных колесных пакетов ensurepip.Некоторые политики упаковки дистрибутивов Linux рекомендуют не включать зависимости. Например, Fedora устанавливает пакеты wheel в каталог
/usr/share/python-wheels/и не устанавливает пакетensurepip._bundled.(Предложено Виктором Штиннером в bpo-42856.)
Добавлена новая
configure --without-static-libpython option, чтобы не собирать статическую библиотекуlibpythonMAJOR.MINOR.aи не устанавливать объектный файлpython.o.(Предложено Виктором Штиннером в bpo-43103.)
Скрипт
configureтеперь использует утилитуpkg-config, если она доступна, для определения местоположения заголовков и библиотек Tcl/Tk. Как и раньше, эти местоположения можно указать явно с помощью опций конфигурации--with-tcltk-includesи--with-tcltk-libs. (Предложено Манолисом Стаматогианнакисом в bpo-42603.)Добавлена опция
--with-openssl-rpathв скриптconfigure. Эта опция упрощает сборку Python с пользовательской установкой OpenSSL, например./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto. (Предложено Кристианом Хаймсом в bpo-43466.)
Изменения C API¶C API Changes
PEP 652: Поддержание стабильного ABI¶PEP 652: Maintaining the Stable ABI
Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. Стабильность C API описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.
Новые возможности¶New Features
Результат
PyNumber_Index()теперь всегда имеет точный типint. Ранее результатом мог быть экземпляр подклассаint. (Предложено Сергеем Сторчакой в bpo-40792.)Добавлен новый член
orig_argvв структуруPyConfig: список исходных аргументов командной строки, переданных исполняемому файлу Python. (Предложено Виктором Штиннером в bpo-23427.)Добавлены макросы
PyDateTime_DATE_GET_TZINFO()иPyDateTime_TIME_GET_TZINFO()для доступа к атрибутамtzinfoобъектовdatetime.datetimeиdatetime.time. (Предложено Закери Спайтцем в bpo-30155.)Добавлена функция
PyCodec_Unregister()для отмены регистрации функции поиска кодеков. (Предложено Хай Ши в bpo-41842.)Добавлена функция
PyIter_Send(), позволяющая отправить значение в итератор без возбуждения исключенияStopIteration. (Предложено Владимиром Матвеевым в bpo-41756.)Добавлен
PyUnicode_AsUTF8AndSize()в ограниченный C API. (Предложено Алексом Гейнором в bpo-41784.)Добавлена функция
PyModule_AddObjectRef(): похожа наPyModule_AddObject(), но не крадёт ссылку на значение при успехе. (Предложено Виктором Штиннером в bpo-1635741.)Добавлены функции
Py_NewRef()иPy_XNewRef()для увеличения счётчика ссылок объекта и возврата объекта. (Предложено Виктором Штиннером в bpo-42262.)Функции
PyType_FromSpecWithBases()иPyType_FromModuleAndSpec()теперь принимают один класс в качестве аргумента bases. (Предложено Сергеем Сторчакой в bpo-42423.)Функция
PyType_FromModuleAndSpec()теперь принимает NULL-слотtp_doc. (Предложено Хай Ши в bpo-41832.)Функция
PyType_GetSlot()может принимать статические типы. (Предложено Хай Ши и Петром Викториным в bpo-41073.)Добавлена новая функция
PySet_CheckExact()в C-API, проверяющая, является ли объект экземпляромset, но не экземпляром подтипа. (Автор: Pablo Galindo в bpo-43277.)Добавлена функция
PyErr_SetInterruptEx(), позволяющая передавать номер сигнала для имитации. (Автор: Antoine Pitrou в bpo-43356.)Ограниченный C-API теперь поддерживается, если Python собран в режиме отладки (если определён макрос
Py_DEBUG). В ограниченном C-API функцииPy_INCREF()иPy_DECREF()теперь реализованы как вызовы непрозрачных функций, а не как прямой доступ к членуPyObject.ob_refcnt, если Python собран в режиме отладки и макросPy_LIMITED_APIнацелен на Python 3.10 или новее. Поддержка ограниченного C-API в режиме отладки стала возможна благодаря тому, что структураPyObjectодинакова в релизном и отладочном режимах начиная с Python 3.8 (см. bpo-36465).Ограниченный C-API по-прежнему не поддерживается в специальной сборке
--with-trace-refs(макросPy_TRACE_REFS). (Автор: Victor Stinner в bpo-43688.)Добавлена функция
Py_Is(x, y)для проверки, является ли объект x тем же объектом y, что аналогичноx is yв Python. Также добавлены функцииPy_IsNone(),Py_IsTrue(),Py_IsFalse()для проверки, является ли объект соответственно синглтономNone, синглтономTrueили синглтономFalse. (Автор: Victor Stinner в bpo-43753.)Добавлены новые функции для управления сборщиком мусора из C-кода:
PyGC_Enable(),PyGC_Disable(),PyGC_IsEnabled(). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из C-кода без необходимости импорта модуляgc.Добавлен новый флаг типа
Py_TPFLAGS_DISALLOW_INSTANTIATIONдля запрета создания экземпляров типа. (Автор: Victor Stinner в bpo-43916.)Добавлен новый флаг типа
Py_TPFLAGS_IMMUTABLETYPEдля создания неизменяемых объектов типа: атрибуты типа нельзя ни установить, ни удалить. (Авторы: Victor Stinner и Erlend E. Aasland в bpo-43908.)
Перенос на Python 3.10¶Porting to Python 3.10
Теперь для использования форматов
PyArg_ParseTuple()иPy_BuildValue(), которые используют#, должен быть определён макросPY_SSIZE_T_CLEAN:es#,et#,s#,u#,y#,z#,U#иZ#. См. Разбор аргументов и формирование значений и PEP 353. (Автор: Victor Stinner в bpo-40943.)Поскольку
Py_REFCNT()изменена на встраиваемую статическую функцию,Py_REFCNT(obj) = new_refcntдолжна быть заменена наPy_SET_REFCNT(obj, new_refcnt): см.Py_SET_REFCNT()(доступно начиная с Python 3.9). Для обратной совместимости может использоваться этот макрос:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(Автор: Victor Stinner в bpo-39573.)
Вызов
PyDict_GetItem()без удержания GIL ранее допускался по историческим причинам. Теперь это запрещено. (Автор: Victor Stinner в bpo-40839.)PyUnicode_FromUnicode(NULL, size)иPyUnicode_FromStringAndSize(NULL, size)теперь возбуждаютDeprecationWarning. Для выделения объекта Unicode без начальных данных используйтеPyUnicode_New(). (Автор: Inada Naoki в bpo-36346.)Приватная структура
_PyUnicode_Name_CAPIunicodedata.ucnhash_CAPIAPI PyCapsule перемещена во внутренний C-API. (Автор: Victor Stinner в bpo-42157.)Функции
Py_GetPath(),Py_GetPrefix(),Py_GetExecPrefix(),Py_GetProgramFullPath(),Py_GetPythonHome()иPy_GetProgramName()теперь возвращаютNULL, если они вызваны доPy_Initialize()(до инициализации Python). Используйте новый API Начальная конфигурация Python для получения Конфигурации путей Python. (Автор: Victor Stinner в bpo-42260.)Макросы
PyList_SET_ITEM(),PyTuple_SET_ITEM()иPyCell_SET()больше нельзя использовать в качестве l-value или r-value. Например,x = PyList_SET_ITEM(a, b, c)иPyList_SET_ITEM(a, b, c) = xтеперь приводят к ошибке компиляции. Это предотвращает ошибки наподобие тестаif (PyList_SET_ITEM (a, b, c) < 0) .... (Авторы: Zackery Spytz и Victor Stinner в bpo-30459.)Файлы
odictobject.h,parser_interface.h,picklebufobject.h,pyarena.h,pyctype.h,pydebug.h,pyfpe.hиpytime.h(не входящие в ограниченный API) перемещены в каталогInclude/cpython. Эти файлы не следует включать напрямую, поскольку они уже включены вPython.h; см. Файлы для включения. Если они были включены напрямую, рассмотрите включениеPython.hвместо этого. (Автор: Nicholas Sim в bpo-35134.)Используйте флаг типа
Py_TPFLAGS_IMMUTABLETYPEдля создания неизменяемых объектов типа. Не полагайтесь наPy_TPFLAGS_HEAPTYPE, чтобы определить, является ли объект типа изменяемым; вместо этого проверяйте, установлен лиPy_TPFLAGS_IMMUTABLETYPE. (Авторы: Victor Stinner и Erlend E. Aasland в bpo-43908.)Незадокументированная функция
Py_FrozenMainудалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Автор: Petr Viktorin в bpo-26241.)
Устарело¶Deprecated
Функция
PyUnicode_InternImmortal()теперь устарела и будет удалена в Python 3.12; используйтеPyUnicode_InternInPlace()вместо неё. (Автор: Victor Stinner в bpo-41692.)
Удалено¶Removed
Удалены функции
Py_UNICODE_str*, работающие со строкамиPy_UNICODE*. (Автор: Inada Naoki в bpo-41123.)Py_UNICODE_strlen: используйтеPyUnicode_GetLength()илиPyUnicode_GET_LENGTHPy_UNICODE_strcat: используйтеPyUnicode_CopyCharacters()илиPyUnicode_FromFormat()Py_UNICODE_strcpy,Py_UNICODE_strncpy: используйтеPyUnicode_CopyCharacters()илиPyUnicode_Substring()Py_UNICODE_strcmp: используйтеPyUnicode_Compare()Py_UNICODE_strncmp: используйтеPyUnicode_Tailmatch()Py_UNICODE_strchr,Py_UNICODE_strrchr: используйтеPyUnicode_FindChar()
Удалена
PyUnicode_GetMax(). Переходите на новые API (PEP 393). (Автор: Inada Naoki в bpo-41103.)Удалена
PyLong_FromUnicode(). Переходите наPyLong_FromUnicodeObject(). (Автор: Inada Naoki в bpo-41103.)Удалено
PyUnicode_AsUnicodeCopy(). ИспользуйтеPyUnicode_AsUCS4Copy()илиPyUnicode_AsWideCharString()(Автор: Inada Naoki, bpo-41103.)Удалена переменная
_Py_CheckRecursionLimit: она заменена наceval.recursion_limitструктурыPyInterpreterState. (Автор: Victor Stinner, bpo-41834.)Удалены недокументированные макросы
Py_ALLOW_RECURSIONиPy_END_ALLOW_RECURSION, а также полеrecursion_criticalструктурыPyInterpreterState. (Автор: Serhiy Storchaka, bpo-41936.)Удалена недокументированная функция
PyOS_InitInterrupts(). При инициализации Python уже неявно устанавливает обработчики сигналов: см.PyConfig.install_signal_handlers. (Автор: Victor Stinner, bpo-41713.)Remove the
PyAST_Validate()function. It is no longer possible to build a AST object (mod_tytype) with the public C API. The function was already excluded from the limited C API (PEP 384). (Contributed by Victor Stinner in bpo-43244.)Удалены заголовочный файл
symtable.hи недокументированные функции:PyST_GetScope()PySymtable_Build()PySymtable_BuildObject()PySymtable_Free()Py_SymtableString()Py_SymtableStringObject()
Функция
Py_SymtableString()по ошибке была частью стабильного ABI, но не могла использоваться, так как заголовочный файлsymtable.hбыл исключён из ограниченного C API.Вместо этого используйте модуль Python
symtable. (Автор: Victor Stinner, bpo-43244.)Удалён
PyOS_ReadlineFunctionPointer()из заголовков ограниченного C API и изpython3.dll(библиотеки, предоставляющей стабильный ABI в Windows). Поскольку функция принимает аргументFILE*, её стабильность ABI не может быть гарантирована. (Автор: Petr Viktorin, bpo-43868.)Удалены заголовочные файлы
ast.h,asdl.hиPython-ast.h. Эти функции были недокументированы и исключены из ограниченного C API. Большинство имён, определённых в этих заголовочных файлах, не имели префиксаPyи поэтому могли создавать конфликты имён. Например,Python-ast.hопределял макросYield, который конфликтовал с именемYield, используемым заголовком Windows<winbase.h>. Вместо этого используйте модуль Pythonast. (Автор: Victor Stinner, bpo-43244.)Удалены функции компилятора и парсера, использующие тип
struct _mod, так как публичный C API для AST был удалён:PyAST_Compile()PyAST_CompileEx()PyAST_CompileObject()PyFuture_FromAST()PyFuture_FromASTObject()PyParser_ASTFromFile()PyParser_ASTFromFileObject()PyParser_ASTFromFilename()PyParser_ASTFromString()PyParser_ASTFromStringObject()
Эти функции были недокументированы и исключены из ограниченного C API. (Автор: Victor Stinner, bpo-43244.)
Удалён заголовочный файл
pyarena.hс функциями:PyArena_New()PyArena_Free()PyArena_Malloc()PyArena_AddPyObject()
Эти функции были недокументированы, исключены из ограниченного C API и использовались только внутри компилятора. (Автор: Victor Stinner, bpo-43244.)
Элемент
PyThreadState.use_tracingудалён для оптимизации Python. (Автор: Mark Shannon, bpo-43760.)
Важная функция безопасности в 3.10.7¶Notable security feature in 3.10.7
Преобразование между int и str в системах счисления, отличных от 2
(двоичной), 4, 8 (восьмеричной), 16 (шестнадцатеричной) или 32, например, 10 (десятичной),
теперь вызывает ValueError, если количество цифр в строковом представлении
превышает предельное значение, чтобы избежать потенциальных атак типа «отказ в обслуживании»
из-за алгоритмической сложности. Это мера смягчения последствий для CVE-2020-10735.
Этот предел можно настроить или отключить с помощью переменной окружения, флага командной строки
или sys API. См. документацию ограничение длины преобразования
целых чисел в строку. Значение по умолчанию
– 4300 цифр в строковом представлении.
Важная функция безопасности в 3.10.8¶Notable security feature in 3.10.8
Устаревший модуль mailcap теперь отказывается внедрять небезопасный текст
(имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого
текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд,
как если бы тест провалился).
(Автор: Petr Viktorin, gh-98966.)
Заметные изменения в 3.10.12¶Notable Changes in 3.10.12
tarfile¶
Методы извлечения в
tarfileиshutil.unpack_archive()получили новый аргумент filter, позволяющий ограничивать возможности tar, которые могут быть неожиданными или опасными, например создание файлов за пределами целевого каталога. Подробнее см. Extraction filters. В Python 3.12 использование без аргумента filter вызоветDeprecationWarning. В Python 3.14 значение по умолчанию будет изменено на'data'. (Автор: Petr Viktorin в PEP 706.)
Заметные изменения в 3.10.15¶Notable changes in 3.10.15
ipaddress ¶
Исправлено поведение
is_globalиis_privateвIPv4Address,IPv6Address,IPv4NetworkиIPv6Network.
email¶
Заголовки с символами новой строки внутри теперь заключаются в кавычки при выводе.
generatorтеперь будет отказываться сериализовать (записывать) заголовки, которые неправильно свёрнуты или разделены, так что они будут распознаны как несколько заголовков или объединены с соседними данными. Если необходимо отключить эту защиту, установитеverify_generated_headers. (Авторы: Bas Bloemsaat и Petr Viktorin в gh-121650.)email.utils.getaddresses()иemail.utils.parseaddr()теперь возвращают('', '')2-кортежи в большем количестве случаев, когда встречаются недопустимые адреса электронной почты, вместо потенциально неточных значений. В эти две функции добавлен необязательный параметр strict: используйтеstrict=Falseдля получения старого поведения, принимающего некорректные входные данные.getattr(email.utils, 'supports_strict_parsing', False)можно использовать для проверки доступности параметра strict. (Авторы: Thomas Dwyer и Victor Stinner для gh-102988, улучшение исправления CVE-2023-27043.)
Заметные изменения в 3.10.18¶Notable changes in 3.10.18
os.path¶
Параметр strict для
os.path.realpath()принимает новое значение:os.path.ALLOW_MISSING. При его использовании исключения, отличные отFileNotFoundError, будут возбуждены повторно; итоговый путь может отсутствовать, но он будет свободен от символьных ссылок. (Автор: Petr Viktorin, CVE 2025-4517.)
tarfile¶
data_filter()теперь нормализует цели символьных ссылок, чтобы избежать атак обхода пути. (Автор: Petr Viktorin в gh-127987 и CVE 2025-4138.)extractall()теперь пропускает исправление атрибутов каталога, когда каталог был удалён или заменён файлом другого типа. (Автор: Petr Viktorin в gh-127987 и CVE 2024-12718.)extract()иextractall()теперь (заново) применяют фильтр извлечения при замене ссылки (жёсткой или символьной) копией другого члена архива, а также при исправлении атрибутов каталога. Первый вызывает новое исключениеLinkFallbackError. (Автор: Petr Viktorin, CVE 2025-4330 и CVE 2024-12718.)extract()иextractall()больше не извлекают отклонённые члены, когдаerrorlevel()равен нулю. (Авторы: Matt Prodani и Petr Viktorin в gh-112887 и CVE 2025-4435.)