Документация Python неофициальный перевод
Содержание страницы

Что нового в Python 3.10What’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, пользовательские гарды типов

Важные устаревания, удаления и ограничения:

  • PEP 644, требуется OpenSSL 1.1.1 или новее

  • PEP 632, устаревание модуля distutils.

  • PEP 623, устаревание и подготовка к удалению элемента wstr в PyUnicodeObject.

  • PEP 624, удаление API кодировщиков Py_UNICODE

  • PEP 597, добавление опционального EncodingWarning

Новые возможности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. В частности, сопоставление с образцом работает следующим образом:

  1. используя данные с типом и формой (subject)

  2. вычисляя subject в операторе match

  3. сравнивая проверяемое значение с каждым шаблоном в операторе case сверху вниз до подтверждения совпадения.

  4. выполняя действие, связанное с шаблоном подтверждённого совпадения

  5. Если точное совпадение не подтверждено, последний оператор 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 и idlelibIDLE 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.

  1. Literal теперь удаляет дубликаты параметров.

  2. Проверки равенства между объектами Literal теперь не зависят от порядка.

  3. Сравнения Literal теперь учитывают типы. Например, Literal[0] == Literal[False] ранее давало True. Теперь это False. Для поддержки этого изменения внутренний кеш типов теперь поддерживает различение типов.

  4. Объекты 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 раза быстрее. На Linux python3 -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 теперь объявлены устаревшими:

    (Предложено Йелле Зейлстрой в 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:

  • Отладка 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 был удалён из большинства высокоуровневого API asyncio после объявления устаревшим в Python 3.8. Причины этого изменения многообразны:

    1. Это упрощает высокоуровневый API.

    2. Функции высокоуровневого API неявно получают работающий цикл событий текущего потока, начиная с Python 3.7. В большинстве обычных случаев нет необходимости передавать цикл событий в API.

    3. Передача цикла событий чревата ошибками, особенно при работе с циклами, выполняющимися в разных потоках.

    Обратите внимание: низкоуровневый API по-прежнему принимает loop. Примеры замены существующего кода см. в разделе Изменения в Python API.

    (Авторы: Yurii Karabas, Andrew Svetlov, Yury Selivanov и Kyle Stanley в bpo-42392.)

Перенос на Python 3.10Porting to Python 3.10

В этом разделе перечислены ранее описанные изменения и другие исправления ошибок, которые могут потребовать изменений в вашем коде.

Изменения в синтаксисе PythonChanges in the Python syntax

  • Теперь выдаётся предупреждение об устаревании при компиляции ранее допустимого синтаксиса, если числовой литерал непосредственно предшествует ключевому слову (как в 0in x). В будущих версиях это станет синтаксическим предупреждением, а затем синтаксической ошибкой. Чтобы избавиться от предупреждения и обеспечить совместимость с будущими версиями, просто добавьте пробел между числовым литералом и следующим ключевым словом. (Автор: Serhiy Storchaka в bpo-43833.)

Изменения в Python APIChanges 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 был удалён из большинства высокоуровневого API asyncio после объявления устаревшим в 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 APIChanges 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().

Изменения байткода CPythonCPython 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 APIC API Changes

PEP 652: Поддержание стабильного ABIPEP 652: Maintaining the Stable ABI

Стабильный ABI (интерфейс двоичного кода приложений) для модулей расширения или встраивания Python теперь явно определён. Стабильность C API описывает гарантии стабильности C API и ABI, а также лучшие практики использования стабильного ABI.

(Предложено Петром Викториным в PEP 652 и bpo-43795.)

Новые возможности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.10Porting 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_CAPI unicodedata.ucnhash_CAPI API 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.)

  • Удалена 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_ty type) 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>. Вместо этого используйте модуль Python ast. (Автор: 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.7Notable security feature in 3.10.7

Преобразование между int и str в системах счисления, отличных от 2 (двоичной), 4, 8 (восьмеричной), 16 (шестнадцатеричной) или 32, например, 10 (десятичной), теперь вызывает ValueError, если количество цифр в строковом представлении превышает предельное значение, чтобы избежать потенциальных атак типа «отказ в обслуживании» из-за алгоритмической сложности. Это мера смягчения последствий для CVE-2020-10735. Этот предел можно настроить или отключить с помощью переменной окружения, флага командной строки или sys API. См. документацию ограничение длины преобразования целых чисел в строку. Значение по умолчанию – 4300 цифр в строковом представлении.

Важная функция безопасности в 3.10.8Notable security feature in 3.10.8

Устаревший модуль mailcap теперь отказывается внедрять небезопасный текст (имена файлов, MIME-типы, параметры) в команды оболочки. Вместо использования такого текста он выдаст предупреждение и будет действовать так, как если бы совпадение не было найдено (или для тестовых команд, как если бы тест провалился). (Автор: Petr Viktorin, gh-98966.)

Заметные изменения в 3.10.12Notable 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.15Notable 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.18Notable 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.)