Что нового в Python 3.10

Релиз

3.10.6

Дата

октября 19, 2022

Редактор

Пабло Галиндо Сальгадо

В этой статье рассказывается о новых возможностях в Python 3.10 по сравнению с 3.9. Python 3.10 был выпущен 4 октября 2021 года. Для получения полной информации смотрите changelog.

Резюме - Основные моменты выпуска

Новые возможности синтаксиса:

  • PEP 634, Структурное сопоставление шаблонов: спецификация

  • PEP 635, Структурное сопоставление паттернов: мотивация и обоснование

  • PEP 636, Структурное сопоставление шаблонов: учебник

  • bpo-12782, Контекстные менеджеры с родительскими пятнами теперь официально разрешены.

Новые возможности в стандартной библиотеке:

  • PEP 618, Добавить необязательную проверку длины в zip.

Улучшение работы переводчика:

  • PEP 626, Точные номера строк для отладки и других инструментов.

Новые возможности набора текста:

  • PEP 604, Разрешить записывать типы объединений как X | Y

  • PEP 613, Явные псевдонимы типов

  • PEP 612, Переменные спецификации параметров

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

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

  • PEP 632, Утратить модуль distutils.

  • PEP 623, Устаревает и готовится к удалению члена wstr в PyUnicodeObject.

  • PEP 624, Удалить API кодировщика Py_UNICODE

  • PEP 597, Добавить необязательное предупреждение о кодировке (EncodingWarning)

Новые возможности

Менеджеры по контексту

Теперь поддерживается использование заключительных круглых скобок для продолжения в нескольких строках в контекстных менеджерах. Это позволяет форматировать длинную коллекцию контекстных менеджеров в несколько строк подобно тому, как это было возможно ранее с операторами импорта. Например, все эти примеры теперь действительны:

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 для получения более подробной информации.

(Вклад Гвидо ван Россума, Пабло Галиндо и Лисандроса Николау в bpo-12782 и bpo-40334).

Улучшенные сообщения об ошибках

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.

(При участии Пабло Галиндо из bpo-42864 и Батухан Таскайя из 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).

  • Непрозрачные кортежи в целях понимания:

    >>> {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() не вызывается для отображения ошибки, что может произойти, если используется какая-то другая пользовательская функция отображения ошибок. Это распространенный сценарий в некоторых REPL, таких как 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() не вызывается для отображения ошибки, что может произойти, если используется какая-то другая пользовательская функция отображения ошибок. Это распространенный сценарий в некоторых REPL, таких как IPython.

PEP 626: Точные номера строк для отладки и других инструментов

PEP 626 обеспечивает более точные и надежные номера строк для инструментов отладки, профилирования и покрытия. События трассировки с правильным номером строки генерируются для всех выполняемых строк кода и только для выполняемых строк кода.

Атрибут f_lineno объектов фрейма всегда будет содержать ожидаемый номер строки.

Атрибут co_lnotab для объектов кода устарел и будет удален в версии 3.12. Код, которому необходимо преобразовать смещение в номер строки, должен использовать новый метод co_lines() вместо этого.

PEP 634: Структурное сопоставление шаблонов

Структурное сопоставление шаблонов было добавлено в виде оператора match statement и оператора case statements шаблонов с соответствующими действиями. Шаблоны состоят из последовательностей, отображений, примитивных типов данных, а также экземпляров классов. Сопоставление шаблонов позволяет программам извлекать информацию из сложных типов данных, разветвляться по структуре данных и применять определенные действия на основе различных форм данных.

Синтаксис и операции

Общий синтаксис сопоставления шаблонов таков:

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. Если точное совпадение не подтверждено, в качестве совпадающего регистра будет использоваться последний регистр, подстановочный символ _, если он указан. Если точное совпадение не подтверждено, а регистр подстановочного знака не существует, то весь блок совпадения не работает.

Декларативный подход

Читатели могут знать о сопоставлении шаблонов на простом примере сопоставления субъекта (объекта данных) с литералом (шаблоном) с помощью оператора switch, встречающегося в C, Java или JavaScript (и многих других языках). Часто оператор switch используется для сравнения объекта/выражения с операторами case, содержащими литералы.

Более мощные примеры сопоставления шаблонов можно найти в таких языках, как Scala и Elixir. При структурном сопоставлении шаблонов подход является «декларативным» и в явном виде определяет условия (шаблоны), которым должны соответствовать данные.

Хотя «императивная» серия инструкций с использованием вложенных операторов «если» может быть использована для достижения чего-то похожего на структурное сопоставление шаблонов, она менее понятна, чем «декларативный» подход. Вместо этого в «декларативном» подходе указываются условия, которые необходимо выполнить для соответствия, и он более читабелен благодаря явным образцам. Хотя структурное сопоставление шаблонов можно использовать в самой простой форме, сравнивая переменную с литералом в операторе case, его истинная ценность для Python заключается в обработке типа и формы объекта.

Простой шаблон: совпадение с литералом

Давайте рассмотрим этот пример как сопоставление шаблонов в его простейшей форме: значение, субъект, сопоставляется с несколькими литералами, шаблонами. В приведенном ниже примере status является субъектом оператора сопоставления. Шаблоны - это каждый из операторов 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, возвращается «Я чайник». Если вышеприведенной функции передано значение status, равное 500, оператор case с _ будет соответствовать подстановочному символу, и будет возвращено «Что-то не так с интернетом». Обратите внимание на последний блок: имя переменной, _, действует как волшебный знак и гарантирует, что тема всегда будет совпадать. Использование _ является необязательным.

Вы можете объединить несколько литералов в один шаблон с помощью | («или»):

case 401 | 403 | 404:
    return "Not allowed"
Поведение без подстановочного знака

Если мы изменим приведенный выше пример, удалив последний блок 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 совпадение может отсутствовать. Если совпадения нет, то поведение является безотказным. Например, если передано status из 500, происходит отказ.

Шаблоны с литералом и переменной

Шаблоны могут выглядеть как задания на распаковку, и шаблон может использоваться для связывания переменных. В этом примере точка данных может быть распакована на координату x и координату y:

# point is an (x, y) tuple
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.

Узоры и классы

Если вы используете классы для структурирования данных, вы можете использовать в качестве шаблона имя класса, за которым следует список аргументов, напоминающий конструктор. Этот шаблон позволяет записывать атрибуты класса в переменные:

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")
Шаблоны с позиционными параметрами

Вы можете использовать позиционные параметры с некоторыми встроенными классами, которые обеспечивают упорядочивание своих атрибутов (например, классы данных). Вы также можете определить определенную позицию для атрибутов в шаблонах, установив специальный атрибут __match_args__ в ваших классах. Если он установлен в («x», «y»), то все следующие шаблоны эквивалентны (и все связывают атрибут y с переменной var):

Point(1, var)
Point(1, y=var)
Point(x=1, y=var)
Point(y=var, x=1)

Вложенные шаблоны

Шаблоны могут быть произвольно вложенными. Например, если наши данные представляют собой короткий список точек, они могут быть сопоставлены следующим образом:

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

Сложные шаблоны и подстановочный знак

До сих пор в примерах использовалось только _ в последнем выражении 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).

