# Що нового в Python 3.10

редактор:

  Pablo Galindo Salgado

У цій статті пояснюється нові функції в Python 3.10 порівняно з 3.9. Python 3.10 було випущено 4 жовтня 2021 року. Щоб отримати повну інформацію, перегляньте журнал змін.

## Підсумок – основні моменти випуску

Нові функції синтаксису:

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

- PEP 635, Зіставлення структурних шаблонів: мотивація та обґрунтування

- PEP 636, Зіставлення структурних шаблонів: підручник

- bpo-12782, Менеджери контексту в дужках тепер офіційно дозволені.

Нові можливості стандартної бібліотеки:

- PEP 618, Додайте опціональну перевірку довжини до zip.

Покращення перекладача:

- PEP 626, точні номери рядків для налагодження та інших інструментів.

Нові функції набору тексту:

- PEP 604, Дозволити запис типів об’єднань як X | Ю

- PEP 612, Змінні специфікації параметрів

- PEP 613, Явні псевдоніми типу

- PEP 647, User-Defined Type Guards

Важливі застарілі, видалення або обмеження:

- PEP 644, Потрібен OpenSSL 1.1.1 або новіший

- PEP 632, Вилучити модуль distutils.

- PEP 623, Застаріло та підготуйтеся до видалення члена wstr у PyUnicodeObject.

- PEP 624, Видалити API кодувальника Py_UNICODE

- PEP 597, Додайте необов’язкове попередження про кодування

## Нові можливості

