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

Что нового в Python 3.10What’s New In Python 3.10

Редактор:

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:
    def __init__(self, x, y):
        self.x = x
        self.y = y

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
    
    color = Color.GREEN
    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). (Автор: Donghee 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, field

@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. (Добавлено Бреттом Кэнноном в bpo-42133.)

encodings

encodings.normalize_encoding() теперь игнорирует не-ASCII символы. (Добавлено Хай Ши в bpo-39337.)

enum

Enum __repr__() теперь возвращает enum_name.member_name, а __str__() теперь возвращает member_name. Перечисления стандартной библиотеки, доступные как константы модуля, имеют repr(), равный module_name.member_name. (Добавлено Итаном Фурманом в bpo-40066.)

Добавлен enum.StrEnum для перечислений, все члены которых являются строками. (Добавлено Итаном Фурманом в bpo-41816.)

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 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. (Добавлено Алексом Уэйгудом и Терри Джан Риди в bpo-45447.)

Включать приглашения при сохранении Shell с вводом и выводом. (Добавлено Терри Джан Риди в 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. (Автор: Donghee Na в bpo-43106.)

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.readmodule() и pyclbr.readmodule_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(), 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.)

_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.)

Наличие символов новой строки или табуляции в частях URL допускает некоторые формы атак. Следуя спецификации WHATWG, обновляющей RFC 3986, символы ASCII новой строки \n, \r и табуляции \t удаляются из URL анализатором в urllib.parse, предотвращая такие атаки. Удаляемые символы контролируются новой переменной уровня модуля urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE. (См. gh-88048)

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.)

  • Следующие встроенные функции теперь поддерживают более быстрый соглашение вызова PEP 590 vectorcall: map(), filter(), reversed(), bool() и float(). (Предложено Donghee Na и Jeroen Demeyer в 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:

  • Отладка потоков (переменная окружения PYTHONTHREADDEBUG) объявлена устаревшей в Python 3.10 и будет удалена в Python 3.12. Эта возможность требует отладочной сборки Python. (Предложено Виктором Стиннером в 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. Существующим пользователям следует скопировать используемые ими классы в свой код. (Авторы: Donghee Na и Terry J. Reedy в bpo-42299.)

  • Удалена функция PyModule_GetWarningsModule(), которая стала бесполезной после того, как модуль _warnings был преобразован во встроенный модуль в версии 2.6. (Автор: Hai Shi в 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. Этот предел можно настроить или отключить с помощью переменной окружения, флага командной строки или API sys. См. документацию ограничения длины преобразования целого числа в строку. Предел по умолчанию составляет 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, которые могут быть неожиданными или опасными, например, создание файлов за пределами целевого каталога. Подробнее см. фильтры извлечения. В Python 3.12 использование без аргумента filter приведёт к DeprecationWarning. В Python 3.14 значение по умолчанию изменится на 'data'. (Автор: Petr Viktorin, PEP 706.)