Охранник

Мы можем добавить к шаблону условие 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.")

Другие ключевые особенности

Несколько других ключевых особенностей:

  • Как и задания распаковки, шаблоны кортежа и списка имеют точно такое же значение и фактически соответствуют произвольным последовательностям. Технически, объект должен быть последовательностью. Поэтому важным исключением является то, что шаблоны не сопоставляют итераторы. Также, во избежание распространенной ошибки, шаблоны последовательностей не соответствуют строкам.

  • Шаблоны последовательностей поддерживают подстановочные знаки: [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"

Кодировка по умолчанию TextIOWrapper и open() зависит от платформы и локали. Поскольку на большинстве Unix-платформ используется UTF-8, пропуск опции encoding при открытии UTF-8 файлов (например, JSON, YAML, TOML, Markdown) является очень распространенной ошибкой. Например:

# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
    data = json.load(f)

Чтобы найти этот тип ошибки, добавляется необязательный EncodingWarning. Он выдается, когда sys.flags.warn_default_encoding равен true и используется локально-специфическая кодировка по умолчанию.

Опция -X warn_default_encoding и PYTHONWARNDEFAULTENCODING добавлены для включения предупреждения.

Для получения дополнительной информации см. раздел Кодирование текста.

Другие языковые изменения

  • В типе int появился новый метод int.bit_count(), возвращающий количество единиц в двоичном расширении данного целого числа, также известное как счетчик населения. (Внесено Никласом Фиекасом в bpo-29882).

  • Представления, возвращаемые dict.keys(), dict.values() и dict.items(), теперь имеют атрибут mapping, который дает объект types.MappingProxyType, оборачивающий исходный словарь. (Внесено Деннисом Суини в bpo-40890).

  • PEP 618: Функция zip() теперь имеет необязательный флаг strict, используемый для требования, чтобы все итерации имели одинаковую длину.

  • Встроенные функции и функции расширения, принимающие целочисленные аргументы, больше не принимают Decimals, Fractions и другие объекты, которые могут быть преобразованы в целые числа только с потерей (например, имеющие метод __int__(), но не имеющие метода __index__()). (Внесено Сергеем Сторчакой в bpo-37999).

  • Если object.__ipow__() возвращает NotImplemented, оператор корректно вернется к object.__pow__() и object.__rpow__(), как и ожидалось. (Внесено Алексом Шкопом в bpo-38302).

  • Выражения присваивания теперь можно использовать без депарсетов в литералах множеств и пониманиях множеств, а также в индексах последовательности (но не в срезах).

  • Функции имеют новый атрибут __builtins__, который используется для поиска встроенных символов при выполнении функции, вместо того, чтобы искать их в __globals__['__builtins__']. Атрибут инициализируется из __globals__["__builtins__"], если он существует, иначе из текущих встроенных символов. (Внесено Марком Шенноном в bpo-42990).

  • Добавлены две новые встроенные функции – aiter() и anext() для обеспечения асинхронных аналогов iter() и next(), соответственно. (Вклад Джошуа Бронсона, Дэниела Поупа и Джастина Ванга в bpo-31861).

  • Статические методы (@staticmethod) и методы класса (@classmethod) теперь наследуют атрибуты методов (__module__, __name__, __qualname__, __doc__, __annotations__) и имеют новый атрибут __wrapped__. Более того, статические методы теперь могут вызываться как обычные функции. (Внесено Виктором Стиннером в bpo-43682).

  • Аннотации для сложных целей (все, кроме целей simple name, определенных PEP 526) больше не вызывают никаких эффектов во время выполнения с from __future__ import annotations. (Внесено Батуханом Таская в bpo-42737).

  • Объекты классов и модулей теперь лениво создают пустые массивы аннотаций по требованию. Пакеты аннотаций хранятся в __dict__ объекта для обратной совместимости. Это улучшает лучшие практики работы с __annotations__; для получения дополнительной информации смотрите Лучшие методы работы с аннотациями. (Внесено Ларри Гастингсом в bpo-43901).

  • Аннотации, состоящие из yield, yield from, await или именованных выражений, теперь запрещены в from __future__ import annotations из-за их побочных эффектов. (Внесено Батуханом Таская в bpo-42725).

  • Использование несвязанных переменных, super() и других выражений, которые могут изменить обработку таблицы символов в качестве аннотаций, теперь не имеет смысла при from __future__ import annotations. (Внесено Батуханом Таская в bpo-42725).

  • Хэши NaN-значений как типа float, так и типа decimal.Decimal теперь зависят от идентичности объекта. Раньше они всегда хэшировались в 0, даже если значения NaN не равны друг другу. Это вызывало потенциально квадратичное поведение во время выполнения из-за чрезмерных коллизий хэшей при создании словарей и множеств, содержащих несколько NaN. (Внесено Раймондом Хеттингером в bpo-43475).

  • При удалении константы SyntaxError будет выдаваться ошибка NameError (вместо __debug__). (Внесено Донг-Хи На в bpo-45000).

  • Исключения SyntaxError теперь имеют атрибуты end_lineno и end_offset. Они будут None, если не определены. (Внесено Пабло Галиндо в bpo-43914).

Новые модули

  • Пока нет.

Улучшенные модули

asyncio

Добавьте недостающий метод connect_accepted_socket(). (Внесено Алексом Грёнхольмом в bpo-41332).

argparse

Ошибочная фраза «optional arguments» была заменена на «options» в справке argparse. Некоторые тесты могут потребовать адаптации, если они полагаются на точное совпадение вывода. (Внесено Раймондом Хеттингером в bpo-9694).

массив

Метод index() в array.array теперь имеет необязательные параметры start и stop. (Вклад Андерса Лоренцена и Закери Спитца в bpo-31956).

asynchat, asyncore, smtpd

Эти модули были помечены как устаревшие в документации по модулям начиная с Python 3.6. Теперь во все три модуля добавлено время импорта DeprecationWarning.

base64

Добавьте base64.b32hexencode() и base64.b32hexdecode() для поддержки кодировки Base32 с расширенным шестнадцатеричным алфавитом.

bdb

Добавьте clearBreakpoints() для сброса всех установленных точек останова. (Внесено Ирит Катриэль в bpo-24160).

биссектриса

Добавлена возможность предоставления функции ключ к API в модуле bisect. (Внесено Раймондом Хеттингером в bpo-4356).

кодеки

Добавьте функцию codecs.unregister() для снятия с регистрации функции поиска кодека. (Внесено Хай Ши в bpo-41842).

коллекции.abc

__args__ из parameterized generic для collections.abc.Callable теперь соответствуют typing.Callable. collections.abc.Callable generic теперь сглаживает параметры типа, аналогично тому, что сейчас делает 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() для безопасного закрытия асинхронных генераторов и объектов, представляющих асинхронно освобождаемые ресурсы. (Вклад внесли Joongi Kim и John Belmonte в bpo-41229).

Добавьте поддержку асинхронного менеджера контекста в contextlib.nullcontext(). (Внесено Томом Грингаузом в bpo-41543).

Добавьте AsyncContextDecorator, для поддержки использования асинхронных менеджеров контекста в качестве декораторов.

проклятия

Расширенные цветовые функции, добавленные в 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 в декораторе dataclasses.dataclass(). (Внесено Юрием Карабасом в bpo-42269)

Поля только для ключевых слов

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 для отдельных полей, имейте в виду, что существуют правила переупорядочивания полей из-за того, что поля только для ключевых слов должны следовать за полями без ключевых слов. Подробности см. в полной документации по классам данных.

Вы также можете указать, что все поля, следующие за маркером 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, была удалена. Команда bdist_wheel теперь рекомендуется для распространения бинарных пакетов на Windows. (Вклад Виктора Стиннера в bpo-42802).

doctest

Когда модуль не определяет __loader__, возвращайтесь к __spec__.loader. (Внесено Бреттом Кэнноном в bpo-42133).

кодировки

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

глобус

Добавьте параметры 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 и другие вопросы).