### Менеджери контексту в дужках

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

    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 ':'

  (Contributed by Pablo Galindo in 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?

  (Contributed by Pablo Galindo in bpo-43017.)

- Відсутні коми в літералах колекції та між виразами:

      >>> items = {
      ... x: 1,
      ... y: 2
      ... z: 3,
        File "<stdin>", line 3
          y: 2
             ^
      SyntaxError: invalid syntax. Perhaps you forgot a comma?

  (Contributed by Pablo Galindo in bpo-43822.)

- Кілька типів винятків без дужок:

      >>> try:
      ...     build_dyson_sphere()
      ... except NotEnoughScienceError, NotEnoughResourcesError:
        File "<stdin>", line 3
          except NotEnoughScienceError, NotEnoughResourcesError:
                 ^
      SyntaxError: multiple exception types must be parenthesized

  (Contributed by Pablo Galindo in 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

  (Contributed by Pablo Galindo in bpo-43823.)

- блоки `try` без блоків `except` або `finally`:

      >>> try:
      ...     x = 2
      ... something = 3
        File "<stdin>", line 3
          something  = 3
          ^^^^^^^^^
      SyntaxError: expected 'except' or 'finally' block

  (Contributed by Pablo Galindo in 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 '='?

  (Contributed by Pablo Galindo in 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

  (Contributed by Pablo Galindo in 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

When printing `AttributeError`, `PyErr_Display()` will offer suggestions of similar attribute names in the object that the exception was raised from:

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

Попередження

Notice this won’t work if `PyErr_Display()` is not called to display the error which can happen if some other custom error display function is used. This is a common scenario in some REPLs like IPython.

#### NameErrors

When printing `NameError` raised by the interpreter, `PyErr_Display()` will offer suggestions of similar variable names in the function that the exception was raised from:

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

Попередження

Notice this won’t work if `PyErr_Display()` is not called to display the error, which can happen if some other custom error display function is used. This is a common scenario in some REPLs like IPython.

### PEP 626: точні номери рядків для налагодження та інших інструментів

PEP 626 надає більш точні та надійні номери рядків для інструментів налагодження, профілювання та покриття. Події трасування з правильним номером рядка генеруються для всіх виконаних рядків коду та лише для рядків коду, які виконуються.

The `f_lineno` attribute of frame objects will always contain the expected line number.

The `co_lnotab` attribute of code objects is deprecated and will be removed in 3.12. Code that needs to convert from offset to line number should use the new `co_lines()` method instead.

### PEP 634: Зіставлення структурних шаблонів

Зіставлення структурних шаблонів було додано у формі операторів відповідності та операторів case шаблонів із пов’язаними діями. Патерни складаються з послідовностей, відображень, примітивних типів даних, а також екземплярів класу. Зіставлення шаблонів дозволяє програмам отримувати інформацію зі складних типів даних, розгалужувати структуру даних і застосовувати певні дії на основі різних форм даних.

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

Загальний синтаксис зіставлення шаблонів:

    match subject:
        case <pattern_1>:
            <action_1>
        case <pattern_2>:
            <action_2>
        case <pattern_3>:
            <action_3>
        case _:
            <action_wildcard>

Інструкція збігу приймає вираз і порівнює його значення з послідовними шаблонами, поданими як один або більше блоків регістру. Зокрема, зіставлення шаблонів працює за допомогою:

1. використання даних із типом і формою (`тема`)

2. оцінка `підмета` в `match` заяві

3. порівняння суб’єкта з кожним шаблоном у операторі `case` зверху вниз, доки відповідність не буде підтверджено.

4. виконання дії, пов’язаної з шаблоном підтвердженого збігу

5. Якщо точний збіг не підтверджено, останній регістр, символ підстановки `_`, якщо він наданий, буде використано як відповідний регістр. Якщо точний збіг не підтверджено, а регістр символів підстановки не існує, весь блок збігів є безопераційним.

#### Декларативний підхід

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

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

Хоча «імперативна» серія інструкцій із використанням вкладених операторів «if» може бути використана для виконання чогось подібного до зіставлення структурного шаблону, вона менш зрозуміла, ніж «декларативний» підхід. Натомість «декларативний» підхід визначає умови, які необхідно виконати для збігу, і його легше читати через його явні шаблони. У той час як зіставлення структурних шаблонів можна використовувати в його найпростішій формі, порівнюючи змінну з літералом у операторі 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"

Якщо наведеній вище функції передається `статус` 418, повертається «Я чайник». Якщо наведеній вище функції передано `статус` 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 збіг може не існувати. Якщо відповідності немає, поведінка є безопераційною. Наприклад, якщо передано `статус` 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)`, і його можна вважати розширенням літерального шаблону, показаного вище. Наступні два шаблони поєднують літерал і змінну, а змінна зв’язує значення з теми (`точка`). Четвертий шаблон фіксує два значення, що робить його концептуально подібним до призначення розпакування `(x, y) = point`.

#### Шаблони та класи

If you are using classes to structure your data, you can use as a pattern the class name followed by an argument list resembling a constructor. This pattern has the ability to capture instance attributes into variables:

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

##### Патерни з позиційними параметрами

Ви можете використовувати позиційні параметри з деякими вбудованими класами, які забезпечують порядок для своїх атрибутів (наприклад, класи даних). Ви також можете визначити конкретну позицію для атрибутів у шаблонах, встановивши спеціальний атрибут `__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. Символ узагальнення можна використовувати в більш складних шаблонах, наприклад `('помилка', код, _)`. Наприклад:

    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` до шаблону, відомого як «guard». Якщо guard false, `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"` з dict. На відміну від шаблонів послідовності, додаткові ключі ігноруються. Також підтримується символ підстановки `**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"`

The default encoding of `TextIOWrapper` and `open()` is platform and locale dependent. Since UTF-8 is used on most Unix platforms, omitting `encoding` option when opening UTF-8 files (e.g. JSON, YAML, TOML, Markdown) is a very common bug. For example:

    # 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` додано, щоб увімкнути попередження.

Перегляньте Кодування тексту для отримання додаткової інформації.

## Нові функції, пов’язані з підказками типу

У цьому розділі розглядаються основні зміни, що стосуються підказок типу PEP 484 і модуля `typing`.

### PEP 604: Оператор союзу нового типу

A new type union operator was introduced which enables the syntax `X | Y`. This provides a cleaner way of expressing „either type X or type Y“ instead of using `typing.Union`, especially in type hints.

In previous versions of Python, to apply a type hint for functions accepting arguments of multiple types, `typing.Union` was used:

    def square(number: Union[int, float]) -> Union[int, float]:
        return number ** 2

Підказки щодо типів тепер можна писати стисло:

    def square(number: int | float) -> int | float:
        return number ** 2

Цей новий синтаксис також приймається як другий аргумент для `isinstance()` і `issubclass()`:

    >>> isinstance(1, int | str)
    True

Дивіться Тип союзу і PEP 604 для отримання додаткової інформації.

(Надано Меггі Мосс і Філіпом Прадосом у bpo-41428, з доповненнями Юрія Карабаса та Сергія Сторчака в bpo-44490.)

### PEP 612: Змінні специфікації параметрів

До модуля `typing` було додано дві нові опції для покращення інформації, що надається до засобів перевірки статичних типів для PEP 484 `Callable`.

Перша - це змінна специфікації параметра. Вони використовуються для пересилання типів параметрів одного викликаного до іншого викликаного — шаблон, який зазвичай зустрічається у функціях вищого порядку та декораторах. Приклади використання можна знайти в `typing.ParamSpec`. Раніше не було простого способу ввести анотацію залежності типів параметрів таким точним способом.

Другий варіант — новий оператор `Concatenate`. Він використовується в поєднанні зі змінними специфікації параметрів для введення анотації до викликаного вищого порядку, який додає або видаляє параметри іншого викликаного. Приклади використання можна знайти в `typing.Concatenate`.

Див. `typing.Callable`, `typing.ParamSpec`, `typing.Concatenate`, `typing.ParamSpecArgs`, `typing.ParamSpecKwargs` і PEP 612, щоб дізнатися більше.

(Надано Кеном Джином у bpo-41559, з незначними вдосконаленнями Джелле Зійлстра в bpo-43783. PEP написав Марк Мендоза.)

### PEP 613: Псевдонім типу

PEP 484 представив концепцію псевдонімів типів, лише вимагаючи, щоб вони були неанотованими призначеннями верхнього рівня. Ця простота іноді ускладнювала перевірку типів розрізняти псевдоніми типів і звичайні призначення, особливо коли були задіяні прямі посилання або недійсні типи. Порівняти:

    StrCache = 'Cache[str]'  # a type alias
    LOG_PREFIX = 'LOG[DEBUG]'  # a module constant

Now the `typing` module has a special value `TypeAlias` which lets you declare type aliases more explicitly:

    StrCache: TypeAlias = 'Cache[str]'  # a type alias
    LOG_PREFIX = 'LOG[DEBUG]'  # a module constant

Дивіться PEP 613 для більш детальної інформації.

(Надав Михайло Голубєв у bpo-41923.)

### PEP 647: Охоронці типу, визначені користувачем

`TypeGuard` has been added to the `typing` module to annotate type guard functions and improve information provided to static type checkers during type narrowing. For more information, please see `TypeGuard`„s documentation, and PEP 647.

(Надано Кеном Джином і Гвідо ван Россумом у bpo-43766. PEP написав Ерік Траут.)

## Інші зміни мови

- Тип `int` має новий метод `int.bit_count()`, який повертає кількість одиниць у двійковому розширенні даного цілого числа, також відоме як кількість населення. (Надав Ніклас Фієкас у bpo-29882.)

- Представлення, що повертаються `dict.keys()`, `dict.values()` і `dict.items()`, тепер усі мають атрибут `mapping`, який дає `types.MappingProxyType` об’єкт, що обгортає оригінальний словник. (Надав Денніс Суїні в bpo-40890.)

- PEP 618: функція `zip()` тепер має додатковий прапорець `strict`, який використовується для вимоги, щоб усі ітеровані елементи мали однакову довжину.

- Вбудовані функції та функції розширення, які приймають цілі аргументи, більше не приймають `Decimal`s, `Fraction`s та інші об’єкти, які можна перетворити на цілі числа лише з втратою (наприклад, що мають метод `__int__()`, але не мають методу `__index__()`). (Надав Сергій Сторчака в bpo-37999.)

- If `object.__ipow__()` returns `NotImplemented`, the operator will correctly fall back to `object.__pow__()` and `object.__rpow__()` as expected. (Contributed by Alex Shkop in bpo-38302.)

- Вирази присвоєння тепер можна використовувати без дужок у літералах набору та розуміння набору, а також в індексах послідовності (але не в зрізах).

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

- Дві нові вбудовані функції – `aiter()` і `anext()` були додані, щоб забезпечити асинхронні відповідники `iter()` і `next()` відповідно. (Надано Джошуа Бронсоном, Деніелом Поупом і Джастіном Вангом у bpo-31861.)

- Static methods (`@staticmethod`) and class methods (`@classmethod`) now inherit the method attributes (`__module__`, `__name__`, `__qualname__`, `__doc__`, `__annotations__`) and have a new `__wrapped__` attribute. Moreover, static methods are now callable as regular functions. (Contributed by Victor Stinner in bpo-43682.)

- Анотації для складних цілей (усі, окрім цілей `простих імен`, визначених PEP 526) більше не викликають жодних ефектів під час виконання з `from __future__ import anotations`. (Надано Batuhan Taskaya в bpo-42737.)

- Об’єкти класів і модулів тепер відкладено створюють порожні анотації dicts на вимогу. Анотації dicts зберігаються в об’єкті `__dict__` для зворотної сумісності. Це покращує найкращі методи роботи з `__annotations__`; для отримання додаткової інформації див. Рекомендації щодо анотацій. (Надано Ларрі Гастінгсом у bpo-43901.)

- Анотації, що складаються з `yield`, `yield from`, `await` або іменовані вирази тепер заборонені в `from __future__ import анотаціях` через їхні побічні ефекти. (Надано Batuhan Taskaya в bpo-42725.)

- Використання незв’язаних змінних, `super()` та інших виразів, які можуть змінити обробку таблиці символів як анотацій, тепер стає неефективним у `from __future__ import anotations`. (Надано Batuhan Taskaya в bpo-42725.)

- Хеші значень NaN як типу `float`, так і типу `decimal.Decimal` тепер залежать від ідентичності об’єкта. Раніше вони завжди хешувалися до `0`, навіть якщо значення NaN не дорівнюють одне одному. Це спричинило потенційно квадратичну поведінку під час виконання через надмірні хеш-колізії під час створення словників і наборів, що містять кілька NaN. (Надав Реймонд Геттінгер у bpo-43475.)

- A `SyntaxError` (instead of a `NameError`) will be raised when deleting the `__debug__` constant. (Contributed by Donghee Na in bpo-45000.)

- Винятки `SyntaxError` тепер мають атрибути `end_lineno` і `end_offset`. Вони будуть `None`, якщо не визначено. (Надав Пабло Галіндо в bpo-43914.)

## Нові модулі

- None.

## Покращені модулі

### asyncio

Add missing `connect_accepted_socket()` method. (Contributed by Alex Grönholm in bpo-41332.)

### argparse

Оманливу фразу «необов’язкові аргументи» було замінено на «параметри» в довідці argparse. Деякі тести можуть вимагати адаптації, якщо вони покладаються на точну вихідну відповідність. (Надав Реймонд Геттінгер у bpo-9694.)

### масив

Метод `index()` `array.array` тепер має додаткові параметри start і stop. (Надано Андерсом Лоренценом і Закері Шпітцем у bpo-31956.)

### asynchat, asyncore, smtpd

Починаючи з Python 3.6, ці модулі позначені як застарілі в документації модулів. До всіх цих трьох модулів тепер додано `DeprecationWarning` під час імпорту.

### база64

Додайте `base64.b32hexencode()` і `base64.b32hexdecode()` для підтримки кодування Base32 із розширеним шістнадцятковим алфавітом.

### bdb

Add `clearBreakpoints()` to reset all set breakpoints. (Contributed by Irit Katriel in bpo-24160.)

### ділимо навпіл

Додано можливість надання функції key для API в модулі `bisect`. (Надав Реймонд Геттінгер у bpo-4356.)

### кодеки

Додайте функцію `codecs.unregister()`, щоб скасувати реєстрацію функції пошуку кодеків. (Надав Хай Ши в bpo-41842.)

### колекції.abc

`__args__` параметризованого загального для `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()`, щоб безпечно закривати асинхронні генератори та об’єкти, що представляють асинхронно звільнені ресурси. (Надано Джунгі Кімом і Джоном Бельмонте в bpo-41229.)

Додайте підтримку диспетчера асинхронного контексту до `contextlib.nullcontext()`. (Надав Том Грінгауз у bpo-41543.)

Add `AsyncContextDecorator`, for supporting usage of async context managers as decorators.

### прокльони

Розширені функції кольору, додані в 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.)

### класи даних

#### __slots__

Додано параметр `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, field

    @dataclass
    class Birthday:
        name: str
        birthday: datetime.date = field(kw_only=True)

Тут лише `день народження` є лише ключовим словом. Якщо ви встановлюєте `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

Here, `z` and `t` are keyword-only parameters, while `x` and `y` are not. (Contributed by Eric V. Smith in 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.)

### enum

`Enum` `__repr__()` now returns `enum_name.member_name` and `__str__()` now returns `member_name`. Stdlib enums available as module constants have a `repr()` of `module_name.member_name`. (Contributed by Ethan Furman in bpo-40066.)

Add `enum.StrEnum` for enums where all members are strings. (Contributed by Ethan Furman in bpo-41816.)

### введення файлу

Додайте параметри encoding і errors у `fileinput.input()` і `fileinput.FileInput`. (Надано Інадою Наокі в bpo-43712.)

`fileinput.hook_compressed()` now returns `TextIOWrapper` object when mode is «r» and file is compressed, like uncompressed files. (Contributed by Inada Naoki in bpo-5758.)

### обробник помилок

Модуль `faulthandler` тепер виявляє, якщо під час збирання сміття виникає фатальна помилка. (Надав Віктор Стіннер у bpo-44466.)

### gc

Додайте перехоплювачі аудиту для `gc.get_objects()`, `gc.get_referrers()` і `gc.get_referents()`. (Надав Пабло Галіндо в bpo-43439.)

### глоб

Додайте параметри root_dir і dir_fd у `glob()` і `iglob()`, які дозволяють вказати кореневий каталог для пошуку. (Надав Сергій Сторчака в bpo-38144.)

### хешліб

Модуль hashlib вимагає OpenSSL 1.1.1 або новішої версії. (Надав Крістіан Хаймес у PEP 644 і bpo-43669.)

Модуль hashlib має попередню підтримку OpenSSL 3.0.0. (Надано Крістіаном Хеймсом у bpo-38820 та інших випусках.)

Резервна версія чистого Python `pbkdf2_hmac()` застаріла. У майбутньому PBKDF2-HMAC буде доступний лише тоді, коли Python буде створено з підтримкою OpenSSL. (Надав Крістіан Хеймс у bpo-43880.)

### hmac

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

### IDLE і idlelib

Зробити IDLE викликом `sys.excepthook()` (якщо запускається без „-n“). Хуки користувача раніше ігнорувалися. (Надав Кен Хілтон у bpo-43008.)

Перевпорядкування діалогового вікна налаштувань. Розділіть вкладку Загальні на вкладки Windows і Shell/Ed. Перемістіть джерела довідки, які розширюють меню «Довідка», на вкладку «Розширення». Звільніть місце для нових параметрів і скоротіть діалогове вікно. Останнє робить діалог краще адаптованим до маленьких екранів. (Надано Террі Джен Ріді в bpo-40468.) Перемістіть налаштування відступу з вкладки «Шрифт» на нову вкладку Windows. (Надано Марком Розманом і Террі Джен Ріді в bpo-33962.)

Зазначені вище зміни було перенесено до версії 3.9 для обслуговування.

Додайте бічну панель Shell. Перемістіть основну підказку („>>>“) на бічну панель. Додайте додаткові підказки (“…“) на бічну панель. Клацання лівою кнопкою миші та необов’язкове перетягування виділяє один або кілька рядків тексту, як і на бічній панелі номерів рядків редактора. Клацання правою кнопкою миші після вибору текстових рядків відображає контекстне меню з «копіювати з підказками». Це об’єднує підказки з бічної панелі з рядками з виділеного тексту. Цей параметр також відображається в контекстному меню для тексту. (Надав Тал Ейнат у bpo-37903.)

Використовуйте пробіли замість табуляції, щоб зробити відступ інтерактивного коду. Завдяки цьому інтерактивні записи коду виглядають правильно. Зробити це можливим було основною мотивацією для додавання бічної панелі оболонки. (Надав Террі Ян Ріді в bpo-37892.)

Виділіть нові м’які ключові слова `match`, `case` і `_` в операторах зіставлення шаблонів. Однак це підсвічування не є ідеальним і буде неправильним у деяких рідкісних випадках, включаючи деякі `_`-s у шаблонах `case`. (Надав Тал Ейнат у bpo-44010.)

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

Apply syntax highlighting to `.pyi` files. (Contributed by Alex Waygood and Terry Jan Reedy in bpo-45447.)

Include prompts when saving Shell with inputs and outputs. (Contributed by Terry Jan Reedy in gh-95191.)

### importlib.metadata

Парність функцій із `importlib_metadata` 4.6 (історія).

importlib.metadata entry points now provide a nicer experience for selecting entry points by group and name through a new importlib.metadata.EntryPoints class. See the Compatibility Note in the docs for more info on the deprecation and usage.

Added importlib.metadata.packages_distributions() for resolving top-level Python modules and packages to their importlib.metadata.Distribution.

### оглядати

Якщо модуль не визначає `__loader__`, поверніться до `__spec__.loader`. (Надано Бреттом Кенноном у bpo-42133.)

Add `inspect.get_annotations()`, which safely computes the annotations defined on an object. It works around the quirks of accessing the annotations on various types of objects, and makes very few assumptions about the object it examines. `inspect.get_annotations()` can also correctly un-stringize stringized annotations. `inspect.get_annotations()` is now considered best practice for accessing the annotations dict defined on any Python object; for more information on best practices for working with annotations, please see Рекомендації щодо анотацій. Relatedly, `inspect.signature()`, `inspect.Signature.from_callable()`, and `inspect.Signature.from_function()` now call `inspect.get_annotations()` to retrieve annotations. This means `inspect.signature()` and `inspect.Signature.from_callable()` can also now un-stringize stringized annotations. (Contributed by Larry Hastings in bpo-43817.)

### itertools

Add `itertools.pairwise()`. (Contributed by Raymond Hettinger in bpo-38200.)

### лінійний кеш

Якщо модуль не визначає `__loader__`, поверніться до `__spec__.loader`. (Надано Бреттом Кенноном у bpo-42133.)

### ос

Add `os.cpu_count()` support for VxWorks RTOS. (Contributed by Peixing Xin in bpo-41440.)

Додайте нову функцію `os.eventfd()` і відповідні помічники, щоб завершити системний виклик `eventfd2` у Linux. (Надав Крістіан Хеймс у bpo-41001.)

Add `os.splice()` that allows to move data between two file descriptors without copying between kernel address space and user address space, where one of the file descriptors must refer to a pipe. (Contributed by Pablo Galindo in bpo-41625.)

Add `O_EVTONLY`, `O_FSYNC`, `O_SYMLINK` and `O_NOFOLLOW_ANY` for macOS. (Contributed by Donghee Na in bpo-43106.)

### os.path

`os.path.realpath()` тепер приймає суворий аргумент лише для ключового слова. Якщо встановлено значення `True`, `OSError` викликається, якщо шлях не існує або виникає цикл символічного посилання. (Надано Барні Гейлом у bpo-43757.)

### pathlib

Add slice support to `PurePath.parents`. (Contributed by Joshua Cannon in bpo-35498.)

Add negative indexing support to `PurePath.parents`. (Contributed by Yaroslav Pankovych in bpo-21041.)

Add `Path.hardlink_to` method that supersedes `link_to()`. The new method has the same argument order as `symlink_to()`. (Contributed by Barney Gale in bpo-39950.)

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

### платформа

Add `platform.freedesktop_os_release()` to retrieve operation system identification from freedesktop.org os-release standard file. (Contributed by Christian Heimes in bpo-28468.)

### pprint

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

`pprint` тепер може красиво друкувати екземпляри `dataclasses.dataclass`. (Надано Льюїсом Голом у bpo-43080.)

### py_compile

Додайте параметр `--quiet` до інтерфейсу командного рядка `py_compile`. (Надав Григорій Шевченко в bpo-38731.)

### pyclbr

Add an `end_lineno` attribute to the `Function` and `Class` objects in the tree returned by `pyclbr.readmodule()` and `pyclbr.readmodule_ex()`. It matches the existing (start) `lineno`. (Contributed by Aviral Srivastava in bpo-38307.)

### полиця

The `shelve` module now uses `pickle.DEFAULT_PROTOCOL` by default instead of `pickle` protocol `3` when creating shelves. (Contributed by Zackery Spytz in 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.)

The ssl module has preliminary support for OpenSSL 3.0.0 and new option `OP_IGNORE_UNEXPECTED_EOF`. (Contributed by Christian Heimes in bpo-38820, bpo-43794, bpo-43788, bpo-43791, bpo-43799, bpo-43920, bpo-43789, and bpo-43811.)

Застаріла функція та використання застарілих констант тепер призводять до `DeprecationWarning`. `ssl.SSSLContext.options` має `OP_NO_SSLv2` і `OP_NO_SSLv3` встановлені за замовчуванням і тому не може попередити про повторне встановлення прапора. У розділі deprecation міститься список застарілих функцій. (Надав Крістіан Хеймс у bpo-43880.)

Модуль ssl тепер має більш безпечні налаштування за замовчуванням. Шифри без прямої секретності або SHA-1 MAC вимкнено за замовчуванням. Рівень безпеки 2 забороняє слабкі ключі RSA, DH і ECC з менш ніж 112 бітами безпеки. `SSLContext` за умовчанням має мінімальну версію протоколу TLS 1.2. Налаштування засновані на дослідженнях Hynek Schlawack. (Надав Крістіан Хеймс у bpo-43998.)

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

Додайте параметр timeout до функції `ssl.get_server_certificate()`. (Надав Закері Шпітц у bpo-31870.)

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

A new verify flag `VERIFY_X509_PARTIAL_CHAIN` has been added. (Contributed by l0x in bpo-40849.)

### sqlite3

Add audit events for `connect()`, `enable_load_extension()`, and `load_extension()`. (Contributed by Erlend E. Aasland in bpo-43762.)

### система

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

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

### _thread

`_thread.interrupt_main()` now takes an optional signal number to simulate (the default is still `signal.SIGINT`). (Contributed by Antoine Pitrou in bpo-43356.)

### різьблення

Додайте `threading.gettrace()` і `threading.getprofile()`, щоб отримати функції, встановлені `threading.settrace()` і `threading.setprofile()` відповідно. (Надав Маріо Корчеро в bpo-42251.)

Додайте `threading.__excepthook__`, щоб дозволити отримати початкове значення `threading.excepthook()` у випадку, якщо для нього встановлено пошкоджене або інше значення. (Надав Маріо Корчеро в bpo-42308.)

### простежити

Функції `format_exception()`, `format_exception_only()` і `print_exception()` тепер можуть приймати об’єкт винятку лише як позиційний аргумент. (Надано Zackery Spytz і Matthias Bussonnier у bpo-26389.)

### види

Знову представити класи `types.EllipsisType`, `types.NoneType` і `types.NotImplementedType`, надаючи новий набір типів, які легко інтерпретуються засобами перевірки типів. (Надав Бас ван Бік у bpo-41810.)

### введення тексту

Для основних змін див. Нові функції, пов’язані з підказками типу.

Поведінку `typing.Literal` було змінено, щоб вона відповідала PEP 586 і відповідала поведінці засобів перевірки статичних типів, указаних у PEP.

1. `Літерал` тепер усуває дублікати параметрів.

2. Порівняння рівності між об’єктами `Literal` тепер не залежить від порядку.

3. `Літеральні` порівняння тепер поважають типи. Наприклад, `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.)

Add new function `typing.is_typeddict()` to introspect if an annotation is a `typing.TypedDict`. (Contributed by Patrick Reader in bpo-41792.)

Subclasses of `typing.Protocol` which only have data variables declared will now raise a `TypeError` when checked with `isinstance` unless they are decorated with `runtime_checkable()`. Previously, these checks passed silently. Users should decorate their subclasses with the `runtime_checkable()` decorator if they want runtime protocols. (Contributed by Yurii Karabas in bpo-38908.)

Importing from the `typing.io` and `typing.re` submodules will now emit `DeprecationWarning`. These submodules have been deprecated since Python 3.8 and will be removed in a future version of Python. Anything belonging to those submodules should be imported directly from `typing` instead. (Contributed by Sebastian Rittau in bpo-38291.)

### unittest

Додайте новий метод `assertNoLogs()`, щоб доповнити існуючий `assertLogs()`. (Надав Кіт Ян Чой у bpo-39385.)

### urllib.parse

Python versions earlier than Python 3.10 allowed using both `;` and `&` as query parameter separators in `urllib.parse.parse_qs()` and `urllib.parse.parse_qsl()`. Due to security concerns, and to conform with newer W3C recommendations, this has been changed to allow only a single separator key, with `&` as the default. This change also affects `cgi.parse()` and `cgi.parse_multipart()` as they use the affected functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser in `urllib.parse` preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See gh-88048)

### 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 назва модуля` в середньому в 1,4 рази швидший. У Linux `python3 -I -m назва-модуля` імпортує 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%. Перегляньте цю статтю для отримання додаткової інформації. (Надано Віктором Стіннером і Пабло Галіндо в 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)

- When using stringized annotations, annotations dicts for functions are no longer created when the function is created. Instead, they are stored as a tuple of strings, and the function object lazily converts this into the annotations dict on demand. This optimization cuts the CPU time needed to define an annotated function by half. (Contributed by Yurii Karabas and Inada Naoki in bpo-42202.)

- Функції пошуку підрядків, такі як `str1 in str2` і `str2.find(str1)`, тепер іноді використовують «двосторонній» алгоритм пошуку рядків Crochemore & Perrin, щоб уникнути квадратичної поведінки довгих рядків. (Надав Денніс Суїні в bpo-41972)

- Add micro-optimizations to `_PyType_Lookup()` to improve type attribute cache lookup performance in the common case of cache hits. This makes the interpreter 1.04 times faster on average. (Contributed by Dino Viehland in bpo-43452.)

- The following built-in functions now support the faster PEP 590 vectorcall calling convention: `map()`, `filter()`, `reversed()`, `bool()` and `float()`. (Contributed by Donghee Na and Jeroen Demeyer in bpo-43575, bpo-43287, bpo-41922, bpo-41873 and bpo-41870.)

- `BZ2File` performance is improved by removing internal `RLock`. This makes `BZ2File` thread unsafe in the face of multiple simultaneous readers or writers, just like its equivalent classes in `gzip` and `lzma` have always been. (Contributed by Inada Naoki in bpo-43785.)

## Застаріле

- Currently Python accepts numeric literals immediately followed by keywords, for example `0in x`, `1or x`, `0if 1else 2`. It allows confusing and ambiguous expressions like `[0x1for x in y]` (which can be interpreted as `[0x1 for x in y]` or `[0x1f or x in y]`). Starting in this release, a deprecation warning is raised if the numeric literal is immediately followed by one of keywords `and`, `else`, `for`, `if`, `in`, `is` and `or`. In future releases it will be changed to syntax warning, and finally to syntax error. (Contributed by Serhiy Storchaka in bpo-43833.)

- Starting in this release, there will be a concerted effort to begin cleaning up old import semantics that were kept for Python 2.7 compatibility. Specifically, `find_loader()`/`find_module()` (superseded by `find_spec()`), `importlib.abc.Loader.load_module` (superseded by `exec_module()`), `module_repr()` (which the import system takes care of for you), the `__package__` attribute (superseded by `__spec__.parent`), the `__loader__` attribute (superseded by `__spec__.loader`), and the `__cached__` attribute (superseded by `__spec__.cached`) will slowly be removed (as well as other classes and methods in `importlib`). `ImportWarning` and/or `DeprecationWarning` will be raised as appropriate to help identify code which needs updating during this transition.

- Весь простір імен `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()` has been deprecated in preference for `exec_module()`. (Contributed by Brett Cannon in bpo-26131.)

- The use of `importlib.abc.Loader.load_module` by the import system now triggers an `ImportWarning` as `exec_module()` is preferred. (Contributed by Brett Cannon in bpo-26131.)

- The use of `importlib.abc.MetaPathFinder.find_module()` and `importlib.abc.PathEntryFinder.find_module()` by the import system now trigger an `ImportWarning` as `importlib.abc.MetaPathFinder.find_spec()` and `importlib.abc.PathEntryFinder.find_spec()` are preferred, respectively. You can use `importlib.util.spec_from_loader()` to help in porting. (Contributed by Brett Cannon in bpo-42134.)

- The use of `importlib.abc.PathEntryFinder.find_loader()` by the import system now triggers an `ImportWarning` as `importlib.abc.PathEntryFinder.find_spec()` is preferred. You can use `importlib.util.spec_from_loader()` to help in porting. (Contributed by Brett Cannon in bpo-43672.)

- The various implementations of `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()` ), and `importlib.abc.PathEntryFinder.find_loader()` ( `importlib.machinery.FileFinder.find_loader()` ) now raise `DeprecationWarning` and are slated for removal in Python 3.12 (previously they were documented as deprecated in Python 3.4). (Contributed by Brett Cannon in bpo-42135.)

- `importlib.abc.Finder` is deprecated (including its sole method, `find_module()`). Both `importlib.abc.MetaPathFinder` and `importlib.abc.PathEntryFinder` no longer inherit from the class. Users should inherit from one of these two classes as appropriate instead. (Contributed by Brett Cannon in bpo-42135.)

- The deprecations of `imp`, `importlib.find_loader()`, `importlib.util.set_package_wrapper()`, `importlib.util.set_loader_wrapper()`, `importlib.util.module_for_loader()`, `pkgutil.ImpImporter`, and `pkgutil.ImpLoader` have all been updated to list Python 3.12 as the slated version of removal (they began raising `DeprecationWarning` in previous versions of Python). (Contributed by Brett Cannon in bpo-43720.)

- The import system now uses the `__spec__` attribute on modules before falling back on `module_repr()` for a module’s `__repr__()` method. Removal of the use of `module_repr()` is scheduled for Python 3.12. (Contributed by Brett Cannon in bpo-42137.)

- `importlib.abc.Loader.module_repr()`, `importlib.machinery.FrozenLoader.module_repr()`, and `importlib.machinery.BuiltinLoader.module_repr()` are deprecated and slated for removal in Python 3.12. (Contributed by Brett Cannon in bpo-42136.)

- `sqlite3.OptimizedUnicode` був незадокументованим і застарілим з Python 3.3, коли його було зроблено псевдонімом `str`. Зараз він застарів, планується його видалення в Python 3.12. (Надав Erlend E. Aasland у bpo-42264.)

- Недокументована вбудована функція `sqlite3.enable_shared_cache` тепер застаріла, її планується видалити в Python 3.12. Його використання настійно не рекомендується документацією SQLite3. Перегляньте документи SQLite3 для отримання додаткової інформації. Якщо потрібно використовувати спільний кеш, відкрийте базу даних у режимі URI за допомогою параметра запиту `cache=shared`. (Надав Erlend E. Aasland у bpo-24464.)

- Наступні методи `потоковості` тепер застаріли:

  - `threading.currentThread` => `threading.current_thread()`

  - `threading.activeCount` => `threading.active_count()`

  - `threading.Condition.notifyAll` => `threading.Condition.notify_all()`

  - `threading.Event.isSet` => `threading.Event.is_set()`

  - `threading.Thread.setName` => `threading.Thread.name`

  - `threading.thread.getName` => `threading.Thread.name`

  - `threading.Thread.isDaemon` => `threading.Thread.daemon`

  - `threading.Thread.setDaemon` => `threading.Thread.daemon`

  (Contributed by Jelle Zijlstra in gh-87889.)

- `pathlib.Path.link_to()` is deprecated and slated for removal in Python 3.12. Use `pathlib.Path.hardlink_to()` instead. (Contributed by Barney Gale in bpo-39950.)

- `cgi.log()` застарів і планується для видалення в Python 3.12. (Надано Інадою Наокі в bpo-41139.)

- Наступні функції `ssl` застаріли з Python 3.6, Python 3.7 або OpenSSL 1.1.0 і будуть видалені в 3.11:

  - `OP_NO_SSLv2`, `OP_NO_SSLv3`, `OP_NO_TLSv1`, `OP_NO_TLSv1_1`, `OP_NO_TLSv1_2`, and `OP_NO_TLSv1_3` are replaced by `minimum_version` and `maximum_version`.

  - `PROTOCOL_SSLv2`, `PROTOCOL_SSLv3`, `PROTOCOL_SSLv23`, `PROTOCOL_TLSv1`, `PROTOCOL_TLSv1_1`, `PROTOCOL_TLSv1_2`, and `PROTOCOL_TLS` are deprecated in favor of `PROTOCOL_TLS_CLIENT` and `PROTOCOL_TLS_SERVER`

  - `wrap_socket()` is replaced by `ssl.SSLContext.wrap_socket()`

  - `match_hostname()`

  - `RAND_pseudo_bytes()`, `RAND_egd()`

  - Такі функції NPN, як `ssl.SSLSocket.selected_npn_protocol()` і `ssl.SSSLContext.set_npn_protocols()`, замінено на ALPN.

- The threading debug (`PYTHONTHREADDEBUG` environment variable) is deprecated in Python 3.10 and will be removed in Python 3.12. This feature requires a debug build of Python. (Contributed by Victor Stinner in bpo-44584.)

- Importing from the `typing.io` and `typing.re` submodules will now emit `DeprecationWarning`. These submodules will be removed in a future version of Python. Anything belonging to these submodules should be imported directly from `typing` instead. (Contributed by Sebastian Rittau in 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. (Надано Berker Peksag у 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`.

- Видалено публічні функції API C `PyParser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `Parser_SimpleParseFileFlags` і `PyNode_Compile`, які були застарілими в 3.9 через перехід на новий аналізатор PEG.

- Removed the `formatter` module, which was deprecated in Python 3.4. It is somewhat obsolete, little used, and not tested. It was originally scheduled to be removed in Python 3.6, but such removals were delayed until after Python 2.7 EOL. Existing users should copy whatever classes they use into their code. (Contributed by Donghee Na and Terry J. Reedy in bpo-42299.)

- Removed the `PyModule_GetWarningsModule()` function that was useless now due to the `_warnings` module was converted to a builtin module in 2.6. (Contributed by Hai Shi in bpo-42599.)

- Видаліть застарілі псевдоніми для Колекції Абстрактні базові класи з модуля `collections`. (Надав Віктор Стіннер у bpo-37324.)

- Параметр `loop` було видалено з більшості `asyncio` високорівневого API після застарілої версії Python 3.8. Мотивація цієї зміни багатогранна:

  1. Це спрощує API високого рівня.

  2. Починаючи з Python 3.7, функції високорівневого API неявно отримують поточний цикл подій поточного потоку. У більшості звичайних випадків використання циклу подій до API не потрібно передавати.

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

  Зауважте, що API низького рівня все одно прийматиме `цикл`. Перегляньте Зміни в API Python приклади того, як замінити існуючий код.

  (Надано Юрієм Карабасом, Ендрю Свєтловим, Юрієм Селівановим і Кайлом Стенлі в bpo-42392.)

## Перенесення на Python 3.10

У цьому розділі наведено описані раніше зміни та інші виправлення помилок, які можуть потребувати змін у вашому коді.

### Зміни в синтаксисі Python

- Deprecation warning is now emitted when compiling previously valid syntax if the numeric literal is immediately followed by a keyword (like in `0in x`). In future releases it will be changed to syntax warning, and finally to a syntax error. To get rid of the warning and make the code compatible with future releases just add a space between the numeric literal and the following keyword. (Contributed by Serhiy Storchaka in bpo-43833.)

### Зміни в API Python

- Параметри etype функцій `format_exception()`, `format_exception_only()` і `print_exception()` у модулі `traceback` перейменовано до exc. (Надано Zackery Spytz і Matthias Bussonnier у 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-бітне ціле число без знаку. (Надав Erlend E. Aasland у bpo-42393.)

- Параметр `loop` було видалено з більшості `asyncio` високорівневого 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` тепер успадковує поточні вбудовані елементи, якщо словник globals не має ключа `"__builtins__"`, а не використовує `{"None": None}` як вбудовані елементи: те саме як функції `eval()` і `exec()`. Визначення функції за допомогою `def function(...): ...` у Python не впливає, глобальні значення не можна перевизначити за допомогою цього синтаксису: він також успадковує поточні вбудовані компоненти. (Надав Віктор Стіннер у bpo-42990.)

### Зміни в C API

- Функції C API `Parser_SimpleParseStringFlags`, `PyParser_SimpleParseStringFlagsFilename`, `Parser_SimpleParseFileFlags`, `PyNode_Compile` і тип, який використовується цими функціями, `struct _node`, були видалені через перехід до новий аналізатор PEG.

  Початковий код тепер має бути скомпільований безпосередньо в об’єкт коду за допомогою, наприклад, `Py_CompileString()`. Потім отриманий об’єкт коду можна оцінити за допомогою, наприклад, `PyEval_EvalCode()`.

  зокрема:

  - Виклик `Parser_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);

  - For `FrameObject` objects, the `f_lasti` member now represents a wordcode offset instead of a simple offset into the bytecode string. This means that this number needs to be multiplied by 2 to be used with APIs that expect a byte offset instead (like `PyCode_Addr2Line()` for example). Notice as well that the `f_lasti` member of `FrameObject` objects is not considered stable: please use `PyFrame_GetLineNumber()` instead.

## Зміни байт-коду CPython

- The `MAKE_FUNCTION` instruction now accepts either a dict or a tuple of strings as the function’s annotations. (Contributed by Yurii Karabas and Inada Naoki in 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` до сценарію `./configure`. Якщо вказано, модуль `ensurepip` шукає пакети коліс `setuptools` і `pip` у цьому каталозі: якщо обидва присутні, ці пакунки колеса використовуються замість пакетів колес гарантійpip.

  Деякі політики упаковки дистрибутивів Linux рекомендують не об’єднувати залежності. Наприклад, Fedora встановлює пакети коліс у каталог `/usr/share/python-wheels/` і не встановлює пакет `ensurepip._bundled`.

  (Надав Віктор Стіннер у bpo-42856.)

- Додайте нову опцію `configure --without-static-libpython`, щоб не створювати статичну бібліотеку `libpythonMAJOR.MINOR.a` і не встановлювати об’єктний файл `python.o`.

  (Надав Віктор Стіннер у bpo-43103.)

- The `configure` script now uses the `pkg-config` utility, if available, to detect the location of Tcl/Tk headers and libraries. As before, those locations can be explicitly specified with the `--with-tcltk-includes` and `--with-tcltk-libs` configuration options. (Contributed by Manolis Stamatogiannakis in bpo-42603.)

- Додайте параметр `--with-openssl-rpath` до сценарію `configure`. Цей параметр спрощує створення Python за допомогою індивідуальної інсталяції OpenSSL, наприклад. `./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto`. (Надав Крістіан Хеймс у bpo-43466.)

## Зміни C API

### PEP 652: Підтримка стабільного ABI

Стабільний ABI (двійковий інтерфейс програми) для модулів розширення або вбудовування Python тепер визначено явно. C API and ABI Stability описує гарантії стабільності C API та ABI разом із найкращими методами використання стабільного 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()` до обмеженого 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`, але не екземпляром підтипу. (Надав Пабло Галіндо в bpo-43277.)

- Додайте `PyErr_SetInterruptEx()`, який дозволяє передавати номер сигналу для моделювання. (Надав Антуан Пітру в bpo-43356.)

- Обмежений C API тепер підтримується, якщо Python зібрано в режимі налагодження (якщо визначено макрос `Py_DEBUG`). В обмеженому API C функції `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` singleton або `False` singleton. (Надав Віктор Стіннер у bpo-43753.)

- Додайте нові функції для керування збирачем сміття з коду C: `PyGC_Enable()`, `PyGC_Disable()`, `PyGC_IsEnabled()`. Ці функції дозволяють активувати, деактивувати та запитувати стан збирача сміття з коду C без необхідності імпортувати модуль `gc`.

- Add a new `Py_TPFLAGS_DISALLOW_INSTANTIATION` type flag to disallow creating type instances. (Contributed by Victor Stinner in bpo-43916.)

- Add a new `Py_TPFLAGS_IMMUTABLETYPE` type flag for creating immutable type objects: type attributes cannot be set nor deleted. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)

### Перенесення на Python 3.10

- The `PY_SSIZE_T_CLEAN` macro must now be defined to use `PyArg_ParseTuple()` and `Py_BuildValue()` formats which use `#`: `es#`, `et#`, `s#`, `u#`, `y#`, `z#`, `U#` and `Z#`. See Розбір аргументів і створення значень and PEP 353. (Contributed by Victor Stinner in 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, розмір)` і `PyUnicode_FromStringAndSize(NULL, розмір)` викликають `DeprecationWarning` зараз. Використовуйте `PyUnicode_New()`, щоб виділити об’єкт Unicode без початкових даних. (Надано Інадою Наокі в bpo-36346.)

- Приватну структуру `_PyUnicode_Name_CAPI` API PyCapsule `unicodedata.ucnhash_CAPI` було переміщено до внутрішнього API C. (Надав Віктор Стіннер у bpo-42157.)

- `Py_GetPath()`, `Py_GetPrefix()`, `Py_GetExecPrefix()`, `Py_GetProgramFullPath()`, `Py_GetPythonHome()` and `Py_GetProgramName()` functions now return `NULL` if called before `Py_Initialize()` (before Python is initialized). Use the new Конфігурація ініціалізації Python API to get the Конфігурація шляху Python. (Contributed by Victor Stinner in 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) ...` тест. (Надано Zackery Spytz і Victor Stinner у bpo-30459.)

- The non-limited API files `odictobject.h`, `parser_interface.h`, `picklebufobject.h`, `pyarena.h`, `pyctype.h`, `pydebug.h`, `pyfpe.h`, and `pytime.h` have been moved to the `Include/cpython` directory. These files must not be included directly, as they are already included in `Python.h`; see Включати файли. If they have been included directly, consider including `Python.h` instead. (Contributed by Nicholas Sim in bpo-35134.)

- Use the `Py_TPFLAGS_IMMUTABLETYPE` type flag to create immutable type objects. Do not rely on `Py_TPFLAGS_HEAPTYPE` to decide if a type object is mutable or not; check if `Py_TPFLAGS_IMMUTABLETYPE` is set instead. (Contributed by Victor Stinner and Erlend E. Aasland in bpo-43908.)

- The undocumented function `Py_FrozenMain` has been removed from the limited API. The function is mainly useful for custom builds of Python. (Contributed by Petr Viktorin in bpo-26241.)

### Застаріле

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

### Видалено

- Видалено функції `Py_UNICODE_str*`, які маніпулюють рядками `Py_UNICODE*`. (Надано Інадою Наокі в bpo-41123.)

  - `Py_UNICODE_strlen`: використовуйте `PyUnicode_GetLength()` або `PyUnicode_GET_LENGTH`

  - `Py_UNICODE_strcat`: використовуйте `PyUnicode_CopyCharacters()` або `PyUnicode_FromFormat()`

  - `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`: використовуйте `PyUnicode_CopyCharacters()` або `PyUnicode_Substring()`

  - `Py_UNICODE_strcmp`: використовуйте `PyUnicode_Compare()`

  - `Py_UNICODE_strncmp`: використовуйте `PyUnicode_Tailmatch()`

  - `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: використовуйте `PyUnicode_FindChar()`

- Видалено `PyUnicode_GetMax()`. Будь ласка, перейдіть на нові (PEP 393) API. (Надано Інадою Наокі в bpo-41103.)

- Видалено `PyLong_FromUnicode()`. Будь ласка, перейдіть до `PyLong_FromUnicodeObject()`. (Надано Інадою Наокі в bpo-41103.)

- Видалено `PyUnicode_AsUnicodeCopy()`. Будь ласка, використовуйте `PyUnicode_AsUCS4Copy()` або `PyUnicode_AsWideCharString()` (Надано Інадою Наокі в 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`. Ці функції були недокументовані та виключені з обмеженого C API. Більшість імен, визначених цими файлами заголовків, не мали префікса `Py` і тому могли спричиняти конфлікти імен. Наприклад, `Python-ast.h` визначив макрос `Yield`, який конфліктував з назвою `Yield`, що використовується заголовком Windows `<winbase.h>`. Натомість використовуйте модуль Python `ast`. (Надав Віктор Стіннер у bpo-43244.)

- Видаліть функції компілятора та аналізатора за допомогою типу `struct _mod`, оскільки загальнодоступний API AST C було видалено:

  - `PyAST_Compile()`

  - `PyAST_CompileEx()`

  - `PyAST_CompileObject()`

  - `PyFuture_FromAST()`

  - `PyFuture_FromASTObject()`

  - `PyParser_ASTFromFile()`

  - `PyParser_ASTFromFileObject()`

  - `PyParser_ASTFromFilename()`

  - `PyParser_ASTFromString()`

  - `PyParser_ASTFromStringObject()`

  Ці функції були недокументовані та виключені з обмеженого C API. (Надав Віктор Стіннер у bpo-43244.)

- Видаліть заголовний файл `pyarena.h` із функціями:

  - `PyArena_New()`

  - `PyArena_Free()`

  - `PyArena_Malloc()`

  - `PyArena_AddPyObject()`

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

- Для оптимізації Python було видалено член `PyThreadState.use_tracing`. (Надав Марк Шеннон у bpo-43760.)

## Notable security feature in 3.10.7

Converting between `int` and `str` in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a `ValueError` if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE 2020-10735. This limit can be configured or disabled by environment variable, command line flag, or `sys` APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.

## Notable security feature in 3.10.8

The deprecated `mailcap` module now refuses to inject unsafe text (filenames, MIME types, parameters) into shell commands. Instead of using such text, it will warn and act as if a match was not found (or for test commands, as if the test failed). (Contributed by Petr Viktorin in gh-98966.)

## Notable changes in 3.10.12

### tarfile

- The extraction methods in `tarfile`, and `shutil.unpack_archive()`, have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show a `DeprecationWarning`. In Python 3.14, the default will switch to `'data'`. (Contributed by Petr Viktorin in PEP 706.)