Чисто питоновский откат pbkdf2_hmac() устарел. В будущем PBKDF2-HMAC будет доступен только тогда, когда Python будет собран с поддержкой OpenSSL. (Внесено Кристианом Хаймсом в bpo-43880).

hmac

Модуль hmac теперь использует внутреннюю реализацию HMAC от OpenSSL. (Внесено Кристианом Хаймсом из bpo-40645).

IDLE и idlelib

Заставить IDLE вызывать sys.excepthook() (при запуске без „-n“). Пользовательские крючки ранее игнорировались. (Внесено Кеном Хилтоном в bpo-43008).

Перестройте диалог настроек. Разделите вкладку Общие на вкладки Windows и Shell/Ed. Переместите источники справки, которые расширяют меню Справка, на вкладку Расширения. Освободите место для новых опций и сократите диалог. Благодаря последнему диалог лучше подходит для маленьких экранов. (Внесено Терри Яном Риди в bpo-40468.) Переместите настройку отступов с вкладки Шрифт на новую вкладку Windows. (Внесено Марком Розманом и Терри Джен Риди в bpo-33962).

Вышеуказанные изменения были перенесены в поддерживающий релиз 3.9.

Добавьте боковую панель Shell. Переместите основную подсказку („>>>“) на боковую панель. Добавить вторичные подсказки (“…“) на боковую панель. Щелчок левой кнопкой мыши и дополнительное перетаскивание выделяет одну или несколько строк текста, как и в боковой панели номеров строк редактора. При щелчке правой кнопкой мыши после выделения строк текста появляется контекстное меню «Копировать с подсказками». Это позволяет скопировать подсказки из боковой панели вместе со строками выделенного текста. Эта опция также появляется в контекстном меню для текста. (Внесено Талем Эйнатом из bpo-37903).

Используйте пробелы вместо табуляции для отступа интерактивного кода. Это позволяет интерактивным записям кода «выглядеть правильно». Создание такой возможности было основной мотивацией для добавления боковой панели оболочки. (Внесено Терри Яном Риди в bpo-37892).

Выделите новые soft keywords match, case и _ в операторах сопоставления шаблонов. Однако, эта подсветка не совершенна и в некоторых редких случаях, включая некоторые _-s в шаблонах case, будет некорректной. (Внесено Талем Эйнатом в bpo-44010).

Новое в выпусках технического обслуживания 3.10.

Применять подсветку синтаксиса к файлам .pyi. (Вклад внесли Алекс Уэйгуд и Терри Ян Риди в bpo-45447).

Включить подсказки при сохранении Shell с входами и выходами. (Внесено Терри Яном Риди в gh-95191).

importlib.metadata

Паритет с importlib_metadata 4.6 (history).

importlib.metadata entry points теперь предоставляет более приятные возможности для выбора точек входа по группе и имени с помощью нового класса importlib.metadata.EntryPoints. Более подробную информацию об обесценивании и использовании см. в примечании о совместимости в документации.

Добавлено importlib.metadata.packages_distributions() для преобразования модулей и пакетов Python верхнего уровня в их importlib.metadata.Distribution.

проверять

Когда модуль не определяет __loader__, возвращайтесь к __spec__.loader. (Внесено Бреттом Кэнноном в bpo-42133).

Add inspect.get_annotations(), который безопасно вычисляет аннотации, определенные для объекта. Она позволяет обойти причуды доступа к аннотациям для различных типов объектов и делает очень мало предположений об объекте, который она рассматривает. inspect.get_annotations() также может корректно разгруппировать строковые аннотации. inspect.get_annotations() теперь считается лучшей практикой для доступа к аннотациям dict, определенным для любого объекта Python; для получения дополнительной информации о лучших практиках работы с аннотациями смотрите Лучшие методы работы с аннотациями. Соответственно, inspect.signature(), inspect.Signature.from_callable() и inspect.Signature.from_function() теперь вызывают inspect.get_annotations() для получения аннотаций. Это означает, что inspect.signature() и inspect.Signature.from_callable() теперь могут также разгруппировывать строковые аннотации. (Внесено Ларри Гастингсом в bpo-43817).

itertools

Добавьте itertools.pairwise(). (Внесено Раймондом Хеттингером в bpo-38200).

linecache

Когда модуль не определяет __loader__, возвращайтесь к __spec__.loader. (Внесено Бреттом Кэнноном в bpo-42133).

os

Добавьте поддержку os.cpu_count() для VxWorks RTOS. (Внесено Peixing Xin в bpo-41440).

Добавьте новую функцию os.eventfd() и соответствующие помощники для обертывания системного вызова eventfd2 в Linux. (Внесено Кристианом Хаймсом в bpo-41001).

Добавьте os.splice(), который позволяет перемещать данные между двумя файловыми дескрипторами без копирования между адресным пространством ядра и адресным пространством пользователя, где один из файловых дескрипторов должен ссылаться на трубу. (Внесено Пабло Галиндо в bpo-41625).

Добавьте O_EVTONLY, O_FSYNC, O_SYMLINK и O_NOFOLLOW_ANY для macOS. (Вклад Донг-Хи На в bpo-43106).

os.path

os.path.realpath() теперь принимает строгий аргумент только для ключевого слова. Если установлено значение True, OSError будет вызвано, если путь не существует или встречается цикл симлинка. (Внесено Барни Гейлом в bpo-43757).

pathlib

Добавьте поддержку срезов в PurePath.parents. (Внесено Джошуа Кэнноном в bpo-35498).

Добавьте поддержку отрицательной индексации в PurePath.parents. (Внесено Ярославом Панковичем в bpo-21041).

Добавьте метод Path.hardlink_to, который заменяет link_to(). Новый метод имеет тот же порядок аргументов, что и symlink_to(). (Внесено Барни Гейлом в bpo-39950).

pathlib.Path.stat() и chmod() теперь принимают аргумент follow_symlinks только для ключевого слова для согласованности с соответствующими функциями в модуле os. (Внесено Барни Гейлом в bpo-39906).

платформа

Добавьте platform.freedesktop_os_release() для получения идентификатора операционной системы из стандартного файла freedesktop.org os-release. (Внесено Кристианом Хаймсом в bpo-28468).

pprint

pprint.pprint() теперь принимает новый аргумент в виде ключевого слова underscore_numbers. (Внесено sblondon в bpo-42914).

pprint теперь может красиво печатать экземпляры dataclasses.dataclass. (Внесено Льюисом Галлом в bpo-43080).

py_compile

Добавьте опцию --quiet в интерфейс командной строки py_compile. (Внесено Григорием Шевченко в bpo-38731).

pyclbr

Добавьте атрибут end_lineno к объектам Function и Class в дереве, возвращаемом pyclbr.readline() и pyclbr.readline_ex(). Он совпадает с существующим (начальным) lineno. (Внесено Авиралом Шриваставой в bpo-38307).

полка

Модуль shelve теперь использует pickle.DEFAULT_PROTOCOL по умолчанию вместо pickle протокола 3 при создании полок. (Внесено Закери Спитцем в bpo-34204).

статистика

Добавьте функции covariance(), Пирсона correlation() и простые linear_regression(). (Внесено Тимотеушем Влодзько в bpo-38490).

сайт

Когда модуль не определяет __loader__, возвращайтесь к __spec__.loader. (Внесено Бреттом Кэнноном в bpo-42133).

розетка

Исключение socket.timeout теперь является псевдонимом TimeoutError. (Внесено Кристианом Хаймсом в bpo-42413).

Добавьте возможность создания MPTCP сокетов с помощью IPPROTO_MPTCP (Внесено Rui Cunha в bpo-43571.)

Добавьте опцию IP_RECVTOS для получения полей типа обслуживания (ToS) или DSCP/ECN (Внесено Георгом Саутхоффом в bpo-44077).

ssl

Для модуля ssl требуется OpenSSL 1.1.1 или более новая версия. (Вклад Кристиана Хаймса в PEP 644 и bpo-43669).

Модуль ssl имеет предварительную поддержку OpenSSL 3.0.0 и новую опцию OP_IGNORE_UNEXPECTED_EOF. (Внесено Кристианом Хаймсом в 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 установленными по умолчанию и поэтому не может предупреждать о повторной установке флага. В deprecation section приведен список устаревших функций. (Внесено Кристианом Хаймсом в bpo-43880).

Модуль ssl теперь имеет более безопасные настройки по умолчанию. Шифры без прямой секретности или SHA-1 MAC отключены по умолчанию. Уровень безопасности 2 запрещает слабые ключи RSA, DH и ECC с безопасностью менее 112 бит. SSLContext По умолчанию установлена минимальная версия протокола TLS 1.2. Настройки основаны на исследованиях Хайнека Шлавака. (Внесено Кристианом Хаймсом в bpo-43998).

Устаревшие протоколы SSL 3.0, TLS 1.0 и TLS 1.1 больше официально не поддерживаются. Python не блокирует их активно. Однако параметры сборки OpenSSL, конфигурации дистрибутивов, исправления производителей и наборы шифров могут препятствовать успешному рукопожатию.

Добавьте параметр timeout в функцию ssl.get_server_certificate(). (Внесено Закери Спитцем в bpo-31870).

Модуль ssl использует heap-типы и многофазную инициализацию. (Вклад Кристиана Хаймса в bpo-42333).

Добавлен новый флаг проверки VERIFY_X509_PARTIAL_CHAIN. (Внесено l0x в bpo-40849).

sqlite3

Добавьте события аудита для connect/handle(), enable_load_extension() и load_extension(). (Внесено Эрлендом Э. Аасланд в bpo-43762).

sys

Добавьте атрибут sys.orig_argv: список исходных аргументов командной строки, передаваемых исполняемому файлу Python. (Внесено Виктором Стиннером в bpo-23427).

Добавьте sys.stdlib_module_names, содержащий список имен модулей стандартной библиотеки. (Внесено Виктором Стиннером в bpo-42955).

_thread

_thread.interrupt_main() теперь принимает необязательный номер сигнала для моделирования (по умолчанию по-прежнему signal.SIGINT). (Внесено Антуаном Питру в bpo-43356).

нарезание резьбы

Добавьте threading.gettrace() и threading.getprofile() для получения функций, заданных threading.settrace() и threading.setprofile() соответственно. (Внесено Марио Корчеро в bpo-42251).

Добавьте threading.__excepthook__ для возможности восстановления исходного значения threading.excepthook() в случае, если оно установлено в нерабочее или другое значение. (Внесено Марио Корчеро в bpo-42308).

traceback

Функции format_exception(), format_exception_only() и print_exception() теперь могут принимать объект исключения в качестве аргумента только для позиции. (Вклад Закери Шпитца и Матиаса Буссонье в bpo-26389).

типы

Вновь ввести классы types.EllipsisType, types.NoneType и types.NotImplementedType, обеспечив новый набор типов, легко интерпретируемых программами проверки типов. (Внесено Басом ван Биком в bpo-41810).

набор текста

Основные изменения см. в разделе Новые возможности, связанные с подсказками типа.

Поведение typing.Literal было изменено, чтобы соответствовать PEP 586 и соответствовать поведению статических средств проверки типов, указанных в PEP.

  1. Literal теперь не дублирует параметры.

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

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

  4. Объекты Literal теперь будут вызывать исключение TypeError при сравнении равенства, если любой из их параметров не является hashable. Обратите внимание, что объявление Literal с нехешируемыми параметрами не вызовет ошибку:

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

(Внесено Юрием Карабасом в bpo-42345).

Добавьте новую функцию 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. (Внесено Себастьяном Риттау в bpo-38291).

unittest

Добавьте новый метод assertNoLogs() в дополнение к существующему assertLogs(). (Внесено Kit Yan Choi в bpo-39385).

urllib.parse

Версии Python ранее Python 3.10 позволяли использовать как ;, так и & в качестве разделителей параметров запроса в urllib.parse.parse_qs() и urllib.parse.parse_qsl(). Из-за соображений безопасности и в соответствии с новыми рекомендациями W3C это было изменено, чтобы разрешить только один ключ-разделитель, с & по умолчанию. Это изменение также затрагивает cgi.parse() и cgi.parse_multipart(), поскольку они используют соответствующие функции внутри. Для получения более подробной информации, пожалуйста, обратитесь к соответствующей документации. (Вклад внесли Адам Голдшмидт, Сентхил Кумаран и Кен Джин в bpo-42967).

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

xml

Добавьте класс LexicalHandler в модуль xml.sax.handler. (Вклад Джонатана Госсаджа и Закери Спитца в bpo-35018).

zipimport

Добавьте методы, связанные с PEP 451: find_spec(), zipimport.zipimporter.create_module() и zipimport.zipimporter.exec_module(). (Внесено Бреттом Кэнноном в bpo-42131).

Добавьте метод invalidate_caches(). (Внесено Десмондом Чеонгом в bpo-14678).

Оптимизации

  • Конструкторы str(), bytes() и bytearray() теперь работают быстрее (примерно на 30–40% для небольших объектов). (Внесено Сергеем Сторчакой в bpo-41334).

  • Модуль runpy теперь импортирует меньше модулей. Время запуска команды python3 -m module-name в среднем в 1,4 раза быстрее. В Linux модуль python3 -I -m module-name импортирует 69 модулей в Python 3.9, тогда как в Python 3.10 он импортирует только 51 модуль (-18). (Вклад Виктора Стиннера в bpo-41006 и bpo-41718).

  • Инструкция LOAD_ATTR теперь использует новый механизм «кэш на опкод». Теперь она примерно на 36% быстрее для обычных атрибутов и на 44% быстрее для слотов. (Вклад Пабло Галиндо и Юрия Селиванова в bpo-42093 и Гвидо ван Россума в bpo-42927, основанный на идеях, реализованных первоначально в PyPy и MicroPython).

  • При сборке Python с помощью --enable-optimizations теперь -fno-semantic-interposition добавляется как в строку компиляции, так и в строку компоновки. Это ускоряет сборку интерпретатора Python, созданного с помощью --enable-shared с gcc на 30%. Более подробную информацию смотрите в this article. (Внесено Виктором Стиннером и Пабло Галиндо в 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 быстрее. (Внесено Ма Лином, рецензировано Грегори П. Смитом, в bpo-41486)

  • При использовании аннотаций в строковом виде аннотационные матрицы для функций больше не создаются при создании функции. Вместо этого они хранятся в виде кортежа строк, а объект функции лениво преобразует их в дикту аннотаций по требованию. Эта оптимизация вдвое сокращает процессорное время, необходимое для определения аннотированной функции. (Вклад Юрия Карабаса и Инады Наоки в bpo-42202).

  • Функции поиска подстрок, такие как str1 in str2 и str2.find(str1), теперь иногда используют алгоритм поиска строк «Two-Way» Крошмора и Перрина, чтобы избежать квадратичного поведения на длинных строках. (Внесено Деннисом Суини в bpo-41972)

  • Добавьте микрооптимизацию в _PyType_Lookup() для улучшения производительности поиска в кэше атрибутов типов в распространенном случае попадания в кэш. Это делает интерпретатор в среднем в 1,04 раза быстрее. (Внесено Дино Вьеландом в bpo-43452).

  • Следующие встроенные функции теперь поддерживают более быстрое соглашение о вызове векторных вызовов PEP 590: map(), filter(), reversed(), bool() и float(). (Вклад Дон Хи На и Йеруна Демейера в bpo-43575, bpo-43287, bpo-41922, bpo-41873 и bpo-41870).

  • Производительность BZ2File улучшена за счет удаления внутреннего RLock. Это делает BZ2File потокобезопасным перед лицом нескольких одновременных читателей или писателей, как это всегда делали эквивалентные классы в gzip и lzma. (Внесено Инадой Наоки в bpo-43785).

Утративший силу

  • В настоящее время 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. Для получения дополнительной информации обратитесь к разделу module changes.

  • Нецелые аргументы для 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 в качестве планируемой версии удаления (они начали поднимать DeprecationWarning в предыдущих версиях Python). (Внесено Бреттом Кэнноном в 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).

  • asyncio.get_event_loop() теперь выдает предупреждение об устаревании, если нет запущенного цикла событий. В будущем это будет псевдоним get_running_loop(). Функции asyncio, которые неявно создают объекты Future или Task, теперь выдают предупреждение об устаревании, если нет запущенного цикла событий и не передан явный аргумент loop: ensure_future(), wrap_future(), gather(), shield(), as_completed() и конструкторы Future, Task, StreamReader, StreamReaderProtocol. (Внесено Сергеем Сторчакой в bpo-39529).

  • Недокументированная встроенная функция sqlite3.enable_shared_cache теперь является устаревшей и планируется к удалению в Python 3.12. Ее использование настоятельно не рекомендуется в документации SQLite3. См. раздел the SQLite3 docs для получения более подробной информации. Если необходимо использовать общий кэш, откройте базу данных в режиме URI с помощью параметра запроса cache=shared. (Внесено Эрлендом Э. Аасланд в bpo-24464).

  • Следующие методы threading теперь устарели:

    (Предоставлено Jelle Zijlstra из 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. Для этой функции требуется debug build of Python. (Внесено Виктором Стиннером в bpo-44584).

  • При импорте из подмодулей typing.io и typing.re теперь будет выдаваться DeprecationWarning. Эти подмодули будут удалены в одной из будущих версий Python. Все, что относится к этим подмодулям, следует импортировать непосредственно из typing. (Внесено Себастьяном Риттау в bpo-38291).

Удалено

  • Удалены специальные методы __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.

  • Удалены функции Public C API PyParser_SimpleParseStringFlags, PyParser_SimpleParseStringFlagsFilename, PyParser_SimpleParseFileFlags и PyNode_Compile, которые были устаревшими в версии 3.9 из-за перехода на новый парсер PEG.

  • Удален модуль formatter, который был устаревшим в Python 3.4. Он несколько устарел, мало используется и не тестируется. Первоначально планировалось удалить его в Python 3.6, но удаление было отложено до выхода Python 2.7 EOL. Существующие пользователи должны скопировать все классы, которые они используют, в свой код. (Вклад внесли Донг-Хи На и Терри Дж. Риди в bpo-42299).

  • Удалена функция PyModule_GetWarningsModule(), которая теперь была бесполезна из-за того, что модуль _warnings был преобразован во встроенный модуль в 2.6. (Внесено Hai Shi в bpo-42599).

  • Удалите устаревшие псевдонимы для Коллекции Абстрактные базовые классы из модуля collections. (Внесено Виктором Стиннером в bpo-37324).

  • Параметр loop был удален из большинства asynciohigh-level API после того, как он был устаревшим в Python 3.8. Мотивация этого изменения многогранна:

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

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

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

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

    (При участии Юрия Карабаса, Андрея Светлова, Юрия Селиванова и Кайла Стэнли в bpo-42392).

Перенос на Python 3.10

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

Изменения в синтаксисе языка Python

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

Изменения в API Python

  • Параметры etype функций format_exception(), format_exception_only() и print_exception() в модуле traceback были переименованы в exc. (Вклад Закери Шпитца и Матиаса Буссонье в bpo-26389).

  • atexit: При выходе из Python, если обратный вызов, зарегистрированный с помощью atexit.register(), не сработал, его исключение теперь записывается в журнал. Ранее в журнал записывались только некоторые исключения, а последнее исключение всегда молча игнорировалось. (Внесено Виктором Стиннером в bpo-42639).

  • collections.abc.Callable generic теперь сплющивает параметры типа, аналогично тому, что сейчас делает 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 могли проходить без шума. (Внесено Кеном Джином в bpo-42195).

  • socket.htons() и socket.ntohs() теперь выдают OverflowError вместо DeprecationWarning, если заданный параметр не помещается в 16-битное беззнаковое целое. (Внесено Эрлендом Э. Аасланд в bpo-42393).

  • Параметр loop был удален из большинства asynciohigh-level API после устаревания в 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() вместо него.

    (При участии Юрия Карабаса, Андрея Светлова, Юрия Селиванова и Кайла Стэнли в bpo-42392).

  • Конструктор types.FunctionType теперь наследует текущие builtins, если словарь globals не имеет ключа "__builtins__", а не использует {"None": None} в качестве builtins: такое же поведение для функций eval() и exec(). Определение функции с помощью def function(...): ... в Python не затрагивается, глобальные функции не могут быть переопределены с помощью этого синтаксиса: они также наследуют текущие встроенные функции. (Вклад Виктора Стиннера в bpo-42990).

Изменения в API языка C

  • Функции 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 теперь представляет собой смещение кода слова вместо простого смещения в строке байткода. Это означает, что это число нужно умножить на 2 для использования с API, которые ожидают смещение байта (например, PyCode_Addr2Line()). Заметьте также, что член f_lasti в объектах FrameObject не считается стабильным: пожалуйста, используйте вместо него PyFrame_GetLineNumber().

Изменения в байткоде CPython

  • Инструкция MAKE_FUNCTION теперь принимает либо dict, либо кортеж строк в качестве аннотации функции. (Вклад Юрия Карабаса и Инады Наоки в bpo-42202).

Изменения в конструкции

  • PEP 644: Python теперь требует OpenSSL 1.1.1 или новее. OpenSSL 1.0.2 больше не поддерживается. (Вклад внес Кристиан Хаймс в bpo-43669).

  • Функции C99 snprintf() и vsnprintf() теперь необходимы для сборки Python. (Внесено Виктором Стиннером в 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).

Изменения в API C

PEP 652: Поддержание стабильной ПВБ

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

(Внесено Петром Викторином в PEP 652 и bpo-43795).

Новые возможности

  • Результат 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() к ограниченному API языка C. (Внесено Алексом Гейнором в 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() может принимать static types. (Вклад Хай Ши и Петра Викторина в bpo-41073).

  • Добавьте в C-API новую функцию PySet_CheckExact() для проверки, является ли объект экземпляром set, но не экземпляром подтипа. (Внесено Пабло Галиндо из bpo-43277).

  • Добавьте PyErr_SetInterruptEx(), который позволяет передавать номер сигнала для моделирования. (Внесено Антуаном Питру в bpo-43356).

  • Ограниченный C API теперь поддерживается, если Python is built in debug mode (если определен макрос 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). (Внесено Виктором Стиннером в bpo-43688).

  • Добавьте функцию Py_Is(x, y) для проверки, является ли объект x объектом y, аналогично x is y в Python. Добавьте также функции Py_IsNone(), Py_IsTrue(), Py_IsFalse() для проверки, является ли объект, соответственно, None синглтоном, True синглтоном или False синглтоном. (Внесено Виктором Стиннером в bpo-43753).

  • Добавьте новые функции для управления сборщиком мусора из Си-кода: PyGC_Enable(), PyGC_Disable(), PyGC_IsEnabled(). Эти функции позволяют активировать, деактивировать и запрашивать состояние сборщика мусора из Си-кода без необходимости импортировать модуль gc.

  • Добавьте новый флаг типа Py_TPFLAGS_DISALLOW_INSTANTIATION для запрета создания экземпляров типов. (Внесено Виктором Стиннером в bpo-43916).

  • Добавьте новый флаг типа Py_TPFLAGS_IMMUTABLETYPE для создания объектов неизменяемого типа: атрибуты типа не могут быть ни установлены, ни удалены. (Вклад Виктора Стиннера и Эрленда Э. Аасланда в bpo-43908).

Перенос на Python 3.10

  • Макрос PY_SSIZE_T_CLEAN теперь должен быть определен для использования форматов PyArg_ParseTuple() и Py_BuildValue(), которые используют #: es#, et#, s#, u#, y#, z#, U# и Z#. См. Parsing arguments and building values и PEP 353. (Внесено Виктором Стиннером в 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
    

    (Внесено Виктором Стиннером в bpo-39573).

  • Вызов PyDict_GetItem() без удержания GIL был разрешен по историческим причинам. Теперь это больше не разрешено. (Внесено Виктором Стиннером в bpo-40839).

  • PyUnicode_FromUnicode(NULL, size) и PyUnicode_FromStringAndSize(NULL, size) теперь поднимают DeprecationWarning. Используйте PyUnicode_New() для выделения объекта Unicode без начальных данных. (Внесено Инадой Наоки в bpo-36346).

  • Приватная структура _PyUnicode_Name_CAPI из PyCapsule API unicodedata.ucnhash_CAPI была перенесена во внутренний C API. (Внесено Виктором Стиннером в bpo-42157).

  • Функции Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix(), Py_GetProgramFullPath(), Py_GetPythonHome() и Py_GetProgramName() теперь возвращают NULL, если вызваны до Py_Initialize() (до инициализации Python). Используйте новую функцию Python Initialization Configuration API для получения Python Path Configuration.. (Внесено Виктором Стиннером в bpo-42260).

  • Макросы PyList_SET_ITEM(), PyTuple_SET_ITEM() и PyCell_SET() больше не могут использоваться в качестве l-значения или r-значения. Например, x = PyList_SET_ITEM(a, b, c) и PyList_SET_ITEM(a, b, c) = x теперь приводят к ошибке компилятора. Это предотвращает ошибки вроде теста if (PyList_SET_ITEM (a, b, c) < 0) .... (Вклад Закери Спитца и Виктора Стиннера в bpo-30459).

  • Нелимитированные файлы API odictobject.h, parser_interface.h, picklebufobject.h, pyarena.h, pyctype.h, pydebug.h, pyfpe.h и pytime.h были перемещены в каталог Include/cpython. Эти файлы не должны быть включены напрямую, так как они уже включены в Python.h: Include Files. Если они были включены напрямую, подумайте о включении Python.h вместо них. (Внесено Николасом Симом в bpo-35134).

  • Используйте флаг типа Py_TPFLAGS_IMMUTABLETYPE для создания неизменяемых объектов типа. Не полагайтесь на Py_TPFLAGS_HEAPTYPE, чтобы решить, является ли объект типа изменяемым или нет; вместо этого проверьте, установлен ли Py_TPFLAGS_IMMUTABLETYPE. (Вклад Виктора Стиннера и Эрленда Э. Аасланда в bpo-43908).

  • Недокументированная функция Py_FrozenMain была удалена из ограниченного API. Эта функция в основном полезна для пользовательских сборок Python. (Внесено Петром Викторином в bpo-26241).

Утративший силу

  • Функция PyUnicode_InternImmortal() теперь устарела и будет удалена в Python 3.12: используйте вместо нее PyUnicode_InternInPlace(). (Внесено Виктором Стиннером в bpo-41692).

Удалено

  • Удалены функции Py_UNICODE_str*, манипулирующие строками Py_UNICODE*. (Внесено Инадой Наоки в bpo-41123).

  • Удалено PyUnicode_GetMax(). Пожалуйста, перейдите на новые (PEP 393) API. (Внесено Инадой Наоки в bpo-41103).

  • Удалено PyLong_FromUnicode(). Пожалуйста, перейдите на PyLong_FromUnicodeObject(). (Внесено Инадой Наоки в bpo-41103).

  • Удалено PyUnicode_AsUnicodeCopy(). Пожалуйста, используйте PyUnicode_AsUCS4Copy() или PyUnicode_AsWideCharString() (Внесено Inada Naoki в bpo-41103).

  • Удалена переменная _Py_CheckRecursionLimit: она была заменена на ceval.recursion_limit из структуры PyInterpreterState. (Внесено Виктором Стиннером в bpo-41834).

  • Удалены недокументированные макросы Py_ALLOW_RECURSION и Py_END_ALLOW_RECURSION и поле recursion_critical структуры PyInterpreterState. (Внесено Сергеем Сторчакой в bpo-41936).

  • Удалена недокументированная функция PyOS_InitInterrupts(). Инициализация Python уже неявно устанавливает обработчики сигналов: смотрите PyConfig.install_signal_handlers. (Внесено Виктором Стиннером в bpo-41713).

  • Удалите функцию PyAST_Validate(). Больше невозможно построить объект AST (тип mod_ty) с помощью общедоступного C API. Функция уже была исключена из ограниченного C API (PEP 384). (Внесено Виктором Стиннером в 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. (Внесено Виктором Стиннером в bpo-43244).

  • Удалите PyOS_ReadlineFunctionPointer() из ограниченных заголовков C API и из python3.dll, библиотеки, обеспечивающей стабильный ABI в Windows. Поскольку функция принимает аргумент FILE*, стабильность ее ABI не может быть гарантирована. (Внесено Петром Викторином из bpo-43868).

  • Удалите заголовочные файлы ast.h, asdl.h и Python-ast.h. Эти функции были недокументированы и исключены из ограниченного API языка C. Большинство имен, определенных этими заголовочными файлами, не имели префикса Py и поэтому могли создавать конфликты имен. Например, Python-ast.h определял макрос Yield, который конфликтовал с именем Yield, используемым заголовком Windows <winbase.h>. Вместо этого используйте модуль Python ast. (Внесено Виктором Стиннером в bpo-43244).

  • Удалите функции компилятора и парсера, использующие тип struct _mod, поскольку публичный AST C API был удален:

    • PyAST_Compile()

    • PyAST_CompileEx()

    • PyAST_CompileObject()

    • PyFuture_FromAST()

    • PyFuture_FromASTObject()

    • PyParser_ASTFromFile()

    • PyParser_ASTFromFileObject()

    • PyParser_ASTFromFilename()

    • PyParser_ASTFromString()

    • PyParser_ASTFromStringObject()

    Эти функции были недокументированы и исключены из ограниченного API языка C. (Внесено Виктором Стиннером в bpo-43244).

  • Удалите заголовочный файл pyarena.h с функциями:

    • PyArena_New()

    • PyArena_Free()

    • PyArena_Malloc()

    • PyArena_AddPyObject()

    Эти функции были недокументированы, исключены из ограниченного API C и использовались только внутри компилятора. (Внесено Виктором Стиннером в bpo-43244).

  • Член PyThreadState.use_tracing был удален для оптимизации Python. (Внесено Марком Шенноном в bpo-43760).

Вернуться на верх